2016-09-21 62 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}