【问题标题】:Custom object two-way databinding android:text自定义对象双向数据绑定 android:text
【发布时间】:2016-09-21 22:36:25
【问题描述】:

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

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”,使其看起来像这样:

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

【问题讨论】:

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


    【解决方案1】:

    在我看来,您可以扩展ObservableField&lt;String&gt;,然后覆盖其set 方法。 比如:

    public class ValidatedField extends ObservableField<String> {
        @Override
        public void set(String value) {
            if (get().equals(value))
                return;
            super.set(value);
        }
    }
    

    【讨论】:

    • 这会起作用,但前提是类中没有其他可绑定字段。如果我想检查例如 phoneNumber.isError 的访问器 Bindable public boolean getIsError() { return mIsError;它说错误:找不到访问器 java.lang.String.error
    【解决方案2】:

    数据绑定缺少InverseBindingConversion。目前它不像你打算使用它那样工作。

    所以你必须随时写@={viewModel.phoneNumber.value}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多