私は、双方向のデータバインディングを通じてフィールドを検証するための簡単なクラスをいくつか作成しました。カスタムオブジェクトの双方向データバインディング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;
}
これは、クラスに他のBindableフィールドがない場合にのみ機能します。たとえば、アクセサのphoneNumber.isErrorをチェックしたい場合Bindable public boolean getIsError(){return mIsError; }エラー:アクセサーを見つけることができませんでしたjava.lang.String.error – mlyko