您可以使用單向資料繫結,為屬性設定值並設定 回應該屬性變更的接聽程式:
<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:selectedItemPosition android:selection |
AdapterViewBindingAdapter
|
CalendarView |
android:date |
CalendarViewBindingAdapter
|
CompoundButton |
android:checked
|
CompoundButtonBindingAdapter
|
DatePicker
|
android:year android:month android: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:hour android:minute |
TimePickerBindingAdapter
|
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 使用可觀察的資料物件
- 版面配置與繫結的運算式
- 將版面配置檢視畫面繫結至架構元件