一.常用控件
常用属性有android:id,android:layout_width,android:layout_height,android:gravity(控件中的内容,比如说文字的对齐方式),android:textSize,android:textColor,android:layout_gravity(当前控件相对父布局的对齐方式),android:layout_weight(控件在父布局中所占的权重),android:background(为布局或控件指定背景),android:layout_margin(外边距),android:padding(内边距)
1.TextView
用于在界面上显示文本。
2.Button
用于和用户交互。系统对Button中的英文字母都是大写,除非使用属性 android:textAllCaps="false" 可以使得其中的英文字母按照原来的大小写显示。
3.EditText
用于和用户交互,允许用户输入和编辑内容。其中 android:hint 属性较为常用,是用来指定一段提示性的文本。android:maxLines 用来指定EditText的最大行数。
4.ImageView
用于在界面上展示图片,其中图片通常放在drawable开头的文件夹下。通过 android:src 属性可以给ImageView指定一张图片。它有一个很重要的属性是 scaleType ,该属性指定图片显示的方式,其中以 fit 开头的共有4种,它们会对图片进行缩放。以 center 开头的有3种,它们会使图片的中心点与ImageView
的中心点重叠,即图片都居中显示。还有一种是 matrix ,它是从ImageView的左上角开始绘制,超出部分做剪切处理。在java代码中可以通过 setImageResource() 给ImageView指定图片。
5.ProgressBar
用于显示一个进度条。通过 style 可以指定不同样式。通过 android:max 可以指定进度条的最大值。通过Android中的可见属性即 android:visibility 来指定控件的可见性,其中有3种选择:visible,invisible和gone。visible表示控件可见,invisible表示控件不可见,但仍然占据原来的位置,gone表示控件不可见,且不占据位置。也可以在java代码中用 setVisibility() 方法设置控件可见性。
6.AlertDialog
在当前界面弹出一个对话框,置于所有界面之上,屏蔽其它控件的交互能力,用于提示重要内容或者警告。实现方式如下所示:
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("Title")
.setMessage("Message")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
通过AlertDialog.Builder创建AlertDialog实例,设置了标题、内容、是否可以通过其它方式取消对话框、确定按钮和取消按钮的点击事件,最后通过show()显示对话框。
7.ListView
https://www.cnblogs.com/896240130Master/p/6135165.html 这里有详细的介绍。现在RecyclerView基本替代了ListView。
8.RecyclerView
1.首先在app/build.gradle中导入支持库:com.android.support:recyclerview-v7:版本号
2.然后在Activity或Fragment的视图中使用代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.在Activity或Fragment中声明RecyclerView的成员变量,然后在Activity的onCreate()通过findViewById(R.id.recycler_view)或者Fragment的onCreateView()先通过View view = inflater.inflate(R.layout.fragment_list,container,false)获取包含RecyclerView的view视图,再通过view.findViewById(R.id.recycler_view)获取实例。
4.在Activity类的onCreate()或Fragment的onCreateView()中设置RecyclerView的LayoutManager。
5.创建RecyclerView的单项视图。(假设其中有两个TextView)
6.实现ViewHolder和Adapter。
定义一个继承自RecyclerView.Adapter<VH>的类,其中VH是该继承类的内部类,其继承了RecyclerView的ViewHolder类,用于保存单项布局中的控件。该继承类要实现RecyclerView.Adapter中的抽象类 ViewHolder onCreateViewHolder、onBindViewHolder和getItemCount。还要实现它的构造器,是用于将数据源传进来。
public class XxxAdapter extends RecyclerView.Adapter<XxxAdapter.ViewHolder>{
// 数据源
private List<Xxx> mXxxList;
static class ViewHolder extends RecyclerView.ViewHolder{
// 声明RecyclerView单项中布局控件,由于假设是两个TextView,所以声明如下:
private TextView t1,t2;
// 创建ViewHolder构造器,传入的参数itemView表示RecyclerView子项的最外层布局
public ViewHolder(View itemView){
super(itemView);
// 获取控件的实例
t1 = (TextView) itemView.findViewById(R.id.t1);
t2 = (TextView) itemView.findViewById(R.id.t2);
}
}
// 创建XxxAdapter构造器,传入的参数表示将数据源传进来
public XxxAdapter(List<Xxx> XxxList){
mXxxList = XxxList;
}
// 实现抽象方法
// 该方法是将RecyclerView的单项布局加载进来,然后创建ViewHolder实例。
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
// 用于对子项的数据进行赋值,在子项滚动到屏幕内执行
@Override
public void onBindViewHolder(@NonNull CrimeHolder holder, int position) {
Xxx xxx = mXxxList.get(position);
holder.t1.setText(xxx.get某属性());
holder.t2.setText(xxx.get某属性());
}
// 返回子项有多少项
@Override
public int getItemCount() {
return mXxxList.size();
}
}
7.在Activity的onCreate()或Fragment的onCreateView()中创建adapter实例mAdapter = new XxxAdapter(传入Xxx的List实例),然后RecyclerView设置Adapter即可。
8.RecyclerView的点击事件
为ViewHolder类添加成员变量mView用来表示子项最外层布局,然后在ViewHolder的构造器中获得其实例,如下所示:
static class ViewHolder extends RecyclerView.ViewHolder{
// 声明mView用来表示子项最外层布局
private View mView;
// 声明RecyclerView单项中布局控件,由于假设是两个TextView,所以声明如下:
private TextView t1,t2;
// 创建ViewHolder构造器,传入的参数itemView表示RecyclerView子项的最外层布局
public ViewHolder(View itemView){
super(itemView);
// 获取View
mView = itemView;
// 获取控件的实例
t1 = (TextView) itemView.findViewById(R.id.t1);
t2 = (TextView) itemView.findViewById(R.id.t2);
}
}
在XxxAdapter的onCreateViewHolder中设置监听器,如下所示:
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
final ViewHolder holder = new ViewHolder(view);
// 这是设置点击整个视图的操作
holder.mView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// 通过holder获取AdapterPosition要求holder定义为final
int position = holder.getAdapterPosition();
Xxx xxx = mXxxList.get(position);
// Toast显示如下,其中onClick中的参数v表示mView
// Toast.makeText(v.getContext(),"",Toast.LENGTH_SHORT).show();
// 跳转到Activity如下
// Intent intent = new Intent(v.getContext(), CrimeActivity.class);
// v.getContext().startActivity(intent);
}
});
// 如果要设置其它的部分,也是类似的操作
..............
return holder;
}
二.常用布局
布局是可以存放控件和布局的容器。
1.LinearLayout:线性布局
线性布局使控件在线性上排列。通过属性 android:orientation 来指定排列方向是 vertical(纵向)和 horizontal(横向)。
2.RelativeLayout:相对布局
相对布局通过相对定位方式来排列控件。其中的属性比较简单,通过字面意思即可理解。
3.FrameLayout:帧布局
该布局中所有的控件都默认摆放在布局的左上角,后编写的xml中的控件在上面。也可以通过 android:layout_gravity 来更改对应控件的位置。
4.ConstraintLayout:约束布局
https://blog.csdn.net/guolin_blog/article/details/53122387 这里有详细的介绍。
三.自定义控件
所有的控件都是直接或间接继承自View,所有布局都直接或间接继承ViewGroup。
方式一:引入布局
将要使用的公共部分单独放置在一个布局文件中比如放置在a.xml布局文件中。
然后再要使用的部分使用 <include layout="@layout/a" /> 即可引入布局。
方式二:创建自定义控件
引入布局能解决重复编写布局代码的问题,但如果其中有控件需要响应事件,还需要在需要使用该控件的所有活动中编写对应的响应事件。所以创建自定义控件能够方便许多。
https://blog.csdn.net/fictionss/article/details/78285167 这里有详细的介绍。