一、常用控件
①、TextView
用来显示文本信息:
android:gravity,指定文字对齐方式
android:textSize,指定文字大小
android:textColor,指定文字颜色
②、Button
android:text,指定按钮上的文字,默认所有英文字母大写显示,可以通过android:textAllCaps来修改
③、EditText
android:hint,指定一段提示性文字,当没有输入时显示
android:maxLines,指定最大行数,当输入内容超过此行数时,文本会向上滚动
getText(),获得内容
④、ImageView
android:src指定图片位置
setImageResource(R.drawable.img),改变图片内容
⑤、ProcessBar
android:visibility,控制控件的可见属性,所有控件都有此属性,其值有3种:visible、invisible、gone。visible是默认属性,invisible表示不可见,但仍然占据原来的位置,gone表示不可见,且不占用屏幕空间
style="?android:attr/progressBarStyleHorizontal",将进度条设置为水平型,此时可以通过android:max设置进度条最大值,然后通过setProgress()改变进度条最大值
setVisibility(),设置可见性,其参数可以为View.VISIBLE、View.INVISIBLE、View.GONE
⑥、AlertDialog
在当前界面弹出一个对话框,此对话框置于所有控件之上,可以屏蔽掉其他控件交互能力
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(
view->{
AlertDialog.Builder dialog=new AlertDialog.Builder(this);//创建AlertDialog实例
dialog.setTitle("the dialog");//设置标题
dialog.setMessage("the information");//设置内容
dialog.setCancelable(false);//设置返回键是否可以关闭
dialog.setPositiveButton("OK",(DialogInterface di,int i)->{});//点击确定按钮事件
dialog.setNegativeButton("Cancel",((dialogInterface, i) -> {}));//点击取消按钮事件
dialog.show();//显示对话框
}
);
}
二、基本布局
1、LinearLayout
将包含的控件在线性方向上排列
android:orientation,指定排列方向,可以选择vertical和horizontal
android:layout_gravity,控件的属性,指定该控件的对齐方式,要配合排列方向使用
android:layout_weight,控件的属性,通过比例指定该控件的大小,系统会按该控件大小与所有控件大小之和的比例为其设置大小。当指定此属性时,控件在排列方向上的长度就不受android:layout_width或android:layout_height控制,可以将其设置为0dp
2、RelativeLayout
通过相对定位的方式让控件出现在布局上
①、相对父布局
android:layout_alignParentLeft、android:layout_alignParentTop、android:layout_alignParentRight、android:layout_alignParentBottom、android:layout_centerInParent
②、相对控件
androif:layout_above、android:layout_below、android:layout_toLeftOf、android:layout_toRightOf,要将参照控件定义在前面
android:layout_alignLeft、android:layout_RightLeft,表示和参照控件边缘对齐
3、FrameLayout
所有控件都默认摆在左上角
4、百分比布局
以上3个布局中,只有LinearLayout可以按比例指定控件大小,所以系统提供了PercentRelativeLayout和PercentFrameLayout这2个布局。为了使用这2个布局,需要在build.gradle中添加依赖。
app:layout_widthPercent、app:heightPercent,需要先定义app命名空间
三、自定义控件
1、引入布局
通过就可以引入该id的布局
2、创建控件
public class MyLayout extends LinearLayout {//继承LinearLayout
public MyLayout(Context context, @Nullable AttributeSet attrs) {//在布局中引入MyLayout就会调用这个这个构造方法
super(context, attrs);
//先构建一个KayoutInflater对象,然后通过inflate动态加载一个布局文件,其第1个参数布局文件,第2个参数为父布局
LayoutInflater.from(context).inflate(R.layout.thelayout,this);
//为按钮添加事件,所有使用此布局的按钮均已添加了该事件
Button bt=(Button)findViewById(R.id.button);
bt.setOnClickListener(
view -> {
((Activity)getContext()).finish();//先获得上下文,即使用此布局的活动,然后结束它
}
);
}
}
四、ListView
1、使用系统的适配器和布局文件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listviewlayout);
String[] data={"1","2","3"};//定义一些数据
//构建一个适配器,第1个参数为上下文,第2个参数为项目布局文件,第3个参数为数据
ArrayAdapter<String> adapter =new ArrayAdapter<String >(this,android.R.layout.simple_list_item_1,data);
ListView listView=(ListView)findViewById(R.id.list_view);
listView.setAdapter(adapter);//为ListView设置适配器
}
2、自定义ListView
①、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
②、子项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
③、适配器
public class ListAdapter extends ArrayAdapter<String> {
int resId;
public ListAdapter(@NonNull Context context, int resource, String[] data) {
super(context, resource,data);
resId=resource;
}
//子项进入屏幕时调用
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
String str=getItem(position);
//加载子项布局
View view= LayoutInflater.from(getContext()).inflate(resId,parent,false);
//显示内容
TextView textView=view.findViewById(R.id.list_text);
textView.setText(str);
return view;
}
}
④、使用ListView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listviewlayout);
String[] data={"1","2","3"};//定义一些数据
//使用自定义适配器,并将上下文、子项布局、数据传入
ListAdapter adapter =new ListAdapter(this,R.layout.list_item,data);
ListView listView=(ListView)findViewById(R.id.list_view) ;
listView.setAdapter(adapter);
}
3、添加监听器
listView.setOnItemClickListener(
(AdapterView<?> parent, View view,int position,long id)->{
String str=data[position];//获得该子项内容
Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
}
);
五、RecyclerView
1、依赖
implementation "androidx.recyclerview:recyclerview:1.0.0"
implementation "androidx.recyclerview:recyclerview-selection:1.0.0"
2、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
3、子项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/recycler_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
4、适配器
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private String[] data;
//通过内部类获取textView实例
static class ViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public ViewHolder(View view){
super(view);
textView=(TextView)view.findViewById(R.id.recycler_text);
}
}
//通过构造方法传入数据
MyAdapter(String[] data){
this.data=data;
}
//创建ViewHolder实例
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
//在子项进入屏幕时执行此方法
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
String str=data[position];
((ViewHolder)holder).textView.setText(str);//设置子项内容
}
//子项数目
@Override
public int getItemCount() {
return data.length;
}
}
5、使用RecyclerView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler);
String[] data={"1","2","3"};//定义一些数据
MyAdapter adapter=new MyAdapter(data);
//创建布局管理器
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(linearLayoutManager);
}
6、其他布局方式
①、横向布局
linearLayoutManager.setOrientation(linearLayoutManager.HORIZONTAL);
默认是纵向布局,可以更改
②、网格布局
使用GridLayoutManager
//使用网格布局管理器,并设置为2列
GridLayoutManager gridLayoutManager=new GridLayoutManager(this,2);
recyclerView.setLayoutManager(gridLayoutManager);
③、瀑布流布局
使用StaggeredGridLayoutManager
//使用瀑布流布局,并设置为2列,当排列方向为水平时,就是2行
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
7、点击事件
不同于ListView,RecyclerView需要手动给具体的子项注册点击事件
修改MyAdapter的onCreateViewHolder()
//创建ViewHolder实例
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
view.setOnClickListener(
v-> {
int position=viewHolder.getAdapterPosition();
Toast.makeText(parent.getContext(),data[position],Toast.LENGTH_SHORT).show();
}
);
return viewHolder;
}