web-dev-qa-db-ja.com

Android:データバインディング、notifyPropertyChanged()が機能していませんか?

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);

変更はテキストビューに反映されません。何が問題なのですか?

15
Ashwin

ゲッターの代わりにフィールド名を使用します。

<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}"/>
7
LenaYan

私はちょうど同じ問題を抱えていました。私のバインディングは最初は機能し、2回目は機能しませんでした。

ゲッターメソッドではなくセッターに@Bindableを配置したことを除いて、私はあなたと同じセットアップをしました。

セッターとゲッターの両方に@Bindableを追加すると、この問題が修正されました。

データバインディングライブラリの内部ワーカーをデバッグしたときに、フィールドが最後の値から更新されたかどうかを確認する操作を実行したため、requestre-bindというメソッドが呼び出されていないことに気付きました。私の推測では、再バインドが必要かどうかを確認するためにこの内部確認を実行できるように、両方のメソッドにアノテーションが必要です。

これが本当かどうかは100%ではありませんが、両方のメソッドに注釈を付けることで問題が修正されました。データバインディングライブラリのドキュメントを見ると、ゲッターに注釈が表示されているだけであることがわかります。

あなたが試すことができます:

@Bindable
public SpannableString getTotalText() {
  return totalText;
}

@Bindable
public void setTotalText(SpannableString totalText) {
  this.totalText = totalText;
  notifyPropertyChanged(BR.totalText);
}

それが解決するかどうかを確認します。

1
Dave Thomas

「notifyPropertyChanged(BR._)」の代わりに「notifyChange()」を使用してください..!

0
Asim Hussain

双方向のデータバインディングには=を追加する必要があります。

Android:text="@={LoginViewModel.address}"

=を追加するのを忘れたため、機能しませんでした。 EditTextを使用していて、ベースBaseObservableによる双方向のデータバインディングが必要な場合は、@={LoginViewModel.address}の代わりに@{LoginViewModel.address}が必要です。

0

Stringの値をpublicではなくprivateとして定義する必要があると思います。また、データバインディングはゲッターとセッターを自動的に検出するので、他の人がすでに言ったように@{object.totalText}と入力するだけです。

このYoutubeリンクがあなたにも役立つことを願っています。

https://www.youtube.com/watch?v=h6ejIx5xu-M

0
정형식