0

私は、双方向のデータバインディングを通じてフィールドを検証するための簡単なクラスをいくつか作成しました。カスタムオブジェクトの双方向データバインディングandroid:text

ViewModelに私のセットアップで
public class ValidatedField extends BaseObservable{ 
      private String mValue; 

      @Bindable 
      public String getValue() 
      { 
       return mValue; 
      } 


      public void setValue(String value) 
      { 
       if(Objects.equals(value, mValue)) return; 

       mValue = value; 
       notifyPropertyChanged(BR.value); 
      } 
    ... 
} 

このクラスと をデータバインディングでいつものように表示し、それをバインド(すべて実際に結合ので、ここではエラーが働きません)。レイアウトで

public ValidatedField phoneNumber = new ValidatedField(); 

、私はアンドロイドとのビューがあります。textプロパティとI・セットアップ:

<EditText 
    android:text="@={viewModel.phoneNumber.value}" 
/> 

を、すべてが魔法のように動作します。

そして、私の質問は:それは、例えば結合一つの方法だった場合

<EditText 
    android:text="@={viewModel.phoneNumber}" 
/> 

私はそれを動作させることができます:は、それはこのようになりますので、レイアウトから「.VALUE」をスキップすることが可能です

@BindingConversion 
public static String convertValidatedFieldToString(ValidatedField field){ 
    return field.getValue(); 
} 

しかし、既存のValidatedFieldに新しい値を設定することはできません。 私は@InverseBindingAdapterを使用しようとしましたが、それは新しいオブジェクトと、既存のものの更新された値だけでなく毎回作成されるので、運が無難です。

@InverseBindingAdapter(attribute = "android:text") 
public static ValidatedField convertStringToValidatedField(TextView view) 
{ 
    return new ValidatedField(view.getText().toString()); 
} 

ありがとうございます!


編集: 私はクラスの他の@Bindableのフィールドを持っていることを言ったはずです。例えば:

@Bindable 
public boolean getIsError() 
{ 
    return mIsError; 
} 

答えて

0

あなただけでObservableField<String>を拡張して、そのsetメソッドをオーバーライドしていたかもしれないように私には思えます。そのような :

public class ValidatedField extends ObservableField<String> { 
    @Override 
    public void set(String value) { 
     if (get().equals(value)) 
      return; 
     super.set(value); 
    } 
} 
+0

これは、クラスに他のBindableフィールドがない場合にのみ機能します。たとえば、アクセサのphoneNumber.isErrorをチェックしたい場合Bindable public boolean getIsError(){return mIsError; }エラー:アクセサーを見つけることができませんでしたjava.lang.String.error – mlyko

0

データ連結はInverseBindingConversionを欠いています。現時点では、あなたがそれを使用する意志のように働いていません。

いつでも@={viewModel.phoneNumber.value}と書かなければなりません。

関連する問題