Data Binding 系列(一)概览

590 阅读3分钟

简介

Data Binding 是一个支持库,它使用一种 声明的方式 代替 编码的方式,用来绑定 UI 控件和数据源。

通常我们会在 activity 里面调用 UI 框架层的方法声明 view。例如,下面的代码调用了 findViewById() 声明了一个 TextView 控件,并且把它和 viewModeluserName 属性进行了绑定:

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

下面的代码展示了如何使用 Data Binding 在布局里面直接给 TextViewtest 属性进行赋值。这么做的好处是不必再像上面的例子一样调用 Java 代码。注意在赋值表达式中使用的语法是 @{}

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

在布局里面直接绑定 UI 控件,可以减少在 activity 中 UI 框架方法的调用,这使得代码更加简洁、更容易维护。它还可以提升 App 的性能,避免内存泄漏和空指针异常。

使用

会分下面几个部分来展开介绍 Data Binding

1 环境准备

介绍了如何准备 Data Binding 的开发环境。

2 布局和绑定表达式(binding expression

绑定表达式的使用建立了 view 和变量之间的联系。Data Binding 会自动生成一些类用于绑定 view 和 数据。它提供了诸如 importsvariablesincludes 等在布局中可以直接使用的特性。

这些特性可以和现有的布局很好地共存。比如,可以在绑定表达式中直接使用的变量是定义在 data 元素标签中的,data 元素标签是和布局的根元素标签同级的。它们都是 layout 标签的子元素,如下所示:

<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>

3 可观察的数据(observable data

Data Binding 提供了一些类和方法使得观察数据的变化变得很简单。你大可不必担心数据变化时刷新 UI 的问题。它提供了使对象、字段、集合变得可观察的方法。

4 生成绑定类(binding class

Data Binding 自动生成了一些类用来访问布局变量和 view。这一章会向你展示如何使用和自定义这些生成的绑定类。

5 绑定适配器(binding adapter

对于每一个绑定表达式,都会有相应的绑定适配器调用框架的方法去设置对应的属性或者监听器。比如,绑定适配器会调用 setText() 方法去设置 text 属性,或者调用 setOnClickListener() 方法去设置监听器。常用的一些绑定适配器,比如示例中用于 android:text 属性的绑定适配器,定义在 android.databinding.adapters 包中。你也可以自定义适配器,如下所示:

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

6 绑定 view 和其他架构组件

使用 Data binding 还可以将 view 和其他架构组件绑定,从而简化 UI 的开发。

7 双向数据绑定(two-way data binding

Data binding 支持双向数据绑定。既可以数据变化刷新 view,也可以 view 刷新更新数据。