Je veux attraper un événement lorsque l'utilisateur a fini de modifier EditText.
Comment ceci peut être fait?
android
android-edittext
Eddyuk
la source
la source
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Réponses:
Lorsque l'utilisateur a terminé l'édition, il / elle appuiera sur
Done
ouEnter
la source
Mieux, vous pouvez également utiliser l'écouteur EditText onFocusChange pour vérifier si l'utilisateur a terminé la modification: (Ne comptez pas sur l'utilisateur appuyant sur le bouton Terminé ou Entrée du clavier logiciel)
Remarque: pour plus d'un EditText, vous pouvez également laisser votre classe implémenter
View.OnFocusChangeListener
puis définir les écouteurs sur chacun de vous EditText et les valider comme ci-dessousla source
EditText
. Il ne perdra jamais sa concentration.EditText
? Dois-je utiliseronEditorAction
?EditText
, vous validez ce que fait l'utilisateur pour quitter l'écran.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
même si j'ai tapé quelque chose. C'est un edittext qui n'accepte que les nombres.Personnellement, je préfère la soumission automatique après la fin de la saisie. Voici comment vous pouvez détecter cet événement.
Déclarations et initialisation:
Écouteur dans par exemple onCreate ()
Ainsi, lorsque le texte est modifié, le minuteur commence à attendre les prochains changements. Quand ils se produisent, la minuterie est annulée puis redémarrée.
la source
Handler
placeVous pouvez le faire en utilisant setOnKeyListener ou en utilisant un textWatcher comme:
Définir l'observateur de texte
editText.addTextChangedListener(textWatcher);
puis appelle
la source
Bien que de nombreuses réponses pointent dans la bonne direction, je pense qu'aucune d'elles ne répond à ce à quoi pensait l'auteur de la question. Ou du moins j'ai compris la question différemment parce que je cherchais une réponse à un problème similaire. Le problème est "Comment savoir quand l'utilisateur arrête de taper sans qu'il appuie sur un bouton" et déclencher une action (par exemple l'auto-complétion). Si vous voulez faire cela, démarrez le minuteur dans onTextChanged avec un délai que vous considérez que l'utilisateur a arrêté de taper (par exemple 500-700ms), pour chaque nouvelle lettre lorsque vous démarrez le minuteur, annulez la précédente (ou au moins utilisez une sorte de signalent que lorsqu'ils cochent, ils ne font rien). Voici un code similaire à celui que j'ai utilisé:
Notez que je modifie le drapeau booléen en cours d'exécution dans ma tâche asynchrone (la tâche obtient le json du serveur pour l'auto-complétion).
Gardez également à l'esprit que cela crée de nombreuses tâches de minuterie (je pense qu'elles sont planifiées sur le même fil de discussion que vous, mais vous devriez vérifier cela), il y a donc probablement de nombreux endroits à améliorer, mais cette approche fonctionne également et l'essentiel est que vous devriez utiliser un minuteur car il n'y a pas d'événement "L'utilisateur a arrêté de taper"
la source
@Reno et @Vinayak B répondent ensemble si vous souhaitez masquer le clavier après l'action
la source
Une approche différente ... voici un exemple: si l'utilisateur a un délai de 600 à 1000 ms lors de la frappe, vous pouvez considérer qu'il est arrêté.
la source
D'accord, cela fonctionnera à 100% à coup sûr.
Vous devrez d'abord configurer l'écouteur si le clavier est affiché ou masqué. Si le clavier est affiché, l'utilisateur est probablement en train de taper, sinon il est terminé.
la source
heightDiff > 100
truc est effrayant à mon humble avis.J'ai résolu ce problème de cette façon. J'ai utilisé du kotlin.
la source
J'ai eu le même problème et je ne voulais pas compter sur l'utilisateur appuyant sur Terminé ou Entrée.
Ma première tentative a été d'utiliser l'écouteur onFocusChange, mais il est arrivé que mon EditText ait le focus par défaut. Lorsque l'utilisateur appuyait sur une autre vue, onFocusChange était déclenché sans que l'utilisateur lui ait jamais attribué le focus.
La solution suivante l'a fait pour moi, où le onFocusChange est attaché si l'utilisateur a touché le EditText:
Dans mon cas, lorsque l'utilisateur a terminé de modifier l'écran a été rendu à nouveau, renouvelant ainsi l'objet myEditText. Si le même objet est conservé, vous devez probablement supprimer l'écouteur onFocusChange dans onFocusChange pour éviter le problème onFocusChange décrit au début de cet article.
la source
J'ai eu le même problème en essayant d'implémenter la saisie instantanée sur l'application de chat. essayez d'étendre EditText comme suit:
}
la source
Je l'ai terminée avec le même problème et je ne pouvais pas utiliser la solution avec onEditorAction ou onFocusChange et je ne voulais pas essayer la minuterie. Une minuterie est trop dangereuse pour peut goûter, à cause de tous les threads et trop imprévisible, car vous ne savez pas quand votre code est exécuté.
OnEditorAction n'attrape pas lorsque l'utilisateur quitte sans utiliser de bouton et si vous l'utilisez, notez que KeyEvent peut être nul. Le focus n'est pas fiable aux deux extrémités, l'utilisateur peut obtenir le focus et quitter sans entrer de texte ou sélectionner le champ et l'utilisateur n'a pas besoin de quitter le dernier champ EditText.
Ma solution utilise onFocusChange et un indicateur défini lorsque l'utilisateur commence à éditer du texte et une fonction pour obtenir le texte de la dernière vue focalisée, que j'appelle en cas de besoin.
Je viens d'effacer le focus sur tous mes champs de texte pour tromper le code de vue de texte de congé, le code clearFocus n'est exécuté que si le champ a le focus. J'appelle la fonction dans onSaveInstanceState afin de ne pas avoir à enregistrer l'indicateur (mEditing) comme état de la vue EditText et lorsque des boutons importants sont cliqués et lorsque l'activité est fermée.
Soyez prudent avec TexWatcher car il est souvent appelé J'utilise la condition sur le focus pour ne pas réagir lorsque le code onRestoreInstanceState entre du texte. je
la source
J'ai fait quelque chose comme cette classe abstraite qui peut être utilisée à la place du type TextView.OnEditorActionListener.
la source
Simple à déclencher, terminer la saisie dans EditText
a fonctionné pour moi, si vous utilisez java, convertissez-le
À Kotlin
la source