(译) Data Binding 概览

原文链接

数据绑定库是一个支持库,这个库允许你使用声明形式而不是以代码的形式,将布局中的 UI 组件与应用中的数据源绑定起来。

在 activity 中布局通常是以调用 UI 框架方法的代码形式定义的。例如,下述代码,调用了 findViewById() 来查找一个 TextView 组件,并将它与 viewModel 变量的 userName 属性绑定起来:

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

下述的例子中,展示了如何使用数据绑定库在布局文件中,直接将文本赋值给控件。这就避免了调用所有以上 Java 代码。在赋值表达式中,请注意 @{} 的使用:

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

布局文件中的绑定组件,让你从你的 activity 中移除了许多对 UI 框架的调用,使它们的维护更加简易。这也能帮助你提高你的应用的性能,并且对避免内存泄漏和空指针异常也有帮助。

使用数据绑定库

通过以下的文章,来学习如何在你的Android应用中使用数据绑定库。

使用入门

学习如何准备好你的开发环境,让它能使用数据绑定库,包括在 Android Studio 中对数据绑定代码的支持。

布局和绑定表达式

表达式语言允许你写表达式,来将变量和布局中的视图关联起来。数据绑定库自动生成了绑定布局中视图和你的数据对象所需的类。这个库提供了例如 imports,variables 以及 includes 这些你能在布局中使用的部件。

这些库的部件和你已有的布局无缝共存。例如,能在表达式中使用的绑定变量是在 data 元素中定义的,而 data 是 UI 布局根元素的兄弟节点。两者都包含中 layout 标签中,如下例子所示:

1
2
3
4
5
6
7
8
9
10
<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>

使用可观察的数据对象

数据绑定库提供了类和方法,从而能很简单滴使观察数据的变化。当底层的数据源改变时,你不再需要关心刷新用户界面。你可以使你的变量或者它们的属性变成可观察的。这个库能允许你让对象(objects),域(fields),又或是集合(collections)变得可观察。

生成的绑定类

数据绑定库设给你生成了用来访问布局的变量和视图的绑定类。这篇文章向你展示了如何使用和自定义被生成的绑定类。

绑定适配器

对于所有的布局表达式,都存在着一个绑定适配器,这个适配器要做出必要的框架调用,对对应的属性或监听器进行设置。例如,绑定适配器能够调用 setText() 方法来对文本属性进行设置以及调用 setOnClickListener() 方法来为点击事件添加监听器。例如在这个例子中使用的 android:text 属性是最常见的绑定适配器存在于 android.databinding.adapter 包中。想要看绑定适配器的列表,看下adapters 这个页面。你也可以创建自定义的适配器,如下例所示:

1
2
3
4
@BindingAdapter("app:goneUnless")
fun goneUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}

绑定布局视图到架构组件

Android 支持库包含了架构组件,使用架构组件你能够设计强壮的、可测试、可维护的应用。
你可以将架构组件与数据绑定库一同使用来进一步简化 UI 的开发。

双向数据绑定

数据绑定库支持着双向数据绑定。用于此种类型绑定的符号支持接受数据变化到属性的同时也监听用户对属性的更新。

额外的资源

要了解有关数据绑定的更多信息,请参阅以下其他资源。

  • 例子

Android 数据绑定库样例

  • 代码实验室

Android 数据绑定代码试验室

  • 博客

数据绑定- 得到的教训

非典型前端coder wechat
想要随时Follow我的最新博客,可扫码关注我的公众号