我为自己创建了一个简单的类,用于通过双向数据绑定验证字段。
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}"
/>
一切都像魅力一样。
我的问题是:是否可以跳过&#39; .value&#39;从布局,使它看起来像这样:
<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;
}
答案 0 :(得分:0)
在我看来,您可以只扩展ObservableField<String>
然后覆盖其set
方法。
所以喜欢:
public class ValidatedField extends ObservableField<String> {
@Override
public void set(String value) {
if (get().equals(value))
return;
super.set(value);
}
}
答案 1 :(得分:0)
数据绑定缺少InverseBindingConversion
。目前,它并不像你打算使用它那样工作。
所以你必须随时写@={viewModel.phoneNumber.value}
。