1、概述
使用ViewBinding后,系統(tǒng)會自動為每一個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中可以引用對應(yīng)布局的ViewBinding類。ViewBinding類是由系統(tǒng)自動生成的,命名規(guī)則為:
1、布局文件名稱activity_main.xml
2、去掉中間的下劃線activitymain
3、變成駝峰命名ActivityMain
4、加上一個Binding,得到ActivityMainBinding

2.2.2 設(shè)置綁定類的實例
1 、調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會創(chuàng)建該綁定類的實例以供 Activity 使用
2、 通過調(diào)用 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 通過綁定類調(diào)用控件
在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中類似,實現(xiàn)代碼如下:

2.3.2 設(shè)置綁定類的實例
在Fragment類的onCreateView()中,進行如下修改:
1、調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法
2、通過調(diào)用 getRoot() 方法獲取對根視圖的引用
3、從 onCreateView() 方法返回根視圖,使其成為屏幕上的活動視圖
對應(yīng)代碼如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentBlankBinding.inflate(inflater, container, false);
return binding.getRoot();
}
2.3.3 通過綁定類調(diào)用控件
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 創(chuàng)建布局文件
1、創(chuàng)建一個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中設(shè)置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;
}
}
}