Androidのデータバインディングライブラリを使用しています。 BaseObservable
を拡張するデータオブジェクトがあります。
public static class SimpleData extends BaseObservable implements Serializable {
private String text, subText;
private SpannableString totalText;
@Bindable
public SpannableString getTotalText() {
return totalText;
}
public void setTotalText(SpannableString totalText) {
this.totalText = totalText;
notifyPropertyChanged(BR.totalText);
}
}
そして私のxmlもバインドされています
<TextView
Android:id="@+id/patient_name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textAppearance="?android:attr/textAppearanceMedium"
Android:layout_marginLeft="16dp"
Android:layout_toRightOf="@+id/patient_image"
Android:textColor="@color/primary_text"
Android:text="@{object.getTotalText()}"/>
バインディングは初期値に対して行われます。しかし、を使用して値を変更すると
object.setTotalText(someSpannableString);
変更はテキストビューに反映されません。何が問題なのですか?
ゲッターの代わりにフィールド名を使用します。
<TextView
Android:id="@+id/patient_name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textAppearance="?android:attr/textAppearanceMedium"
Android:layout_marginLeft="16dp"
Android:layout_toRightOf="@+id/patient_image"
Android:textColor="@color/primary_text"
Android:text="@{object.totalText}"/>
私はちょうど同じ問題を抱えていました。私のバインディングは最初は機能し、2回目は機能しませんでした。
ゲッターメソッドではなくセッターに@Bindable
を配置したことを除いて、私はあなたと同じセットアップをしました。
セッターとゲッターの両方に@Bindable
を追加すると、この問題が修正されました。
データバインディングライブラリの内部ワーカーをデバッグしたときに、フィールドが最後の値から更新されたかどうかを確認する操作を実行したため、requestre-bindというメソッドが呼び出されていないことに気付きました。私の推測では、再バインドが必要かどうかを確認するためにこの内部確認を実行できるように、両方のメソッドにアノテーションが必要です。
これが本当かどうかは100%ではありませんが、両方のメソッドに注釈を付けることで問題が修正されました。データバインディングライブラリのドキュメントを見ると、ゲッターに注釈が表示されているだけであることがわかります。
あなたが試すことができます:
@Bindable
public SpannableString getTotalText() {
return totalText;
}
@Bindable
public void setTotalText(SpannableString totalText) {
this.totalText = totalText;
notifyPropertyChanged(BR.totalText);
}
それが解決するかどうかを確認します。
「notifyPropertyChanged(BR._)」の代わりに「notifyChange()」を使用してください..!
双方向のデータバインディングには=
を追加する必要があります。
Android:text="@={LoginViewModel.address}"
=
を追加するのを忘れたため、機能しませんでした。 EditText
を使用していて、ベースBaseObservable
による双方向のデータバインディングが必要な場合は、@={LoginViewModel.address}
の代わりに@{LoginViewModel.address}
が必要です。
String
の値をpublic
ではなくprivate
として定義する必要があると思います。また、データバインディングはゲッターとセッターを自動的に検出するので、他の人がすでに言ったように@{object.totalText}
と入力するだけです。
このYoutubeリンクがあなたにも役立つことを願っています。