Android|Jetpack 系列之替换代替ButterKnife的全新视图工具 ViewBinding的使用详解

在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的使用详解】

    推荐阅读