findViewById已经困扰了Android开发者很多年,期间我们使用过ButterKnife,也使用过DataBinding,来代替fvbi。终于,我们又双叕迎来了一位挑战者——ViewBinding。
谷歌对于ViewBinding的说明:
通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
在大多数情况下,视图绑定会替代
findViewById
。
要使用ViewBinding,需要将Android Studio升级到3.6+版本,同时需要的Gradle版本为3.6.0+。
现在就让我们开始使用吧!
首先需要在模块(Module)的build.gradle
中添加如下代码:
android{ ...... viewBinding{ enabled = true } }
为这个模块启用ViewBinding之后,这个模块下的每一个XML文件会自动生成一个绑定类。
绑定类使用驼峰命名法,加Binding结尾。比如,XML文件名为:activity_main.xml
<LinearLayout ... > <TextView android:id="@+id/name" /> <ImageView android:cropToPadding="true" /> <Button android:id="@+id/button" android:background="@drawable/rounded_button" /> </LinearLayout>
则生成的绑定类名称为:ActivityMainBinding
。这个类会生成对应着布局文件内控件的字段:button
与name
,由于ImageView
没有ID,所以不会生成对应的字段。
每个绑定类还包含一个 getRoot()
方法,提供为布局文件的根视图的直接引用。在此示例中,ActivityMainBinding
类中的 getRoot()
方法会返回 LinearLayout
根视图。
在Activity中使用ViewBinding
我们通常设置布局文件是通过setContentView("layoutId")
,但是使用了ViewBinding后,我们可以通过binding
对象,调用生成的绑定类中包含的静态 inflate()
方法。此操作会创建该绑定类的实例以供 Activity 使用。
使用ViewBinding在onCreate()
方法里进行设置layout:
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view);
我们可以直接使用绑定类的binding
对象自动生成的button
和name
字段来引用视图:
binding.getName().setText("name"); binding.button.setOnClickListener(new View.OnClickListener() { click(); });
Tips:
找不到自动生成的Binding类?试试Rebuild/Clean Project大法。
或者点击:
总结
1、启用ViewBinding。
2、调用生成的绑定类中包含的静态 inflate()
方法,创建该绑定类的实例,以供 Activity 使用。
3、使用getRoot()
来直接引用根布局,或者使用对应着控件ID的字段来直接引用控件。
参考文档:
谷歌官方文档:关于视图绑定
叨叨几句... NOTHING