2016-09-21 65 views
0

我已经创建了自己的一些简单的类来验证通过双向数据绑定的字段。自定义对象双向数据绑定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); 
      } 
    ... 
} 

在视图模型我建立这个类并将其绑定到查看数据绑定 如常(全部结合实际工作所以这里没有错误)。

public ValidatedField phoneNumber = new ValidatedField(); 

在布局,我有看法与Android:text属性和我的设置:

<EditText 
    android:text="@={viewModel.phoneNumber.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领域。 e.g:

@Bindable 
public boolean getIsError() 
{ 
    return mIsError; 
} 

回答

0

在我看来,你可能刚刚延长ObservableField<String>,然后覆盖其set方法。 所以像:

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

这将工作,但只有在类中没有其他Bindable字段时才有效。如果我想检查例如phoneNumber.isError访问Bindable公共布尔getIsError(){返回mIsError; }它说错误:找不到访问器java.lang.String.error – mlyko

0

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

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