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



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

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}

相关内容

最新更新