一方向データ バインディングを使用すると、属性に値を設定し、 その属性の変更に反応するリスナーを実装します。
<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); } } }
バインド可能なプロパティのゲッター メソッドは getRememberMe()
であるため、
プロパティに対応するセッター メソッドが、
setRememberMe()
。
BaseObservable
と @Bindable
の使用方法については、Google Cloud コンソールの
監視可能なデータ オブジェクト。
カスタム属性を使用した双方向データ バインディング
このプラットフォームでは、最も一般的なデータ バインディングについて、双方向のデータ バインディングを実装できます。
双方向属性と変更リスナーを使用します。
組み込むことが重要です双方向のデータ バインディングをカスタム
使用する場合は、
@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
。
Converter
View
オブジェクトにバインドされている変数が
表示前になんらかの方法で書式設定、翻訳、変更する必要がある
Converter
オブジェクトを使用できます
例として、日付を表す EditText
オブジェクトを見てみましょう。
<EditText
android:id="@+id/birth_date"
android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
viewmodel.birthDate
属性には Long
型の値が含まれるため、
変換して書式設定します。
双方向の式が使用されているため、
コンバータを使用して、ユーザーが指定した文字列を再変換する方法をライブラリに通知します。
バッキング データ型(この場合は Long
)にマッピングします。このプロセスを実行するには、
@InverseMethod
アノテーション
その逆の URL を参照するようにして、
ありませんこの構成の例を次のコードに示します。
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
などを使用します。
そのため、2 つのモデルを比較して、起こり得る無限ループを
@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
|
参考情報
データ バインディングについて詳しくは、以下をご覧ください。 追加リソースをご覧ください
サンプル
Codelab
- <ph type="x-smartling-placeholder"></ph> Android データ バインディングの Codelab
ブログ投稿
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- 監視可能なデータ オブジェクトの使用
- レイアウトとバインディング式
- レイアウト ビューをアーキテクチャ コンポーネントにバインドする