1、概述
使用ViewBinding后,系统会自动为每一个xml布局文件生成一个绑定类,通过这个绑定类的实例,可以引用布局里面的控件,在编写代码时可以用ViewBinding替代findViewById,让我们编写代码更方便。接下来,将分别介绍如何在Activity、Fragment、RecyclerView的自定义Adapter中使用ViewBinding
2、使用
2.1 打开配置
在app/build.gradle
中,打开ViewBinding的配置,再点击Sync Now进行同步
viewBinding {
enabled true
}
2.2 在Activity中使用
2.2.1 在Activity中添加ViewBinding类
在Activity中可以引用对应布局的ViewBinding类。ViewBinding类是由系统自动生成的,命名规则为:
1、布局文件名称activity_main.xml
2、去掉中间的下划线activitymain
3、变成驼峰命名ActivityMain
4、加上一个Binding
,得到ActivityMainBinding
2.2.2 设置绑定类的实例
1 、调用生成的绑定类中包含的静态 inflate()
方法。此操作会创建该绑定类的实例以供 Activity 使用
2、 通过调用 getRoot()
方法获取对根视图的引用
3、 将根视图传递到 setContentView()
,使其成为屏幕上的活动视图
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
}
2.2.3 通过绑定类调用控件
在Activity的布局文件activity_main.xml
中,有一个id为textView的TextView控件
在MainActivity
可以通过binding.textView
来操作TextView
这个控件,代码如下:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.textView.setText("Hello ViewBinding");
}
}
运行效果如下图:
2.3 在Fragment中使用
2.3.1 在Fragment中添加ViewBinding类
在Fragment添加绑定类的方式和在Activity中类似,实现代码如下:
2.3.2 设置绑定类的实例
在Fragment类的onCreateView()
中,进行如下修改:
1、调用生成的绑定类中包含的静态 inflate()
方法
2、通过调用 getRoot()
方法获取对根视图的引用
3、从 onCreateView()
方法返回根视图,使其成为屏幕上的活动视图
对应代码如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentBlankBinding.inflate(inflater, container, false);
return binding.getRoot();
}
2.3.3 通过绑定类调用控件
Fragment的布局文件 fragment_blank.xml
中,有一个id为textView的TextView控件
在Fragment的onCreateView
方法中,可以通过 binding.textView
来操作这个控件,代码如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentBlankBinding.inflate(inflater, container, false);
binding.textView.setText("在Fragment中使用ViewBinding");
return binding.getRoot();
}
运行效果如下图:
2.4 在RecyclerView的自定义Adapter中
2.4.1 创建布局文件
1、创建一个RecyclerView的Holder布局文件,布局文件名称为cell.xml
,其中只有一个id为item的TextView控件
2、修改Fragment的布局文件,加入RecyclerView
2.4.2 自定义RecyclerView的Adapter类,在里面使用ViewBinding
1、修改MyViewHolder
的 onCreateViewHolder
方法,加入绑定类
原始代码:
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
修改后:
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
return new MyViewHolder(binding);
}
2、修改MyAdapter
的onCreateViewHolder
方法
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
return new MyViewHolder(binding);
}
3、修改MyAdapter
的onBindViewHolder
方法
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.binding.item.setText("test");
}
4、在Fragment
中设置RecyclerView
的LinearLayoutManager
和Adapter
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentBlankBinding.inflate(inflater, container, false);
binding.textView.setText("在Fragment中使用ViewBinding");
binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
binding.recyclerView.setAdapter(new MyAdapter());
return binding.getRoot();
}
运行效果如下图:
5、自定义Adapter的完整代码如下:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private CellBinding binding;
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
return new MyViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.binding.item.setText("test");
}
@Override
public int getItemCount() {
return 1;
}
static class MyViewHolder extends RecyclerView.ViewHolder {
private CellBinding binding;
public MyViewHolder(@NonNull CellBinding itemView) {
super(itemView.getRoot());
binding = itemView;
}
}
}