Data Binding
是一個支持庫,它使用一種 聲明的方式 代替 編碼的方式,用來綁定 UI 控件和數據源。android
一般咱們會在 activity 裏面調用 UI 框架層的方法聲明 view。例如,下面的代碼調用了 findViewById()
聲明瞭一個 TextView
控件,而且把它和 viewModel
的 userName
屬性進行了綁定:express
findViewById<TextView>(R.id.sample_text).apply {
text = viewModel.userName
}
複製代碼
下面的代碼展現瞭如何使用 Data Binding
在佈局裏面直接給 TextView
的 test
屬性進行賦值。這麼作的好處是沒必要再像上面的例子同樣調用 Java 代碼。注意在賦值表達式中使用的語法是 @{}
:架構
<TextView
android:text="@{viewmodel.userName}" />
複製代碼
在佈局裏面直接綁定 UI 控件,能夠減小在 activity 中 UI 框架方法的調用,這使得代碼更加簡潔、更容易維護。它還能夠提高 App 的性能,避免內存泄漏和空指針異常。app
會分下面幾個部分來展開介紹 Data Binding
。框架
介紹瞭如何準備 Data Binding
的開發環境。less
binding expression
)綁定表達式的使用創建了 view 和變量之間的聯繫。Data Binding
會自動生成一些類用於綁定 view 和 數據。它提供了諸如 imports
、variables
、includes
等在佈局中能夠直接使用的特性。佈局
這些特性能夠和現有的佈局很好地共存。好比,能夠在綁定表達式中直接使用的變量是定義在 data
元素標籤中的,data
元素標籤是和佈局的根元素標籤同級的。它們都是 layout
標籤的子元素,以下所示:post
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="viewmodel" type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>
複製代碼
observable data
)Data Binding
提供了一些類和方法使得觀察數據的變化變得很簡單。你大可沒必要擔憂數據變化時刷新 UI 的問題。它提供了使對象、字段、集合變得可觀察的方法。性能
binding class
)Data Binding
自動生成了一些類用來訪問佈局變量和 view。這一章會向你展現如何使用和自定義這些生成的綁定類。編碼
binding adapter
)對於每個綁定表達式,都會有相應的綁定適配器調用框架的方法去設置對應的屬性或者監聽器。好比,綁定適配器會調用 setText()
方法去設置 text
屬性,或者調用 setOnClickListener()
方法去設置監聽器。經常使用的一些綁定適配器,好比示例中用於 android:text
屬性的綁定適配器,定義在 android.databinding.adapters
包中。你也能夠自定義適配器,以下所示:
@BindingAdapter("app:goneUnless")
fun goneUnless(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}
複製代碼
使用 Data binding
還能夠將 view 和其餘架構組件綁定,從而簡化 UI 的開發。
two-way data binding
)Data binding
支持雙向數據綁定。既能夠數據變化刷新 view,也能夠 view 刷新更新數據。