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.
vous voulez dire removeTextChangedListener()? –
Je ne suis pas sûr de la méthode removeTextChangedListener(). mais removeTextWatcher (nameDataTextWatcher), j'ai utilisé plusieurs fois –
Il n'y a pas une telle fonction dans EditText –