可觀察的數據對象提供了當數據變化時通知其餘對象的能力。Data Binding
庫提供了使對象、字段和集合可觀察的能力。html
任何的傳統對象均可以用於 Data Binding
,可是這些對象數據發生變化時並不能通知 UI
更新。Data Binding
提供了使數據可觀察的方法,就像 Listeners
同樣,它提供了三種可觀察的類:對象(objects
)、字段(fileds
)和集合(collections
)。java
當這些可觀察的數據對象與 UI
綁定後,數據變化時會自動更新 UI
。android
observable fields
)Data Binding
已經爲咱們寫好了用於觀察基礎類型的類,它們都實現了 Observable
接口:app
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
使用方法是,在 java
類中建立 public final
屬性,在 kotlin
中建立只讀屬性,以下所示:spa
class User {
val firstName = ObservableField<String>()
val lastName = ObservableField<String>()
val age = ObservableInt()
}
複製代碼
private static class User {
public final ObservableField<String> firstName = new ObservableField<>();
public final ObservableField<String> lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
複製代碼
能夠使用 get()
和 set()
方法,訪問這些可觀察字段的值,以下所示:code
user.firstName.set("Google");
int age = user.age.get();
複製代碼
對於 key
是引用類型的時候,能夠使用 ObservableArrayMap
,以下所示:htm
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
複製代碼
<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
是整型,能夠使用 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
接口,它就能夠容許外界註冊監聽器來監聽它的屬性的變化。繼承
Observable
能夠容許外界註冊/移除監聽器,可是變化通知的發送是由咱們本身來控制的。爲了方便咱們開發,Data Binding
提供了 BaseObservable
,它默認實現了監聽器的註冊和移除,咱們能夠直接繼承 BaseObservable
,只負責發送變化通知就好了。變化通知的發送,須要咱們給類屬性的 get()
方法加上 Bindable
註解,並在 set()
方法裏調用 notifyPropertyChanged()
方法,示例以下:接口
class User : BaseObservable() {
@get:Bindable
var firstName: String = ""
set(value) {
field = value
notifyPropertyChanged(BR.firstName)
}
@get:Bindable
var lastName: String = ""
set(value) {
field = value
notifyPropertyChanged(BR.lastName)
}
}
複製代碼
Data Binding
會在編譯時自動生成一個叫作 BR
的類,這個類包含了屬性的 ID。