觀測能力是指物件能否通知他人 資料的任何變動資料繫結程式庫可讓您建立物件、欄位或 可觀測的集合。
您可以使用任何物件進行資料繫結,但修改物件無法 自動更新 UI。您可以使用資料繫結 可以通知其他物件 (稱為「事件監聽器」) 能 使用者的資料相關異動可觀測的類別有三種類型: 欄位、集合和 物件。
當其中一個可觀察的資料物件繫結至 UI 和 當資料物件有所變更,使用者介面也會自動更新。
可觀測欄位
如果您的類別只有少數屬性,這麼做可能不值得
會建立可實作
Observable
介面。在本
在此情況下,您可以使用一般 Observable
類別和以下程式碼
將欄位設為可觀察的基本類別:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
可觀測欄位是獨立可觀測的物件,只有單一
] 欄位。使用原始版本時,學生能避免開箱或開箱
作業。如要使用這項機制,請在 Java 中建立 public final
屬性
如
範例:
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(); }
如要存取欄位值,請使用
set()
和
get()
存取子方法
或使用 Kotlin 屬性
語法:
user.firstName = "Google" val age = user.age
user.firstName.set("Google"); int age = user.age.get();
可觀測的集合
部分應用程式使用動態結構來保留資料。可觀測的集合
存取這些結構
ObservableArrayMap
類別
當鍵是參照類型 (例如 String
) 時相當實用,如
範例:
ObservableArrayMap<String, Any>().apply { put("firstName", "Google") put("lastName", "Inc.") put("age", 17) }
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"/>
ObservableArrayList
類別在鍵為整數時非常實用,如下所示:
ObservableArrayList<Any>().apply { add("Google") add("Inc.") add(17) }
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
介面提供新增及移除事件監聽器的機制,但
決定通知的傳送時機為了簡化開發作業
繫結程式庫提供
BaseObservable
類別,也就是
實作事件監聽器註冊機制。實作
BaseObservable
負責在屬性變更時通知我。待辦
則指派 Bindable
註解
getter 並呼叫
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) } }
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); } }
資料繫結會在模組套件中產生名為 BR
的類別,其中包含
用於資料繫結的資源 ID。Bindable
註解
在編譯期間,BR
類別檔案中會產生項目。如果基礎類別
如果無法變更資料類別,可以實作 Observable
介面
請使用
PropertyChangeRegistry
物件,以便有效率地註冊及通知事件監聽器。
生命週期感知物件
應用程式中的版面配置也可以繫結至自動繫結的資料繫結來源 通知 UI 資料變更。如此一來 生命週期感知,且只會在 UI 在畫面上顯示時觸發。
資料繫結支援
StateFlow
和
LiveData
。如要進一步瞭解
在資料繫結中使用 LiveData
,請參閱「使用 LiveData 向 UI 通知資料
變更。
使用 StateFlow
如果應用程式將 Kotlin 與協同程式搭配使用,您可以使用
StateFlow
物件做為資料繫結來源。如要搭配使用 StateFlow
物件和
並指定生命週期擁有者
StateFlow
物件。以下範例會指定將活動設為
繫結類別執行個體化後的生命週期擁有者:
class ViewModelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Inflate view and obtain an instance of the binding class.
val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)
// Specify the current activity as the lifecycle owner.
binding.lifecycleOwner = this
}
}
如「將版面配置檢視畫面繫結至架構」一節所述
元件、資料繫結
可與 ViewModel
完美搭配運作
如需儲存大量結構化物件
建議使用 Cloud Bigtable您可以搭配使用 StateFlow
和 ViewModel
,方法如下:
class ScheduleViewModel : ViewModel() {
private val _username = MutableStateFlow<String>("")
val username: StateFlow<String> = _username
init {
viewModelScope.launch {
_username.value = Repository.loadUserName()
}
}
}
在版面配置中,將 ViewModel
物件的屬性和方法指派給
使用繫結運算式對應的檢視畫面,如下所示
範例:
<TextView
android:id="@+id/name"
android:text="@{viewmodel.username}" />
每當使用者名稱值變更時,UI 就會自動更新。
停用 StateFlow 支援功能
如果應用程式使用 Kotlin 和 AndroidX,系統會自動支援 StateFlow
繫結至資料繫結中這表示協同程式依附元件
如果沒有可用的依附元件,就會自動納入您的應用程式。
如要停用這項功能,請在您的
build.gradle
檔案:
android { ... dataBinding { addKtx = false } }
android { ... dataBinding { addKtx = false } }
或者,您也可以在專案中全面停用 StateFlow
,方法是新增
gradle.properties
檔案中加入以下這行程式碼:
android.defaults.databinding.addKtx = false
android.defaults.databinding.addKtx = false
其他資源
如要進一步瞭解資料繫結,請參閱以下其他資源:
範例
程式碼研究室
網誌文章
為你推薦
ViewModel 的已儲存狀態模組
用於處理 ViewModel 物件中已儲存狀態的模組
將版面配置視圖與架構元件建立繫結
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.
Paging 程式庫總覽
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.