自定义对象双向数据绑定android:文本

时间:2016-09-21 22:36:26

标签: android android-databinding 2-way-object-databinding

我为自己创建了一个简单的类,用于通过双向数据绑定验证字段。

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

2 个答案:

答案 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}