RxJava / RxAndroid – maneja varios cambios de EditText

Tengo 3 campos de EditText y he creado 3 observables para estos campos.

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

Quiero habilitar un botón cuando todos estos tres campos tienen algún valor en él. El usuario puede introducir valores en cualquier orden en los campos. ¿Cómo puedo hacer eso?

EDITAR

Utilicé zip para lograr eso.

 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) 

Este caso anterior funciona cuando introdujo algo en los tres campos de texto. P. Ej., Ingresé 1 carácter en los tres campos de texto y luego el botón se activará. Pero cuando elimino un carácter en cualquiera de los tres campos. Zip no se llamará ya que estará esperando a los otros 2 campos de texto para transmitir algunos datos antes de que se llame onNext en el suscriptor. Así que cuando elimino cualquier carácter en cualquier campo de texto, quiero que mi botón se vuelva a deshabilitar. ¿Cómo puedo lograrlo?

Prueba esto, esto definitivamente funcionará. Use 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); } } }); } 
  • Unidad de prueba de la aplicación android con retrofit y rxjava
  • RxJava HashMap Transformación
  • Añadir RxJava Observer en cadena dependiendo de una condición
  • OnNext comience otro Observable
  • ¿Por qué Rxjava podría causar fugas de memoria?
  • Kotlin: ¿Qué significa "return @"?
  • RxJava onCompleted y onTerminate en el hilo principal
  • ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
  • Obtención de información de encabezado con RXJava y Retrofit
  • ¿Dónde se puede encontrar AndroidObservable.fromBroadcast ahora?
  • RxJava reintentoCuando vuelve a suscribir la propagación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.