在Android开发中,基于获取布局控件findViewById的问题,有一些框架来避免我们重复无意义的操作。但是随着Android系统的升级,诸如一些ButterKnife之类的流行库也随之停止更新。当然也出现了一些新的方便我们使用的框架,比如Google提供的Jetpack系列中的ViewBinding。
ViewBinding的作用非常简单,就是为了避免编写findViewById,并且配置工作也非常简单。如果你的Android studio 版本是在 3.6或者更高那么你就可以使用它。
只需要在你的工程模块的build.gradle中加入以下配置:
// Android studio 版本是在 3.6 及以上版本
android {
// 需要 Android Gradle Plugin 3.6.0
viewBinding {
enabled = true
}
}
//Android Studio 版本是在 4.0 及以上版本
android {
buildFeatures {
viewBinding true
}
}
这样准备工作就做完了,就可以在项目中使用了。
对于 ViewBinding 的使用我们从Activity、Fragment、Adapter等方面。
当然ViewBinding 不管在哪里使用都是很简单,当我们配置完成后Android Studio都会自动为我们的每一个布局文件对应的Binding类。而生成Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。
比如说,我们定义了一个activity_main.xml布局,那么与它对应的Binding类就是ActivityMainBinding。
当然,我们有些布局文件不希望生成对应的Binding类,则可以在该布局文件的根元素位置加入如下声明:
...
我们的布局文件如图所示:
那么在Activity界面我们只需要获取他的Binding文件就可以正常使用了,如图所示:
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
binding.name.setText("Hello World!");
binding.button.setOnClickListener(new View.OnClickListener() {
});
}
在fragment模块中使用也是一样,通过获取根据布局文件生成的Binding文件就可以正常使用,如图所示:
private FragmentMainBinding binding;
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentMainBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
在Adapter适配器中使用也只需要根据布局文件生成的Binding文件就可以了,只是在ViewHolder 中传值要注意如图所示:
@Override
public TokenRecyclerView.RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerItemAuthMangerBinding binding = RecyclerItemAuthMangerBinding.inflate(LayoutInflater.from(parent.getContext()) , parent, false);
// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_auth_manger, parent, false);
RecyclerViewHolder viewHolder = new RecyclerViewHolder(binding);
return viewHolder;
}
public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
//之前的写法
//public ViewHolder(@NonNull View itemView) {
// super(itemView);
// mTextView = itemView.findViewById(R.id.tv_include);
//}
//使用ViewBinding的写法
public RecyclerViewHolder (@NonNull RecyclerItemAuthMangerBinding binding) {
super(binding.getRoot());
mTextView = binding.tvInclude;
}
}
以上基本上就在开发中可以正常使用了,当然还有一些如引入布局include和merge的特殊使用。
首先是 include布局,我们只需要在include的时候给被引入的布局设置一个id,那么我们在使用的时候就可以直接通过这个ID来调用include布局的控件名称,如图所示:
// include布局被引用的配置
// 使用时直接通过引用时的命名ID来使用
binding.includeid.title.text = "Title"
binding.includeid.button.setOnClickListener {
}
然后对于merge布局,这种方式就不是简单的引用了,因为merge是去除一层布局嵌套的,没有一个布局包裹。所以我们要通过把merge布局绑定的方式添加到主体布局中方便我们使用,如图所示:
ActivityMainBinding binding = ActivityMainBinding.inflate(layoutInflater)
//把引用的merge布局绑定到引用的布局中去
TitlebarBinding titlebarBinding = TitlebarBinding.bind(binding.root)
setContentView(binding.root)
titlebarBinding.title.text = "Title"
titlebarBinding.back.setOnClickListener {
}
这样,关于 ViewBinding 的使用就介绍完了。
这是 Jetpack 系列的第一篇,之后会有更多功能介绍给大家,一起学习进步!!!