​ View Binding是一种功能,允许开发者更容易的编写与视图交互的代码。

​ 一旦在一个模块中启用了View Binding,它就会为该模块中存在的每个XML布局文件生成一个绑定类

如何启用View Binding

​ 在build.gradle的android{}中添加代码

buildFeatures{
viewBinding true
}

如何使用View Binding

在Activity中使用View Binding

private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
ActivityMainBinding mainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
}

然后就可以使用binding对象来访问视图

binding.textview.text = "hello world"
mainBinding.textview.setText("hello world");

在Fragment中使用View Binding

private lateinit var binding: FragmentBlankBinding

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentBlankBinding.inflate(layoutInflater)
return binding.root
}
private FragmentMainBinding fmBinding;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fmBinding = FragmentMainBinding.inflate(inflater,container,false);
//在这里写界面逻辑等
return fmBinding.getRoot();
}
//在onDestroyView()中清理Binding对象防止内存泄漏
@Override
public void onDestroyView() {
super.onDestroyView();
fmBinding = null;
}

然后就可以像在Activity中一样去使用它了

在RecycleViewAdapter中使用View Binding

//使用binding class作为root layout
class ViewHolder(var viewBinding: MainlistItemBinding):RecyclerView.ViewHolder(viewBinding.root) {
}
//inflate内容并返回viewholder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = MainlistItemBinding.inflate(LayoutInflater.
from(parent.context),parent,false)
return ViewHolder(binding)
}
//在onBindViewHolde中直接使用
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val mainlistItemBinding = holder as MainlistItemBinding
val fruit = fruitList[position]
mainlistItemBinding.fruitname.text = fruit.name
}
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
@NonNull
@NotNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
return new MainViewHolder(MainrecyItemBinding.
inflate(LayoutInflater.from(parent.getContext())
,parent,false));
}

@Override
public void onBindViewHolder(@NonNull @NotNull MainViewHolder holder, int position) {

}

@Override
public int getItemCount() {
return 0;
}

public class MainViewHolder extends RecyclerView.ViewHolder {
//MainrecyItemBinding为该recyclerview的子控件
MainrecyItemBinding mrBinding;
public MainViewHolder(MainrecyItemBinding itemBinding) {
super(itemBinding.getRoot());
this.mrBinding = itemBinding;
}
}
}

在使用<include>时使用viewBinding

include标签下必须添加id

<include android:id="@+id/titlebar" 
layout="@layout/titlebar" />

java代码中表示为:

ActivityMainBinding.titlebar.xxxbtn

来获取<include>中的控件