Jetpack 之 Databinding

关于DataBinding

解释

DataBinding 是一个支持库,允许使用声明格式(而不是编程方式)将布局中的UI组件绑定到应用程序中的数据源。

问题描述

布局通常在 Activity 中定义。例如,下面的代码调用findViewById()查找TextView并将其绑定到 viewModel 变量的 userName 属性:

1
2
3
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}

以下示例说明如何使用 DataBinding 直接在布局文件中将 text 赋值为 viewmodel.userName。这消除了上面显示调用任何Java代码的需要。注意@{}在赋值表达式中使用语法:

1
2
<TextView
android:text="@{viewmodel.userName}" />

优点

在布局文件中进行数据绑定可以删除在 Activity 中许多的UI框架调用,使其更简单,更易于维护。这还可以提高应用程序的性能,并有助于防止内存泄漏和空指针异常。

缺点

当然任何东西都不是完美无缺的,DataBinding 在使用的时候,因为 APT 会帮助我们生产很多中间模板代码,所在开发调试过程中、以及线上问题跟踪时,有可能定位不到准确的错误点。当然,你要是熟练使用 DataBinding 的话,这些缺点在优点面前就显得微不足道了。所以在这里还是要墙裂推荐这个库的使用。能大量减少繁琐的模板代码。

环境配置

  • 仅支持 Android 4.0(API级别14)或更高版本的设备。
  • 推荐使用最新的 Gradle 插件版本 Android Plugin。因为 DataBinding 支持 1.5.0 或更高版本。

设置构建环境

在 moudule 级别的 build 脚本中,adnroid 节点下配置如下:

1
2
3
4
5
6
android {
...
dataBinding {
enabled = true
}
}

Android Studio 支持数据绑定

Android Studio支持许多用于数据绑定代码的编辑功能。例如,它支持数据绑定表达式的以下功能:

  • 语法突出显示
  • 标记表达式语言语法错误
  • XML代码补全
  • 如果使用了 Navigation,那么在视图设计中可以直接预览默认值效果:

    1
    2
    3
    <TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.firstName, default=my_default}"/>

    如果只需要在项目的设计阶段显示默认值,则可以使用tools属性而不是默认表达式值。

在布局中使用

编写布局文件并绑定表达式

1
2
3
4
5
6
7
8
9
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>

如上所示,不同于以往的常规布局方式,在最外层嵌套了一个 layout ,然后下面有一个 data 节点,再下面一个节点才是我们以往的布局根节点。

其中,data 节点下可以做很多事情,包括:

  • 数据声明

  • 使用 import 导包

在根布局节点下面,可以直接使用 data 中声明的变量、使用表达式等很多强大的功能。

使用可观察数据对象

DataBinding 提供了一些列的类和方法,可以轻松地观察数据变更以进行 UI 更改。不再担心在基础数据源发生更改时需要手动刷新UI。您可以观察变量或其属性。该库允许您使对象,字段或集合可观察。

生成绑定数据类

  • DataBinding 生成用于访问布局中变量和视图的绑定类。

  • 生成的绑定类将布局变量与布局中的视图链接起来,绑定类的名称和包可以自定义。

  • 所有生成的绑定类都继承自 ViewDataBinding类。

  • 默认情况下,生成绑定数据类的名称基于布局文件的名称,将其转换为Pascal大小写并向其添加Binding后缀。

    例如 activity_main.xml 生成的目标类名是:ActivityMainBinding

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!