您可以使用單向資料繫結,為屬性設定值並設定 回應該屬性變更的接聽程式:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
雙向資料繫結提供了這項程序的捷徑:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
@={} 標記法,其中包含「=」符號,接收資料
您可以同時監聽使用者更新內容。
如要回應備份資料的變更,您可以製作版面配置
Observable 實作變數,通常是
BaseObservable,然後使用
@Bindable 註解,如
下列程式碼片段:
Kotlin
class LoginViewModel : BaseObservable { // val data = ... @Bindable fun getRememberMe(): Boolean { return data.rememberMe } fun setRememberMe(value: Boolean) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value // React to the change. saveData() // Notify observers of a new value. notifyPropertyChanged(BR.remember_me) } } }
Java
public class LoginViewModel extends BaseObservable { // private Model data = ... @Bindable public Boolean getRememberMe() { return data.rememberMe; } public void setRememberMe(Boolean value) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value; // React to the change. saveData(); // Notify observers of a new value. notifyPropertyChanged(BR.remember_me); } } }
可繫結屬性的 getter 方法稱為 getRememberMe(),
屬性對應的 setter 方法會自動使用
setRememberMe()。
如要進一步瞭解如何使用 BaseObservable 和 @Bindable,請參閱「使用
可觀察資料物件
使用自訂屬性的雙向資料繫結
平台提供雙向資料繫結實作,
並變更事件監聽器
您應用程式提供的工具如果您想在 VM 中使用雙向資料繫結
就必須使用
@InverseBindingAdapter敬上
和
@InverseBindingMethod
註解。
舉例來說,如果您想針對 "time" 屬性啟用雙向資料繫結,
請在名為 MyView 的自訂檢視畫面中完成下列步驟:
- 為設定初始值的方法加上註解,並在值時更新 變更使用 - @BindingAdapter:- Kotlin- @BindingAdapter("time") @JvmStatic fun setTime(view: MyView, newValue: Time) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue } } - Java- @BindingAdapter("time") public static void setTime(MyView view, Time newValue) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue; } } 
- 使用 - @InverseBindingAdapter:- Kotlin- @InverseBindingAdapter("time") @JvmStatic fun getTime(view: MyView) : Time { return view.getTime() } - Java- @InverseBindingAdapter("time") public static Time getTime(MyView view) { return view.getTime(); } 
此時,資料繫結知道當資料變更時該怎麼做 (呼叫
方法加上
@BindingAdapter) 以及用途
當檢視屬性變更時,則會呼叫 (呼叫
InverseBindingListener)。
但無法得知屬性何時或如何變更。
為此,您必須在檢視區塊上設定事件監聽器。可以是自訂事件監聽器
也可以是一般事件,例如損失
或文字發生變化將 @BindingAdapter 註解新增至方法
可設定屬性變更的監聽器:
Kotlin
@BindingAdapter("app:timeAttrChanged") @JvmStatic fun setListeners( view: MyView, attrChange: InverseBindingListener ) { // Set a listener for click, focus, touch, etc. }
Java
@BindingAdapter("app:timeAttrChanged") public static void setListeners( MyView view, final InverseBindingListener attrChange) { // Set a listener for click, focus, touch, etc. }
事件監聽器包含 InverseBindingListener 做為參數。您可以使用
InverseBindingListener 用來向資料繫結系統告知屬性
已變更。接著,系統就能開始呼叫使用
@InverseBindingAdapter,依此類推。
在實際操作時,這個事件監聽器會納入一些重要的邏輯,包括事件監聽器。
單向資料繫結如需範例,請參閱文字屬性的轉接器
變更
TextViewBindingAdapter。
轉換人數
如果繫結至 View 物件的變數
必須經過格式化、翻譯或某種方法後才能顯示
可以使用 Converter 物件
例如,假設 EditText 物件顯示日期:
<EditText
    android:id="@+id/birth_date"
    android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
viewmodel.birthDate 屬性包含 Long 類型的值,因此需要
才能使用轉換器格式化
由於使用雙向運算式,也需要「反轉函式」
轉換工具,讓程式庫知道如何將使用者提供的字串轉換回
備份資料類型,在本例中為 Long。方法是將
@InverseMethod 註解
並將這個註解參照
轉換器。以下程式碼範例顯示此設定的範例
snippet:
Kotlin
object Converter { @InverseMethod("stringToDate") @JvmStatic fun dateToString( view: EditText, oldValue: Long, value: Long ): String { // Converts long to String. } @JvmStatic fun stringToDate( view: EditText, oldValue: String, value: String ): Long { // Converts String to long. } }
Java
public class Converter { @InverseMethod("stringToDate") public static String dateToString(EditText view, long oldValue, long value) { // Converts long to String. } public static long stringToDate(EditText view, String oldValue, String value) { // Converts String to long. } }
使用雙向資料繫結的無限迴圈
使用雙向資料繫結時,請務必小心,不要引入無限迴圈。時間
表示使用者變更某項屬性
系統會呼叫 @InverseBindingAdapter,並將值指派給支援
資源。進而呼叫使用
@BindingAdapter:這會觸發再次呼叫已加註的方法
使用 @InverseBindingAdapter 等
因此,請務必透過比較
使用 @BindingAdapter 註解的方法中的新值和舊值。
雙向屬性
平台提供內建的雙向資料繫結支援功能 屬性。深入瞭解平台如何提供 這項支援,請參閱對應繫結轉接器的實作:
| 類別 | 屬性 | 繫結配接器 | 
|---|---|---|
| AdapterView | android:selectedItemPositionandroid:selection | AdapterViewBindingAdapter | 
| CalendarView | android:date | CalendarViewBindingAdapter | 
| CompoundButton | android:checked | CompoundButtonBindingAdapter | 
| DatePicker | android:yearandroid:monthandroid:day | DatePickerBindingAdapter | 
| NumberPicker | android:value | NumberPickerBindingAdapter | 
| RadioButton | android:checkedButton | RadioGroupBindingAdapter | 
| RatingBar | android:rating | RatingBarBindingAdapter | 
| SeekBar | android:progress | SeekBarBindingAdapter | 
| TabHost | android:currentTab | TabHostBindingAdapter | 
| TextView | android:text | TextViewBindingAdapter | 
| TimePicker | android:hourandroid:minute | TimePickerBindingAdapter | 
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 使用可觀察的資料物件
- 版面配置與繫結的運算式
- 將版面配置檢視畫面繫結至架構元件
