该系列文章是对Android推出的架构组件相关文章,按作者自己理解来翻译的,同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方,或者理解错误的地方,请不吝指教。
源自Google官方
Data Binding Library 一文的翻译与归纳
其他相关链接:
Android Jetpack Components
[TOC]
可观测性是指一个对象能够在数据改变时通知其它对象。Data Binding 库允许你使用可观测的对象、字段或集合。
Data Binding库可以使用任何普通的对象,但是改变这些对象时不会自动触发UI更新。Data Binding 可以为你的数据对象提供数据改变时通知其他对象的能力,这里有三种不同的可观测类类型:对象、字段和集合。
当UI绑定了可观测数据对象并且数据对象的一个属性发生改变时,UI会自动刷新。
Observable fields(可观测字段)
要实现 Observable
接口会有一些工作量,如果你的类只有几个属性,那么这些工作是不值得的。基于这点,你可以使用通用的 Observable
类和以下特定的类让字段可观测。
- ObservableBoolean
- ObservableByte
- ObservableChar
- ObservableShort
- ObservableInt
- ObservableLong
- ObservableFloat
- ObservableDouble
- ObservableParcelable
可观测字段是包含单个字段的可观测对象。原始版本在访问操作时避免装箱和拆箱操作。要使用此机制,需要在Java代码中创建公用的final属性,或在Kotlin中创建只读属性。如下代码所示:
private static class User {
public final ObservableField<String> firstName = new ObservableField<>();
public final ObservableField<String> lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
使用 set()
和 get()
方法访问字段的值,如下:
user.firstName.set("Google");
int age = user.age.get();
注意:Android Studio 3.1 或以上版本可以使用 LiveData 对象来替代可观测对象,这种做法更有益于你的应用。
Observable collections(可观测集合)
一些应用使用动态结构来保存数据,可观测集合可以使用 key 来访问这些结构。当 key 是引用类型时,比如 String
,ObservableArrayMap
类是很好的选择,如下所示:
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
在布局中,可以通过 key 获取 map 中的值,如下:
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{String.valueOf(1 + (Integer)user.age)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
当 key 是 int 类型时,可以选择 ObservableArrayList
,如下:
ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);
再布局中可以通过下表来访问列表中的数据,如下:
<data>
<import type="android.databinding.ObservableList"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Observable objects(可观测对象)
一个实现了 Observable
接口的类,允许注册监听可观测对象的数据改变。
Observable
接口有添加和移除监听的机制,但是你必须决定什么时候发送通知。为了让开发更容易,DataBinding 库提供了 BaseObservable
类,它已经实现了监听器注册机制。继承自 BaseObservable
的数据类主要负责属性改变时进行通知。为 getter 方法添加 @Bindable
并在 setter 中调用 ntifyPropertyChanged()
通知属性改变,如下所示:
private static class User extends BaseObservable {
private String firstName;
private String lastName;
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
DataBinding 会为 module 中使用了数据绑定的 ID 和资源生成 BR
类。编译时在 BR
类中生成 Bindable
注解的条目。如果无法修改数据类的基类,可以使用 PropertyChangeRegistry
对象来实现 Observable
接口,以实现注册和通知监听器。
网友评论