Jetpack 之 Databinding

Databinding 是一个用于将布局中的控件与数据源直接关联绑定的支持库,它替代了传统的 findViewById 以及代码设置控件的内容值的方式。这样做的好处显而易见,Activity/Fragment 上就没有了一堆控件代码,官方还说提高了性能,避免了内存泄漏和空指针,总之是值得推荐的。

怎么上手

最近项目里也是用上了 Databinding,不过其实也只用了布局那部分,并没有用到数据映射(这部分还要再了解了解)。

不像其他依赖库,它集成在 Android Gradle plugin 里,所以只要插件版本高于 1.5.0(包含 1.5.0)即可使用,可运行的系统版本为 Android 4.0 及以上。

android {
    //官方文档让这么配置,但是前提是项目根目录下的 build.gradle 中的 gradle 插件版本够新
    //新到什么程度呢?最好是最新版,要不然也得 4.0.0 以上,我没有测试成功,因为项目中版本是3.6.3
    //然后我这么用就报错了,参考了这个https://github.com/stripe/stripe-terminal-android/issues/90 发现可能是 gradle 插件版本问题
    buildFeatures {
        dataBinding true
    }
    //如果上面方式报错,就用下面这种方式,二选一
    dataBinding {
        enabled = true
    }
}

配置编译完就可以在 xml 布局中使用了,需要注意的一点是xml文件的根节点需要以 layout 标签开头,这和原来的布局文件有区别,以前是直接具体某个布局控件,现在相当于又多了一层,在新建布局文件时,是可以指定根布局为 layout 标签的,这样用起来和以前就没差别了。

//在 layout 为根节点的基础上,首先需要用 data 标签定义数据

    
    //如果配置正确,上面的 type 赋值可以根据引导一步步点出来,不用自己手打

//定义好数据变量之后,就可以像下面这样使用,具体表达格式为 @{},
//还有很多具体的语法可以参考官方文档 https://developer.android.com/topic/libraries/data-binding/expressions

现在布局差不多设置好了,接下去就是要让实际数据源更新到布局控件上展示出来。这里有个概念就是 Binding 类,在代码中要想使用 Databinding,就要通过 Binding 类,而 Binding 类是根据相对应的布局文件自动生成的,例如布局文件叫 activity_main.xml 那么这个 Binding 类就叫 ActivityMainBinding。那要怎么获取到相应对象呢?

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//像这样等价代换 Activity 的 onCreate 方法里的 setContentView(R.layout.activity_main);
//也就是说用来 DataBinding 就不像原来那样设置布局页面了。

有了 Binding 类对象后就可以给布局文件里定义的数据变量赋值了,赋值之后自然相关控件的内容也就跟着改变了。

在项目的实际使用上,我们常见的 Activity, Fragment, RecyelerView 的适配器上,Dialog, PopupWindow 都能用,在 ButterKnife 不再推荐使用的当下,可谓是非常方便。

另外和 Databinding 相关的一个概念叫 View Binding,区别在于如果仅是用于替代 findViewById 的工作,就可以用 View Binding,而不必要用 Databinding。同时 View Binding 也是 ButterKnife 的替代方案,在 ButterKnife 的官网上也注明,不再维护,而是推荐 View Binding。那么问题来了,怎么看 View Binding 都会被 Databinding 给取代的感觉,为什么还要留着它呢?

参考文档

Databinding 官方文档

你可能感兴趣的:(Jetpack 之 Databinding)