这篇文章描述了 Android 中最近推出且仍处于测试版的最有趣的功能之一: Android 数据绑定 。使用数据绑定, 您可以在表示层(应用程序 UI)和包含您要显示的信息的底层数据模型之间创建链接 。 UI 小部件内容(如 TextView、EditText 等)以某种方式绑定到存储在 java 类中的数据。 每次数据变化时,绑定的UI widget都会更新 ,这样你就不用再为自己更新UI而烦恼了。如果应用不使用Android数据绑定,则需要找到视图并更新内容。
设置安卓数据绑定
如前所述,此功能仍处于测试版,因此首先让我们在顶层 build.gradle 中设置正确的依赖项:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
顺便说一下,确保你下载了 gradle 2.4 。现在依赖已经准备好了,是时候修改应用程序中的 build.gradle 了:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
如何使用 Android 数据绑定
现在环境已经准备就绪,可以编写我们的 Android 应用程序 了。例如,我们将创建一个简单的天气应用程序来显示温度和其他信息,在这种情况下要向数据显示应用程序将使用数据绑定。
首先,我们创建布局,这将非常简单,但它包含一些我们应该注意的重要事项:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
作为应用程序 UI 布局的根,有布局,然后声明我们要在布局中使用的变量(第 3-5 行)。声明这些变量很重要,因为它们将在绑定过程中使用。在第 4 行,声明变量 data 是 survivingwithandroid.com.androiddatabinding.model.Data 的类型,其中包含我们要显示的数据。在其他世界中,此类是绑定 UI 的 POJO。在 TextView 小部件中,POJO 类的每个字段的值都绑定到相应的 android:text,因此该值会自动显示。
将变量绑定到对象
现在布局已准备就绪,可以将类字段绑定到 UI 小部件。在 onCreate 方法中,我们以与通常方式不同的方式获取对 Activity 当前布局的引用:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
其中数据定义为:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
请注意,在第 5 行,我们设置了活动布局,然后解析了布局中使用的变量。如果我们以这种方式运行应用程序,我们会注意到 UI 数据仅在开始时更新一次,当绑定到 UI 的底层类字段更改时,UI 不会反映更改。发生这种情况是因为有必要在 UI 和数据字段之间创建一个侦听器。
第一步是我们的 POJO 数据类扩展 BaseObservable:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
现在有必要将单个类字段绑定到 UI,例如温度字段:
dependencies {
classpath "com.android.tools.build:gradle:1.3.0"
classpath "com.android.databinding:dataBinder:1.+"
}
@Bindable
注解用于在 UI 和字段之间建立引用,
notifyPropertyChanged
通知侦听器底层字段已更改,需要更新视图。运行示例,使用
Android 数据绑定
结果是:
结论
正如我们所注意到的 ,Android 数据绑定 是一个非常有趣且强大的功能,它可以简化很多应用程序的构建。无论如何,它仍处于测试版,并且存在一些小问题:例如,即使我尝试使用相同的方式更新 ImageView 并设置资源 ID,它也不起作用。是我的错吗?!!