Data Binding库支持使用声明性格式而不是以编程方式将layout中的UI组件绑定到应用程序中的数据源。
我们通常在Activity中声明layout,并通过UI框架方法获取到UI控件。例如,下面代码演示调用findViewById()去获取TextView控件,然后将它绑定到viewModel的userName。
TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());
接下来的例子演示使用Data Binding库直接在layout文件中为TextView指定需要显示的文本。这样就不需要调用上面例子的Java代码。请注意在赋值表达式中使用@{}语法:
<TextView
android:text="@{viewmodel.userName}"
/>
通过在layout文件中绑定控件可以让你在Activity中移除很多UI框架方法的调用,使它们更简单,更容易维护。这样还可以提高你的应用程序的性能,并有助于防止内存泄漏和空指针异常。
使用Data Binding库
下面介绍如何在Android程序中使用Data Binding库。
开始
了解如何配置开发环境以支持使用Data Binding库,包括支持Android Studio中的Data Binding代码。
Layouts和Binding表达式
表达式语言允许你在layout文件中编写表达式连接变量和视图。Data Binding库自动生成将layout中的视图与数据对象绑定所需的类。该库提供了可在layout中使用的导入,变量和包含等功能。
库的这些特性可以与现有布局完美共存。例如,可以在表达式中使用的绑定变量是在数据元素内部定义的,该data元素是UI布局的根元素的兄弟。这两个元素都包含在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>
使用可观察的数据对象
Data Binding库提供类和方法,可以很容易地观察数据以进行更改。当基础数据源发生改变时,你不需要担心刷新UI。你可以让你的变量或者它们的属性可观察。该库允许您使对象,字段或集合可观察。
生成绑定类
Data Binding库生成用于访问布局的变量和视图的绑定类。此页面显示如何使用和自定义生成的绑定类。
绑定的适配器
对于每个布局表达式,有一个绑定的适配器,它使得设置相应属性或监听器给所需的框架调用。例如,绑定的适配器可以负责调用setText()方法来设置text属性或调用setOnClickListener()方法来为click事件添加一个监听器。最常见的绑定适配器,例如本页示例中使用的android:text属性的适配器,可以在android.databinding.adapters包中使用。有关常用绑定适配器的列表,请参阅适配器。您还可以创建自定义适配器,如以下示例所示:
@BindingAdapter("app:goneUnless")
public static void goneUnless(View view, Boolean visible) {
view.visibility = visible ? View.VISIBLE : View.GONE;
}