丢掉findViewById!拥抱ViewBinding!

发布于 2020-07-01  179 次阅读


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。这个类会生成对应着布局文件内控件的字段:buttonname,由于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对象自动生成的buttonname字段来引用视图:

binding.getName().setText("name");
binding.button.setOnClickListener(new View.OnClickListener() {
    click();
});

 

Tips:

找不到自动生成的Binding类?试试Rebuild/Clean Project大法。

或者点击:

 

 总结

1、启用ViewBinding。

2、调用生成的绑定类中包含的静态 inflate() 方法,创建该绑定类的实例,以供 Activity 使用。

3、使用getRoot()来直接引用根布局,或者使用对应着控件ID的字段来直接引用控件。


参考文档:
谷歌官方文档:关于视图绑定


有的人25岁就死了,只是75岁时才埋进土里。