使用可觀察的資料物件

觀測能力是指物件能否通知他人 資料的任何變動資料繫結程式庫可讓您建立物件、欄位或 可觀測的集合。

您可以使用任何物件進行資料繫結,但修改物件無法 自動更新 UI。您可以使用資料繫結 可以通知其他物件 (稱為「事件監聽器」) 能 使用者的資料相關異動可觀測的類別有三種類型: 欄位集合物件

當其中一個可觀察的資料物件繫結至 UI 和 當資料物件有所變更,使用者介面也會自動更新。

可觀測欄位

如果您的類別只有少數屬性,這麼做可能不值得 會建立可實作 Observable 介面。在本 在此情況下,您可以使用一般 Observable 類別和以下程式碼 將欄位設為可觀察的基本類別:

可觀測欄位是獨立可觀測的物件,只有單一 ] 欄位。使用原始版本時,學生能避免開箱或開箱 作業。如要使用這項機制,請在 Java 中建立 public final 屬性 如 範例:

Kotlin

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

Java

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 屬性 語法

Kotlin

user.firstName = "Google"
val age = user.age

Java

user.firstName.set("Google");
int age = user.age.get();

可觀測的集合

部分應用程式使用動態結構來保留資料。可觀測的集合 存取這些結構 ObservableArrayMap 類別 當鍵是參照類型 (例如 String) 時相當實用,如 範例:

Kotlin

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

Java

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&lt;String, Object&gt;"/>
</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 類別在鍵為整數時非常實用,如下所示:

Kotlin

ObservableArrayList<Any>().apply {
    add("Google")
    add("Inc.")
    add(17)
}

Java

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&lt;Object&gt;"/>
</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()。 方法,如以下範例所示:

Kotlin

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)
        }
}

Java

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 在畫面上顯示時觸發。

資料繫結支援 StateFlowLiveData。如要進一步瞭解 在資料繫結中使用 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您可以搭配使用 StateFlowViewModel,方法如下:

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 檔案:

Groovy

android {
    ...
    dataBinding {
        addKtx = false
    }
}

Kotlin

android {
    ...
    dataBinding {
        addKtx = false
    }
}

或者,您也可以在專案中全面停用 StateFlow,方法是新增 gradle.properties 檔案中加入以下這行程式碼:

Groovy

android.defaults.databinding.addKtx = false

Kotlin

android.defaults.databinding.addKtx = false

其他資源

如要進一步瞭解資料繫結,請參閱以下其他資源:

範例

程式碼研究室

網誌文章