Data Binding
是一个支持库,它使用一种 声明的方式 代替 编码的方式,用来绑定 UI 控件和数据源。android
一般咱们会在 activity 里面调用 UI 框架层的方法声明 view。例如,下面的代码调用了 findViewById()
声明了一个 TextView
控件,而且把它和 viewModel
的 userName
属性进行了绑定:express
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
复制代码
下面的代码展现了如何使用 Data Binding
在布局里面直接给 TextView
的 test
属性进行赋值。这么作的好处是没必要再像上面的例子同样调用 Java 代码。注意在赋值表达式中使用的语法是 @{}
:架构
<TextView
android:text="@{viewmodel.userName}" />
复制代码
在布局里面直接绑定 UI 控件,能够减小在 activity 中 UI 框架方法的调用,这使得代码更加简洁、更容易维护。它还能够提高 App 的性能,避免内存泄漏和空指针异常。app
会分下面几个部分来展开介绍 Data Binding
。框架
介绍了如何准备 Data Binding
的开发环境。less
binding expression
)绑定表达式的使用创建了 view 和变量之间的联系。Data Binding
会自动生成一些类用于绑定 view 和 数据。它提供了诸如 imports
、variables
、includes
等在布局中能够直接使用的特性。布局
这些特性能够和现有的布局很好地共存。好比,能够在绑定表达式中直接使用的变量是定义在 data
元素标签中的,data
元素标签是和布局的根元素标签同级的。它们都是 layout
标签的子元素,以下所示:post
<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>
复制代码
observable data
)Data Binding
提供了一些类和方法使得观察数据的变化变得很简单。你大可没必要担忧数据变化时刷新 UI 的问题。它提供了使对象、字段、集合变得可观察的方法。性能
binding class
)Data Binding
自动生成了一些类用来访问布局变量和 view。这一章会向你展现如何使用和自定义这些生成的绑定类。编码
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
}
复制代码
使用 Data binding
还能够将 view 和其余架构组件绑定,从而简化 UI 的开发。
two-way data binding
)Data binding
支持双向数据绑定。既能够数据变化刷新 view,也能够 view 刷新更新数据。