3.1.常用控件
TextView:
android:gravity="center"// 居中
android:textSize="24sp" //文字大小
android:textColor="#00ff00" //文字颜色
android:hint="" //内容为空时显示文字信息
android:maxLines="2" //默认最多显示两行
android:lines ="1" //单行显示 第二行代码中的singleline已经过时
android:background="@drawable/dd" //文本框背景图
ImageView:
android:src="@drawable/img_q" //导入drawable下的图片资源
ProgressBar:进度条工具
android:visibility =”visible” //visible , invisible不可见占位置,隐形。 gone彻底消失
也可以在活动中直接使用progressBar.setVisibility(View.VISIBLE);// View.GONE ; View.INVISIBLE
style="?android:attr/progressBarStyleHorizontal" //改变进度条形状,圆形-->水平
AlertDialog 警告对话框
注意:广播中不能直接开启对话框, 同时ProgressDialog和警告对话框差不多
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
eg:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("This is Dialog");
dialog.setMessage("Something important.");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
});
3.2 四大布局
LinearLayout 线性布局基本属性:
android:orientation="vertical" // horizontal 水平 vertical 垂直
android:background="#ffffff" //布局背景
android:gravity="top" // 位置, top, buttom, left , right
子控件可以使用
android:layout_weight="1" //来控制控件所占比例
RelativeLayput 相对布局基本属性:
主要是子布局中多了
android:alignParentRight="true" //相对于母布局在母布局右方
android:alignParentLeft="true" //相对于母布局在母布局左方
android:alignParentBottom="true" //相对于母布局在母布局底方
android:alignParentTop="true" //相对于母布局在母布局上方
android:centerInParent="true" //相对于母布局在母布局中间
android:layout_below="@id/button3" //相对于button3的正上方
android:layout_toRightOf="id/button3" //相对button3来说是右边
FrameLayout 帧布局:
没有方便的定位方式,默认都在布局的左上角
百分比布局
1.要添加依赖库
compile 'com.android.support:percent:25.3.1'
2.更改布局
<android.support.percent.PercentFrameLayout > //需要写完整的包路径
子布局中:
android:layout_gravity=”left|bottom”
app:layout_widthPercent=”50%”
app:layout_heightPercent=”50%”
3.2.1 用布局做标题栏
1.创建一个布局title;
2.引入布局 <include layout="@layout/title" />
3.隐藏原先标题栏
ActionBar actionbar = getSupportActionBar();
if(actionbar != null) {
actionbar.hide();
}
3.2.2 在自制标题栏中加入点击事件,并且任意活动只要调用就都有点击事件。
1.新建TitleLayout类继承LinearLayout,在其中加载布局
2.将布局放入activity_main中
3.再向TitleLayout中添加点击事件
3.3 两大滑动控件(ListView ,RecyclerView)
**ListView** 最常用,也是最容易理解的滑动控件,简单
**RecyclerView** 相比较ListView功能更强大,更加模块化,官方推荐版本,虽不那么容易理解,但已经分类清晰,真做起来还是不难的。RecyclerView除能横向布局以外,还能通过GridLayoutManager和StaggeredGridLayoutManager实现网格布局和瀑布布局。
ListView两个简单实例:
eg:
public class MainActivity extends AppCompatActivity {
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
ListView listView = (ListView) findViewById(R.id.list_item);
FruitAdapter adapter = new FruitAdapter();
listView.setAdapter(adapter);
}
class FruitAdapter extends BaseAdapter {
@Override
public int getCount() { //返回需要显示的条目数量
return 12; //listView.size();
}
@Override
public Object getItem(int position) {
return null; //list.get(position);返回当前的小布局,只为点击事件用
}
@Override
public long getItemId(int position) {
return 0; //position 返回当前的位置,int型 , 只为点击事件用
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view; //手动创建一个滚动文本框
if (convertView != null) { //保证只有固定的实例,其实就是标准写法了。
view = (TextView) convertView;
} else {
view = new TextView(mContext);
}
view.setText("position"+position);
view.setTextSize(40);
return view; //返回相对应需要显示的view
}
}
}
eg: 一个新闻例子
public class NewsAdapter extends ArrayAdapter<NewsBean> {
private int resourseId; //当前布局条名称对应的id,即上个例子中getItemId()方法中得到的值
public NewsAdapter(Context context, int textViewResourseId, List<NewsBean> newsList) { //构造函数,主要给当前布局初始化,也就是得到相对应的资源数据。
super(context, textViewResourseId, newsList);
resourseId = textViewResourseId; //初始化得到的数据id数据。
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
NewsBean newsBean = getItem(position); //相当于上例子中的getItem()得到的值。
View view; //准备得到当前编辑布局的实例
ViewHolder viewHolder;
if (convertView == null) {
//加载布局,得到实例
view = LayoutInflater.from(getContext()).inflate(resourseId, parent, false);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) view.findViewById(R.id.image_view);
viewHolder.title = (TextView) view.findViewById(R.id.title_item);
viewHolder.content = (TextView) view.findViewById(R.id.content_item);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.image.setImageDrawable(newsBean.image);
viewHolder.title.setText(newsBean.title);
viewHolder.content.setText(newsBean.content);
return view;
}
class ViewHolder {
ImageView image;
TextView title;
TextView content;
}
}
两个例子只是单纯的讲述了ListView适配器的建立,其他如资源数据的建立和布局并未多讲。以下总结:
1. 建立ListView布局,和相对应的子布局。
2. 在MainActivity中找到ListView布局,并且建立对象。
3. 得到已经用List集合封装过的数据
___________1) 建立Bean类用做实体。建立对象。
———— 2) 建立Util包,用集合打包所有Bean对象。并且建立方法供给别的地方调用。
4. 建立自己创建的适配器实例。并且传递三个参数,分别是当前活动MainActivity.this(可以放到全局变量
中,使用方便),第二个参数int型的布局id,第三个是List集合封装的数据。
—————1) 适配器中基本都围绕4个方法所得到的数据,getCount,要展示的条目数量; getItem得到资源实例,getItemId当前条目的id,最后一个比较烦的处理getView要展示的布局。
5. List.setAdapter(适配器实例)。
6. listView创建点击事件的监听器,监听器是接口adatpterView下的。
RecyclerView的一个简单例子。
eg: RecyclerView的适配器
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private List<NewsBean> mNewsList;
class ViewHolder extends RecyclerView.ViewHolder{ //定义各个控件,以便存储。
View newsView;
ImageView image;
TextView title;
TextView content;
public ViewHolder(View view) { //在内部类的构造函数中实现对各个控件的查找
super(view);
newsView = view;
image = (ImageView) view.findViewById(R.id.image_view);
title = (TextView) view.findViewById(R.id.title_item);
content = (TextView) view.findViewById(R.id.content_item);
}
}
public NewsAdapter(List<NewsBean> newsList) {
mNewsList = newsList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view, parent, false);
final ViewHolder viewHolder = new ViewHolder(view);
viewHolder.newsView.setOnclickListenter(new View.OnclickListener() {
public void onClick(View v) {
int position = holder.getAdapterPosition();
NewsBean newsBean = mNewsList.get(position);
Toast.makeText(v.getContext, "newsView", Toast.LENGTH_SHORT).show;
}
});
viewHolder.content.setOnclickListenter(new View.OnclickListener() {
public void onClick(View v) {
int position = holder.getAdapterPosition();
NewsBean newsBean = mNewsList.get(position);
Toast.makeText(v.getContext, "content", Toast.LENGTH_SHORT).show;
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
NewsBean newsBean = mNewsList.get(position);
holder.image.setImageDrawable(newsBean.image);
holder.title.setText(newsBean.title);
holder.content.setText(newsBean.content);
}
@Override
public int getItemCount() {
return mNewsList.size();
}
}
在MainActivity中的代码如下:
public class MainActivity extends AppCompatActivity {
private List<NewsBean> newsList;
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_on);
newsList = NewsUtil.getAllNews(mContext);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
NewsAdapter newsAdapter = new NewsAdapter(newsList);
recyclerView.setAdapter(newsAdapter);
}
}
Recycler View的总结:
1. 相比较ListView而言,功能更加强大,可以实现内容和标题的分别点击,更加模块化,也更加的直观。
2. 因为是后继出现的功能,首先要添加依赖库,并且布局中要写全名。
2. 同样定义一个内部类继承自Recycler.ViewHoler,实现对控件的存储,然后用构造函数初始化控件。
3. 在NewsAdapter的构造函数中实现资源数据的接收和初始化。
4. onCreateViewHolder 如字面意思,创建一个当前的布局实例和内部类实例,并且返回内部类实例
5. onBindViewHolder 如字面意思,绑定控件和资源数据。
6. getItemCount 如字面意思,得到需要展示的项目条行数。