2016-02-17 3 views
0

J'ai un problème intéressant. Je construis une application de contacts dans Android. J'ai un EditText champ pour le nom d'affichage (conjonction de tous les champs de nom) et un EditText pour chacune des parties du nom (nom, prénom, surnom). Qu'est-ce que j'essaie de réaliser est que sur n'importe quel changement dans le nom d'affichage EditText - le contenu EditText va changer et vice versa - à tout changement de EditText partie de nom - un contenu de nom d'affichage va changer immédiatement. A cet effet, je me sers d'un TextWatcher dans chaque EditText et un dans le champ Nom d'affichage:Deux widgets EditText avec TextWatchers provoquent une boucle infinie

displayName.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      parseNameFieldInput(result); 
     } 
    }); 
nameData.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       recalculateDisplayName(); 
      } 
     }); 

qui a provoqué une boucle infinie parce parseNameFieldInput a déclenché la afterTextChanged du nom EditText et il a déclenché la afterTextChanged du nom d'affichage dans son tour. J'ai décidé d'ajouter un verrou booléenne à la méthode pour obtenir le comportement nécessaire:

@Override 
      public void afterTextChanged(Editable s) { 
       if(lock) return; 
       lock = true; 
       parseNameFieldInput(result); 
       lock = false; 
      } 
     }); 

@Override 
       public void afterTextChanged(Editable s) { 
        if(lock) return; 
        lock = true; 
        recalculateDisplayName(); 
        lock = false; 
       } 

Maintenant, le flux semble fonctionner comme prévu, mais je suis encore en doute si je l'ai fait correct. La question est quelle est la meilleure pratique pour implémenter plusieurs champs EditText avec TextWatchers qui peuvent provoquer une boucle infinie. Merci d'avance.

Répondre

1

vous devez utiliser

removeTextWatcher(nameDataTextWatcher); 

de la première edittext chaque fois que vous modifiez le contenu du deuxième texte de modifier, supprimer leurs observateurs de texte. et une fois la modification effectuée, vous devez ajouter à nouveau le même observateur de texte.

+0

vous voulez dire removeTextChangedListener()? –

+0

Je ne suis pas sûr de la méthode removeTextChangedListener(). mais removeTextWatcher (nameDataTextWatcher), j'ai utilisé plusieurs fois –

+0

Il n'y a pas une telle fonction dans EditText –