2016-12-09 2 views
1

우리는 Kubwa 유효성 검사 라이브러리를 사용하여 android 데이터 바인딩 라이브러리가있는 양식의 유효성을 검사하지만 EditTexts에 오류가 표시되지 않습니다.안드로이드 데이터 바인딩 - EditText SetError

뷰 모델 :

@Override 
public void onLoginClick(View view) { 

    validator.validateEmail(user.getEmail()); 
    validator.validatePassword(user.getPassword()); 

    notifyChange(); 

    if (validator.isValid()) connector.login(user); 
} 

@Bindable 
@Override 
public String getEmailError() { 
    return validator.getEmailErrorMessage(); 
} 

@Bindable 
@Override 
public String getPasswordError() { 
    return validator.getPasswordErrorMessage(); 
} 

그리고 내 XML : 그건 내가 BindingAdapter를 생성하고 XML 속성을 변경 작동하지 않지만, 그렇지 않은 것을 깨달았다

<EditText 
android:id="@+id/email" 
android:text="@={viewModel.user.email}" 
app:error="@{viewModel.emailError}"/> <!-- As the wiki said --> 

어느 쪽이든 노력하고 있습니다.

@BindingAdapter("app:errorText") 
public static void BindError(EditText view, String error){ 
    view.setError(error); 
} 

는 모든 통찰력이 크게 이것은 데이터 바인딩 라이브러리를 사용하는 방법에 대한 질문입니다

+2

'onLoginClick()'바인딩을 표시 할 수 있습니까? 아마도 활성화되지 않았습니까? 편집 텍스트 옆에 오류 아이콘이 나타 납니까? 설명서에 따르면 편집 텍스트에 포커스가있는 경우에만 팝업이 표시됩니다. 사용자 환경을 개선하기 위해 양방향 데이터 바인딩을 사용하여 전자 메일 및 암호의 유효성을 지속적으로 검사 할 수 있습니다. 또는 제출시 대신 초점 손실을 확인하십시오. –

+0

나는 onLoginClick()을 이미 디버깅 했으므로 유효성 검사를 수행하고 두 가지 방법으로 초점을 맞추거나 포커스 손실이 더 좋을 것이라고 전적으로 동의합니다. –

답변

7

나는 여러분의 예제와 비슷한 것을 시도해 보았지만 정상적으로 작동했습니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    User user = new User(); 
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
    binding.setUser(user); 
} 

및 Observable - 검증을 setName에 넣었지만 귀하의 값은 동일해야합니다.

public class User extends BaseObservable { 
    private String name; 

    @Bindable 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
     notifyPropertyChanged(com.example.gmount.tryoutdamnthing.BR.name); 
     notifyPropertyChanged(com.example.gmount.tryoutdamnthing.BR.error); 
    } 

    @Bindable 
    public String getError() { 
     if (name == null || name.length() < 3) { 
      return "Too short!"; 
     } else { 
      return null; 
     } 
    } 
} 

레이아웃 : 당신은 대신 InverseBindingAdapter에 그것을 가지고하는 것이 좋습니다

<layout> 
    <data> 
     <variable name="user" type="com.example.gmount.tryoutdamnthing.User"/> 
    </data> 

    <FrameLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/activity_main" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
    > 

     <EditText 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@={user.name}" 
       app:error="@{user.error}" 
     /> 

    </FrameLayout> 
</layout> 

내 생각 엔 당신이 DataBindingUtil.setContentView()를 사용하거나 바인딩에 뷰 모델 객체를 설정하는 것을 잊었다하지 않은 것입니다 . 때로는 사람들이 DataBindingUtil.setContentView() 이후에 Activity.setContentView()을 사용하기 때문에 발생합니다.

setter의 이름이 속성과 동일하기 때문에 app:error에 BindingAdapter가 필요하지 않음을 알 수 있습니다.

+0

고마워요. 시도해 보겠습니다. –

+0

나는이 대답을 좋아합니다! Kubwa를 사용해 본 결과 나는 완성도가 그리 높지 않고 유연하지도 않다는 것을 알았습니다. –

+0

setError() 메서드를 추가해야합니까? –

1

감사합니다. 오류에 errorText을 바인딩하고 있지만 레이아웃에 error을 사용합니다. BindingAdapter를 @BindingAdapter({"app:error"})으로 변경하면 오류가 수정됩니다.

+0

시도해보십시오 :'@BindingAdapter ("error")'. 귀하의 바인딩 어댑터가 올바르게 귀하의 레이아웃 biding에 맞게 설정되지 않았습니다 – Boots

+0

두 번째 구문을 더 설명해 주시겠습니까? –

+0

레이아웃에서는'app : error = ".."'- 데이터 바인딩 라이브러리가'error'를 바인딩하고 있으므로, BindingAdapter는 다른 것 ('errorText')으로 설정됩니다. – Boots