2017-07-25 7 views
1

J'essayais de me familiariser avec RxBinding et comment il pourrait être appliqué sur des formulaires simples. Je me demandais s'il y avait moyen de créer une Action1 qui effectue les contrôles et met à jour le modèle. Si je ne suis pas assez clair, j'espère que le code ci-dessous vous aidera à comprendre ce que je veux dire.Créer un uniforme Action1 pour effectuer des contrôles sur les champs

Observable<CharSequence> nameObservable = RxTextView.textChanges(name).share(); 
    Action1<CharSequence> validateAction; 
    Observable<CharSequence> surnameObservable = RxTextView.textChanges(surname).share(); 
    Observable<CharSequence> emailObservable = RxTextView.textChanges(mail).share(); 

    validateAction = new Action1<CharSequence>() { 
     @Override 
     public void call(CharSequence charSequence) { 
      if(state.nameState && state.surnameState && state.emailState) 
       submit.setBackgroundColor(getResources().getColor(R.color.green)); 
      else 
       submit.setBackgroundColor(getResources().getColor(R.color.blue)); 
     } 
    }; 



    Subscription nameState = nameObservable 
      .subscribe(new Action1<CharSequence>() { 
       @Override 
       public void call(CharSequence charSequence) { 
        Log.d("Length","Len : " + charSequence.length()); 
        if(charSequence.length() > 5) 
         state.nameState = true; 
        else 
         state.nameState = false; 
       } 
      }); 


    Subscription surnameState = surnameObservable 
      .subscribe(new Action1<CharSequence>() { 
       @Override 
       public void call(CharSequence charSequence) { 
        Log.d("Length","Len : " + charSequence.length()); 
        if(charSequence.length() > 5) 
         state.surnameState = true; 
        else 
         state.surnameState = false; 
       } 
      }); 

    Subscription mailState = emailObservable 
      .subscribe(new Action1<CharSequence>() { 
       @Override 
       public void call(CharSequence charSequence) { 
        Log.d("Length","Len : " + charSequence.length()); 
        if(charSequence.length() > 5) 
         state.emailState = true; 
        else 
         state.emailState = false; 
       } 
      }); 

    Subscription nameValidate = nameObservable.subscribe(validateAction); 
    Subscription surnameValidate = surnameObservable.subscribe(validateAction); 
    Subscription mailValidate = emailObservable.subscribe(validateAction); 

J'ai créé une action1 dont la responsabilité est de vérifier l'état du modèle et changer la couleur du bouton, créé des souscriptions égal au nombre de Observables et passé comme paramètre.
Quelque chose comme ceci par exemple

Action1<CharSequence> lengthCheck = new Action1<CharSequence>() { 
     @Override 
     public void call(CharSequence charSequence) { 
      if(field is name){ 
       if(charSequence.length() > 5) 
        ...      
      } 
       ... 
     } 
    }; 

Ma question est, est-il un moyen de réussir quelque chose de semblable à cela pour l'action1 qui vérifient la longueur? Est-ce même le bon endroit pour mettre un chèque comme ça? Il me semble juste stupide que j'ai exactement le même code, copié et collé trois fois avec des changements minimes.
Merci beaucoup pour votre temps.

+0

Vous souhaitez définir le fond du bouton de soumission sur vert lorsque 3 états = true? –

+0

Yeap, assez simple, juste essayer de comprendre la bibliothèque –

+0

utiliser combineLatest pour ce cas –

Répondre

2

Pour la validation du nom

private Observable<Boolean> getNameObservable() { 
    return RxTextView.textChanges(name) 
      .map(charSequence -> charSequence.toString().trim().length() > 0); 
} 

Pour la validation de nom

private Observable<Boolean> getSurNameObservable() { 
    return RxTextView.textChanges(email) 
      .map(charSequence -> charSequence.toString().trim().length() > 0); 
} 

Pour la validation email

private Observable<Boolean> getEmailObservable() { 
    return RxTextView.textChanges(email) 
      .map(charSequence -> charSequence.toString().trim().length() > 0); 
} 

En utilisant combineLatest combiner 3 observables comme 1 flux

Observable.combineLatest(getNameObservable(),getSurNameObservable(), getEmailObservable, 
        (nameValid, surnameValid,emailValid) -> nameValid && surnameValid && emailValid) 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(isAllFieldsValid -> 
          enableButton(yourButton, isAllFieldsValid)); 

La activer la fonction

private void enableButton(Button button, boolean isAvailable) { 
    button.setEnabled(isAvailable); 
    if (isAvailable) { 
     button.setBackgroundResource(R.drawable.green); 
    } else { 
     button.setBackgroundResource(R.drawable.blue); 
    } 
} 

==================================== ========================================= PS: Vous pouvez créer une fonction qui crée un Observable pour 3 EditText

private Observable<Boolean> getNameObservable(EditText et) { 
    return RxTextView.textChanges(et) 
      .map(charSequence -> charSequence.toString().trim().length() > 0); 
} 
+0

Exactement ce que je cherchais, merci beaucoup –

+0

yah. J'espère que vous aider –

+0

En passant '.subscribeOn()' me donne une 'java.lang.IllegalStateException', le moment où je l'enlève tout est de retour à la normale –