数据绑定库 是 Android Jetpack 的一部分。
数据绑定库是一个支持库,它允许您使用声明性格式而不是以编程方式将布局中的 UI 组件绑定到应用中的数据源。
布局通常在活动中定义,其中包含调用 UI 框架方法的代码。例如,以下代码调用 findViewById()
以查找 TextView
小部件并将其绑定到 viewModel
变量的 userName
属性
Kotlin
findViewById<TextView>(R.id.sample_text).apply { text = viewModel.userName }
Java
TextView textView = findViewById(R.id.sample_text); textView.setText(viewModel.getUserName());
以下示例显示了如何使用数据绑定库将文本直接分配到布局文件中的小部件。这消除了调用上面显示的任何 Java 代码的需要。请注意赋值表达式中 @{}
语法的使用
<TextView
android:text="@{viewmodel.userName}" />
在布局文件中绑定组件可以让您删除活动中的许多 UI 框架调用,使它们更简单且更易于维护。这还可以提高应用的性能,并有助于防止内存泄漏和空指针异常。
使用数据绑定库
使用以下页面了解如何在 Android 应用中使用数据绑定库。
- 开始
- 了解如何准备开发环境以使用数据绑定库,包括在 Android Studio 中支持数据绑定代码。
表达式语言允许您编写将变量连接到布局中视图的表达式。数据绑定库自动生成绑定布局中的视图与数据对象所需的类。该库提供诸如导入、变量和包含等功能,您可以在布局中使用这些功能。
库的这些功能与您现有的布局无缝共存。例如,可以在表达式中使用的绑定变量是在 UI 布局的根元素的同级元素的 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>
- 使用可观察数据对象
- 数据绑定库提供类和方法来轻松观察数据的更改。当底层数据源发生更改时,您无需担心刷新 UI。您可以使变量或其属性可观察。该库允许您使对象、字段或集合可观察。
- 生成的绑定类
- 数据绑定库生成绑定类,用于访问布局的变量和视图。此页面向您展示如何使用和自定义生成的绑定类。
- 绑定适配器
- 对于每个布局表达式,都有一个绑定适配器,它执行设置相应属性或侦听器所需的框架调用。例如,绑定适配器可以负责调用
setText()
方法来设置文本属性或调用setOnClickListener()
方法向点击事件添加侦听器。最常见的绑定适配器(例如此页面示例中使用的android:text
属性的适配器)可供您在android.databinding.adapters
包中使用。有关常见绑定适配器的列表,请参阅 适配器。您还可以创建自定义适配器,如下例所示
Kotlin
@BindingAdapter("app:goneUnless") fun goneUnless(view: View, visible: Boolean) { view.visibility = if (visible) View.VISIBLE else View.GONE }
Java
@BindingAdapter("app:goneUnless") public static void goneUnless(View view, Boolean visible) { view.visibility = visible ? View.VISIBLE : View.GONE; }
- 将布局视图绑定到架构组件
- Android 支持库包括 架构组件,您可以使用它来设计健壮、可测试和可维护的应用。您可以将架构组件与数据绑定库结合使用,以进一步简化 UI 的开发。
- 双向数据绑定
- 数据绑定库支持双向数据绑定。用于此类型绑定的符号支持接收属性的数据更改以及同时侦听对该属性的用户更新的能力。
其他资源
要详细了解数据绑定,请参阅以下其他资源。
示例
Codelabs
博文
为您推荐
- 注意:当 JavaScript 关闭时,显示链接文本
- 绑定适配器 {:#binding-adapters}
- 布局和绑定表达式
- 生成的绑定类 {: #binding-classes}