我自己创建了一些简单的类,用于通过双向数据绑定验证字段。
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);
}
...
}
在ViewModel中,我设置了这个类,并像往常一样在数据绑定中将它绑定到视图(所有的绑定都是有效的,所以这里没有错误)。
public ValidatedField phoneNumber = new ValidatedField();
在布局中,我有android:text属性的视图和设置:
<EditText
android:text="@={viewModel.phoneNumber.value}"
/>
一切都像魅力一样。
我的问题是:是否有可能跳过'。value' from layout,使其看起来像这样:
<EditText
android:text="@={viewModel.phoneNumber}"
/>
我可以让它工作,如果它是单向绑定,例如通过绑定转换,像这样:
@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;
}
在我看来,你可以只是扩展ObservableField<String>
,然后覆盖它的set
方法。比如:
public class ValidatedField extends ObservableField<String> {
@Override
public void set(String value) {
if (get().equals(value))
return;
super.set(value);
}
}
Databindings缺少InverseBindingConversion
。现在它不像你想用的那样工作。
所以你必须随时写@={viewModel.phoneNumber.value}