サマリ
簡単に書くと、自動でBindしたい値のgetterに@Bindable
アノテーションを付けて、View側で変数を指定してあげるだけです。
サンプルコード
Bindされるモデルクラス
SampleModelClass.java
public class SampleModelClass extends BaseObservable {
private String text;
@Bindable
public String getString() {
return text;
}
public void setString(String str) {
text = str;
notifyPropertyChanged(BR.text);
}
}
extends BaseObservable
まずは1行目のextends BaseObservable
です。
これをすることで、値に変更があったことを通知できるようになります。
@Bindable
getterクラスに@Bindable
アノテーションを追加することで、値が変更された変数をBindできるようになります。
notifyPropertyChanged
setterクラスでこれを呼ぶことにより、値が変更されたことを実際に通知(notify)します。
View側
SmapleView.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="model"
type="net.furusin.www.sample.model.SampleModelClass" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.text}" />
</LinearLayout>
</layout>
android:text="@{model.text}"
今回はTextViewにBindしてみます。
注意は
「SampleModelClass#getString()
を呼ぶのではなくSampleModelClass.text
とメンバ変数を直接指定する」
ということです。
私は「値を取得するんだからgetterを呼ぶに決まってんじゃーん!」と思い込んでたのでハマりました。ご注意ください。
以上です。