Data Binding 系列(一)概覽
Data Binding
是一個支援庫,它使用一種宣告的方式
代替編碼的方式
,用來繫結 UI 控制元件和資料來源。
通常我們會在 activity 裡面呼叫 UI 框架層的方法宣告 view。例如,下面的程式碼呼叫了findViewById()
聲明瞭一個TextView
控制元件,並且把它和viewModel
的userName
屬性進行了繫結:
findViewById<TextView>(R.id.sample_text).apply { text = viewModel.userName } 複製程式碼
下面的程式碼展示瞭如何使用Data Binding
在佈局裡面直接給TextView
的test
屬性進行賦值。這麼做的好處是不必再像上面的例子一樣呼叫 Java 程式碼。注意在賦值表示式中使用的語法是@{}
:
<TextView android:text="@{viewmodel.userName}" /> 複製程式碼
在佈局裡面直接繫結 UI 控制元件,可以減少在 activity 中 UI 框架方法的呼叫,這使得程式碼更加簡潔、更容易維護。它還可以提升 App 的效能,避免記憶體洩漏和空指標異常。
使用
會分下面幾個部分來展開介紹Data Binding
。
1 環境準備
介紹瞭如何準備Data Binding
的開發環境。
繫結表示式的使用建立了 view 和變數之間的聯絡。Data Binding
會自動生成一些類用於繫結 view 和 資料。它提供了諸如imports
、variables
、includes
等在佈局中可以直接使用的特性。
這些特性可以和現有的佈局很好地共存。比如,可以在繫結表示式中直接使用的變數是定義在data
元素標籤中的,data
元素標籤是和佈局的根元素標籤同級的。它們都是layout
標籤的子元素,如下所示:
<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> 複製程式碼
Data Binding
提供了一些類和方法使得觀察資料的變化變得很簡單。你大可不必擔心資料變化時重新整理 UI 的問題。它提供了使物件、欄位、集合變得可觀察的方法。
4 生成繫結類(binding class
)
Data Binding
自動生成了一些類用來訪問佈局變數和 view。這一章會向你展示如何使用和自定義這些生成的繫結類。
5 繫結介面卡(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 } 複製程式碼
6 繫結 view 和其他架構元件
使用Data binding
還可以將 view 和其他架構元件繫結,從而簡化 UI 的開發。
7 雙向資料繫結(two-way data binding
)
Data binding
支援雙向資料繫結。既可以資料變化重新整理 view,也可以 view 重新整理更新資料。