0

양방향 데이터 바인딩을 통해 필드의 유효성을 검사하는 간단한 클래스를 만들었습니다.사용자 정의 객체 양방향 데이터 바인딩 android : text

의 ViewModel I 설정에서
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); 
      } 
    ... 
} 

이 클래스와 데이터 바인딩에서 평소 볼 수 바인딩 (모든 바인딩이 실제로 그래서 여기에 오류가 작동하지 않습니다). 텍스트 속성과 I 설정 : 레이아웃에서

public ValidatedField phoneNumber = new ValidatedField(); 

, 나는 안드로이드와보기가

<EditText 
    android:text="@={viewModel.phoneNumber.value}" 
/> 

을 그리고 모든 매력처럼 작동합니다.

그리고 제 질문은 : 그것은 하나의 방법은 예를 들어, 바인딩 된 경우

<EditText 
    android:text="@={viewModel.phoneNumber}" 
/> 

나는 그것이 작동되도록 수 : 이 가능은 다음과 같습니다 너무 레이아웃에서 '.value'를 생략하는 것입니다

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

답변

0

당신이 단지 ObservableField<String>을 확장했습니다 다음의 set 메소드를 오버라이드 (override) 할 수 있음을 날 것으로 보인다. 그래서 같은 :

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 public boolean getIsError() {return mIsError; } 오류 : 접근자를 찾을 수 없음 java.lang.String.error – mlyko

0

데이터 바인딩은 InverseBindingConversion 결여되어있다. 현재 사용하려는 의도대로 작동하지 않습니다.

언제든지 @={viewModel.phoneNumber.value}을 작성해야합니다.