RxJava / RxAndroid – обрабатывать несколько изменений EditText

У меня есть 3 поля EditText, и я создал 3 наблюдаемых для этих полей.

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 текстовые поля не будут передавать некоторые данные, прежде чем он вызоветNext на подписчике. Поэтому, когда я удаляю любого символа в любом текстовом поле, я хочу, чтобы моя кнопка снова отключилась. Как я могу это достичь?

Solutions Collecting From Web of "RxJava / RxAndroid – обрабатывать несколько изменений EditText"

Используйте CombineLatest вместо zip http://reactivex.io/documentation/operators/combinelatest.html

Попробуйте это, это определенно сработает. Используйте combLatest.

 //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); } } }); }