2017-08-24 7 views
1

Ich bin ziemlich neu in RxJava, RxAndroid. Ich habe zwei editText eins für Passwort und eins für Passwortbestätigung. Grundsätzlich muss ich überprüfen, ob die beiden Strings übereinstimmen. Ist es möglich, dies mit Observables zu tun? Würde ein Beispiel wirklich schätzen, also kann ich es begreifen. Prost.Android Formular Validierung mit reaktiven Programmierung

+0

Was ist Ihre allgemeine Vorgehensweise? Möchten Sie auf Änderungen in den Bearbeitungstexten reaktiv reagieren oder auf die Validierungsergebnisse reagieren? –

Antwort

0

Zunächst erstellen Observable aus Ihrem EditText. Sie können RxBinding Bibliothek verwenden oder Wrapper selbst schreiben.

Observable<CharSequence> passwordObservable = 
         RxTextView.textChanges(passwordEditText); 
Observable<CharSequence> confirmPasswordObservable = 
         RxTextView.textChanges(confirmPasswordEditText); 

Dann Ihre Streams verschmelzen und Werte mit combineLatest Betreiber bestätigen:

Observable.combineLatest(passwordObservable, confirmPasswordObservable, 
    new BiFunction<CharSequence, CharSequence, Boolean>() { 
     @Override 
     public Boolean apply(CharSequence c1, CharSequence c2) throws Exception { 
      String password = c1.toString; 
      String confirmPassword = c2.toString; 
      // isEmpty checks needed because RxBindings textChanges Observable 
      // emits initial value on subscribe 
      return !password.iEmpty() && !confirmPassword.isEmpty() 
             && password.equals(confirmPassword); 
     } 
    }) 
    .subscribe(new Consumer<Boolean>() { 
     @Override 
     public void accept(Boolean fieldsMatch) throws Exception { 
      // here is your validation boolean! 
      // for example you can show/hide confirm button 
      if(fieldsMatch) showConfirmButton(); 
      else hideCOnfirmButton(); 
     } 
    }, new Consumer<Throwable>() { 
     @Override 
     public void accept(Throwable throwable) throws Exception { 
      // always declare this error handling callback, 
      // otherwise in case of onError emission your app will crash 
      // with OnErrorNotImplementedException 
      throwable.printStackTrace(); 
     } 
    }); 

subscribe Methode gibt Disposable Objekt. Sie müssen disposable.dispose() in Ihrem Callback anrufen (oder OnDestroyView, wenn Sie innerhalb Fragment sind), um Speicherlecks zu vermeiden.

P.S. Der Beispielcode verwendet RxJava2

0

Sie können this Bibliothek verwenden, um so etwas zu tun.

Observable 
      .combineLatest(RxTextView.textChanges(passwordView1), 
          RxTextView.textChanges(passwordView2), 
          (password1, password2) -> checkPasswords)) 
      .filter(aBoolean -> aBoolean) 
      .subscribe(aBoolean -> Log.d(passwords match))