RxJava/RxAndroid - 如何处理多个EditText的变化

8

我有三个EditText字段,为这些字段创建了三个可观察对象。

    Observable<CharSequence> o1 = RxTextView.textChanges(field1);
    Observable<CharSequence> o2 = RxTextView.textChanges(field2);
    Observable<CharSequence> o3 = RxTextView.textChanges(field3);

当这三个字段都有值时,我希望能够启用一个按钮。用户可以以任意顺序输入字段中的值。我该如何做到呢?

编辑

我使用了zip来实现。

Observable<CharSequence> o1 = RxTextView.textChanges(field1);
Observable<CharSequence> o2 = RxTextView.textChanges(field2);
Observable<CharSequence> o3 = RxTextView.textChanges(field3);
Observable.zip(o1, o2, o3, (c1, c2, c3) -> c1.length() > 0 && c2.length() > 0 && c3.length() > 0).subscribe(myButton::setEnabled)

当我在所有三个文本字段中输入内容时,上述情况可以工作。例如,我在所有三个文本字段中输入了1个字符,那么按钮将启用。但是,当我删除任何一个文本字段中的字符时,zip将不会被调用,因为它将等待其他2个文本字段在调用订阅者的onNext之前流一些数据。因此,当我在任何文本字段中删除任何字符时,我希望我的按钮再次被禁用。我该如何实现?

2个回答


4
尝试使用 combineLatest,这肯定会奏效。
//declare global variable
 private Subscription subscription = null;
 Observable<CharSequence> o1 = RxTextView.textChanges(field1);
 Observable<CharSequence> o2 = RxTextView.textChanges(field2);

 public void combineEvent(){
 subscription = Observable.combineLatest(o1, o2,
    new Func2<CharSequence, CharSequence, Boolean>() {
      @Override public Boolean call(CharSequence newEmail, CharSequence  newPassword) {
    //here you can validate the edit text
      boolean emailValid= !TextUtils.isEmpty(newEmail)
          &&    android.util.Patterns.EMAIL_ADDRESS.matcher(newEmail).matches();
        if(!emailValid){
          etEmailAddress.setError("Invalid Email");
        }
        boolean passValid = !TextUtils.isEmpty(newPassword)
            && newPassword.length() >6;
        if(!passValid){
          etPassword.setError("invalid password");
        }


        return emailValid && passValid;

      }
      }).subscribe(new Observer<Boolean>() {
    @Override public void onCompleted() {

    }

    @Override public void onError(Throwable e) {

  }

  @Override public void onNext(Boolean aBoolean) {
    if(aBoolean){
      //here you can enable your button or what ever you want.
      loginBtn.setEnabled(true);

    }else {
      loginBtn.setEnabled(false);
    }

  }
});
}

你可以简化onNext方法的语句,只需使用loginBtn.setEnabled(aBoolean)即可。 - Haydar Ali Ismail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接