J'ai une situation, où il y a deux domaines. field1
et field2
. Tout ce que je veux faire, c'est vider field2
quand field1
est changé et vice versa. Donc, à la fin, un seul champ contient du contenu.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field1.setText("");
}
});
Il fonctionne très bien si je joins addTextChangedListener
à field1
seulement, mais quand je le fais pour les deux champs de l'application se bloque. Évidemment parce qu'ils essaient de se changer indéfiniment. Une fois les field1
modifications effacées field2
à ce moment, elles
field2
sont modifiées de sorte qu'elles s'effacent field1
et ainsi de suite ...
Quelqu'un peut-il suggérer une solution?
starting waiting blocking gc alloc
ce type d'erreur, ce qui peut même entraîner un blocage et un blocage .. alors optez pour la liaison de données, c'est sûr et recommandé par google maintenant ..Réponses:
Vous pouvez ajouter une coche pour effacer uniquement lorsque le texte dans le champ n'est pas vide (c'est-à-dire lorsque la longueur est différente de 0).
Documentation
TextWatcher
ici .Veuillez également respecter les conventions de dénomination .
la source
Je sais que c'est vieux, mais quelqu'un pourrait le retrouver un jour.
J'ai eu un problème similaire où j'appellerais setText sur un EditText et onTextChanged serait appelé lorsque je ne le voulais pas. Ma première solution a été d'écrire du code après avoir appelé setText () pour réparer les dommages causés par l'auditeur. Mais ce n'était pas très élégant. Après avoir fait des recherches et des tests, j'ai découvert que l'utilisation de getText (). Clear () efface le texte de la même manière que setText (""), mais comme il ne définit pas le texte, l'écouteur n'est pas appelé, de sorte que résolu mon problème. J'ai changé tous mes appels setText ("") en getText (). Clear () et je n'avais plus besoin des bandages, donc peut-être que cela résoudra votre problème aussi.
Essaye ça:
la source
Si vous utilisez Kotlin pour le développement Android, vous pouvez ajouter à l'
TextChangedListener()
aide de ce code:la source
Un peu en retard de réponse, mais voici une solution réutilisable:
Ainsi, lorsque ce qui précède est utilisé, tous les
setText()
appels qui se produisent dans TextWatcher n'entraîneront pas à nouveau l'appel de TextWatcher:la source
J'ai également rencontré le même problème
stackOverflow
et je continue d'obtenir des exceptions, et je viens avec la solution suivante.déclaré initialement booléen skipOnChange = false;
la source
Vous pouvez également utiliser la méthode hasFocus ():
Testé pour une mission universitaire sur laquelle je travaillais pour convertir des échelles de température lorsque l'utilisateur les tapait. Fonctionne parfaitement et c'est beaucoup plus simple.
la source
vérifiez String avant d'en définir un autre
EditText
sur vide. siField1
est vide, alors pourquoi changer à nouveau en ("")? afin que vous puissiez vérifier la taille de votre chaîne avec s.lenght () ou toute autre solutionune autre façon de vérifier la longueur de String est:
la source
J'ai écrit ma propre extension pour cela, très utile pour moi. (Kotlin)
Vous ne pouvez écrire que comme ça:
Mon extension:
la source
dans ce code noteid est essentiellement des arguments repris qui sont mis dans le retrait ou passés à travers le retrait.
le code à la baisse est essentiellement le code supplémentaire, si vous voulez comprendre plus clairement.
nouveau code d'activité nommé NoteEditor.java à des fins d'édition, mon application est simplement l'application de note.
la source
Dans Kotlin, utilisez simplement la fonction d' extension KTX : (Il utilise
TextWatcher
)importer
core-KTX
:la source
Nous pouvons supprimer le TextWatcher pour un champ juste avant de modifier son texte, puis le rajouter après avoir modifié le texte.
Déclarez Text Watchers pour field1 et field2 en tant que variables distinctes pour leur donner un nom: par exemple pour field1
puis ajoutez l'observateur en utilisant son nom:
field1.addTextChangedListener(Field_1_Watcher)
pour champ1 , etfield2.addTextChangedListener(Field_2_Watcher)
pour champ2Avant de modifier le texte field2, supprimez le TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
changez le texte:field2.setText("")
puis ajoutez le TextWatcher:
field2.addTextChangedListener(Field_2_Watcher)
Faites de même pour l'autre domaine
la source
Ajouter un arrière-plan dynamiquement dans la
onCreate
méthode:supprimez également l'arrière-plan de XML.
la source