AndroidStudio 3.6: new feature —— View Binding视图绑定

View Binding视图绑定:

AS3.6的新特性。2020年2月推出(去年的beta版已经有了)。

其作用:更加安全、方便的去访问界面UI对象。

以前,用java是findViewbyid().

当控件很多的时候,就很繁琐了。当然可以使用ButterKnife。

当kotlin出现后,可以使用kotlin编写的android项目在app/build.gradle文件的头部默认引入了一个kotlin-android-extensions插件,会根据布局文件的控件Id自动生成一个具有相同名称的变量,可以在activity中直接使用这个变量,不用调用findViewById().

但是需要明白的是 kotlin-android-extensions插件背后也是通过findViewById()来实现的。

ViewBinding启用后,id在构建的时候会自动生成binding的对象,这个对象里面的成员/域就是这些控件,可以通过域每个控件都可以得到访问,且不会出现空指针异常。

ViewBinding可以被认为是Data Binding的轻量版,因为ViewBinding不需要动layout文件,构建的更快,它会做单向的绑定,而不是双向的绑定。

如果使用kotlin的话,kotlin本身有个扩展Kotlin Synthetics,可以直接通过id访问这些控件,但是这个特性有不安全的因素,因为其范围比较大,是全局的,可能导致在某个Layout中错误的引用到另外一个layout中的对象,这样还是会出现空指针异常。


案例看它的使用方法:

因为ViewBinding在java中更加有用,所以这里演示java版的。

 

以上是传统的访问方法,很不优雅。

 

启用viewBinding:

sync好后,它就帮我们构建好了一个Binding对象。

生成的类和databinding规则一样,不再赘述。

getLayoutInflater()不需要传递布局文件名,因为这个已经在启用的时候根据layout文件已经确定了是哪个layout文件,所以不需要传递layout名称。

使用方法依次类推。

如果出错,rebuild一下。

如果此时添加一个新的控件,viewBinding也可以立即重新反应出来而不需要我们手动build:

在fragment中使用viewbinding:

使用引导创建一个fragment,因为上面中已经启用了viewbinding,所以此时创建的fragment也会构建出对应的binding对象。

 


在kotlin下:

目前是正常的。但是是有隐患的。

假如说有另一个布局文件:

 

可以看到访问2个textview3,虽然说明了来自哪个文件,但是如果不小心搞错了使用了不是本activity对应的布局文件的textview3:

就会发现运行后崩溃。

这就是全局的弊端。造成了空指针。

所以官方建议viewBinding取代这种方式:

 fragment中一样。。。不再赘述。