在Android开发中,基于获取布局控件findViewById的问题,有一些框架来避免我们重复无意义的操作。但是随着Android系统的升级,诸如一些ButterKnife之类的流行库也随之停止更新。当然也出现了一些新的方便我们使用的框架,比如Google提供的Jetpack系列中的ViewBinding。
配置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的使用
对于 ViewBinding 的使用我们从Activity、Fragment、Adapter等方面。
当然ViewBinding 不管在哪里使用都是很简单,当我们配置完成后Android Studio都会自动为我们的每一个布局文件对应的Binding类。而生成Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。
比如说,我们定义了一个activity_main.xml布局,那么与它对应的Binding类就是ActivityMainBinding。
当然,我们有些布局文件不希望生成对应的Binding类,则可以在该布局文件的根元素位置加入如下声明:
...
在 Activity 中使用视图绑定
我们的布局文件如图所示:
那么在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 中使用视图绑定
在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中使用视图绑定
在Adapter适配器中使用也只需要根据布局文件生成的Binding文件就可以了,只是在ViewHolder 中传值要注意如图所示:
@Override
public TokenRecyclerView.RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerItemAuthMangerBindingbinding = 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 RecyclerItemAuthMangerBindingbinding) {
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 系列的第一篇,之后会有更多功能介绍给大家,一起学习进步!!!
【Android|Jetpack 系列之替换代替ButterKnife的全新视图工具 ViewBinding的使用详解】
推荐阅读
- 详细实例教程!集成华为虚假用户检测,防范虚假恶意流量
- Android|44岁万达女高管跳楼(摧毁一个中年人有多容易!)
- android|本来打算年前离职,但是昨天的一次 Android 面试让我心好累……我迷茫了
- android|android ffmpeg rtmp,Android利用ffmpeg产生推流
- 什么是原创(独立完成就是原创吗?)
- android|壁纸服务的启动过程
- 最全的 Android 之 Dialog
- Android|简直离谱!字节面了5轮,4轮都让我分析 Android Framework 层的源码
- 常见问题|Android studio R8 编译报错