android EditText - terminé la saisie de l'événement
Je veux attraper un événement lorsque l'utilisateur a terminé l'édition EditText.
Comment peut-il être fait?
- La façon la plus naturelle serait si l'accent se perd, dans l'EditText - ensuite, l'utilisateur est certainement le fait, cependant, d'expérience, il semble que tous les widgets android sont correctement l'accaparement des focus (j'ai eu ces problèmes avec les Filateurs et les Boutons) - afin que d'autres widgets peuvent ne pas perdre le focus...
- pourquoi une telle plate-forme nous occuper de ce genre de fonctions simples? google ne perdrez rien si on ajoute à ces principales caractéristiques de leurs bibliothèques de prise en charge au moins
- Si vous connaissez la longueur exacte de la chaîne de l'utilisateur va entrer puis, mettre le texte en afterTextChanged. Ex:
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
- Je suis de me gratter la tête en me demande pourquoi c'est si difficile dans Android, que nous (moi y compris), le besoin de recherche et commencer une discussion en ligne et de nombreuses solutions différentes avec plus de 10 lignes de code..?
Vous devez vous connecter pour publier un commentaire.
Lorsque l'utilisateur a terminé l'édition, il sera presse de la
Done
ouEnter
La meilleure façon, vous pouvez également utiliser EditText onFocusChange auditeur pour vérifier si l'utilisateur a terminé l'édition: (pas Besoin de compter sur l'utilisateur en appuyant sur le Fait ou la touche Entrée sur le clavier)
EditText
. Il ne faudra jamais perdre de vue l'objectif.EditText
? Dois-je utiliseronEditorAction
?EditText
, vous validez sur tout ce que l'utilisateur ne doit 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 des nombres.Personnellement, je préfère automatique soumettre après la fin de la saisie. Voici comment vous pouvez détecter cet événement.
Déclarations et d'initialisation:
Auditeur, par exemple onCreate()
Ainsi, lorsque le texte est modifié, le minuteur commence à attendre pour les prochaines modifications à se produire. Quand ils se déroulent de la minuterie est annulée et puis a commencé une fois de plus.
Handler
au lieuVous pouvez le faire en utilisant setOnKeyListener ou à l'aide d'un textWatcher comme:
Texte watcher
editText.addTextChangedListener(textWatcher);
alors appel
Bien que de nombreuses réponses ne sont point dans la bonne direction, je pense qu'aucun d'entre eux répond à ce que l'auteur de la question a été de réfléchir. Ou, au moins, j'ai compris la question différemment, parce que je cherchais la réponse à un problème similaire.
Le problème est "Comment savoir lorsque l'utilisateur arrête de taper sans lui en appuyant sur un bouton", et déclencher une action (par exemple l'auto-complétion). Si vous souhaitez faire démarrer la Minuterie dans onTextChanged avec un retard que l'on peut considérer comme utilisateur arrêté de frappe (par exemple 500-700ms), pour chaque nouvelle lettre lorsque vous démarrez le chronomètre annuler la précédente (ou au moins utiliser une sorte de drapeau que quand ils tique qu'ils ne font rien). Voici un code similaire à ce que j'ai utilisé:
Noter que j'ai modifier exécution de drapeau booléen à l'intérieur de mon async task (Tâche devient le json à partir du serveur pour l'auto-complétion).
Également garder à l'esprit que cela crée beaucoup de minuterie de tâches (je pense qu'ils sont programmés sur le même Thread tu mais faudrait vérifier cela), alors il y a probablement beaucoup d'endroits pour s'améliorer, mais cette approche fonctionne aussi et la ligne de fond est que vous devez utiliser une Minuterie puisqu'il n'est pas "Utilisateur arrêté de taper événement"
les deux @Reno et @Vinayak B réponses ensemble, si vous souhaitez masquer le clavier après l'action
Une approche différente ... voici un exemple:
Si l'utilisateur dispose d'un délai de 600-1000ms lors de la saisie, vous pouvez envisager de il est arrêté.
JS:
D'accord ce sera à 100% pour vous.
D'abord, vous aurez besoin de configurer écoute si le clavier est d'afficher ou de masquer.
Si le clavier est en montrant alors probablement utilisateur est en train de taper, sinon fini de taper.
heightDiff > 100
truc est effrayant à mon humble avis.J'ai eu le même problème et qui n'ont pas besoin de s'appuyer sur l'utilisateur en appuyant sur Fait ou Enter.
Ma première tentative a été d'utiliser le onFocusChange l'auditeur, mais il est apparu que mon EditText obtenu le focus par défaut. Lorsque l'utilisateur a appuyé sur quelque autre point de vue, la onFocusChange a été déclenchée sans que l'utilisateur n'avoir jamais attribué le focus.
Solution suivante il l'a fait pour moi, d'où le onFocusChange si l'utilisateur a touché le EditText:
Dans mon cas, lorsque l'utilisateur a terminé le montage de l'écran a été réaffichées, en renouvelant la myEditText objet. Si le même objet est conservé, vous devriez probablement supprimer la onFocusChange auditeur dans onFocusChange pour empêcher la onFocusChange problème décrit au début de ce post.
J'ai eu le même problème lorsque vous essayez de mettre en oeuvre une "maintenant taper" sur l'application de chat.
essayez d'étendre EditText comme suit:
}
J'ai fini le même problème et je ne pouvais pas utiliser la solution avec onEditorAction ou onFocusChange et je ne voulais pas essayer de la minuterie. Une minuterie est trop dangereux pour le mois de mai goût, parce que de toutes les discussions et trop imprévisibles, que vous ne savez pas quand vous code est exécuté.
La onEditorAction ne pas attraper lorsque l'utilisateur de quitter sans l'aide d'un bouton et si vous l'utilisez, s'il vous plaît notez que KeyEvent peut être null. L'accent n'est pas fiable à ses deux extrémités, l'utilisateur peut obtenir concentrer et de laisser sans entrer n'importe quel texte ou en sélectionnant le champ et l'utilisateur n'a pas besoin de quitter la dernière EditText champ.
Ma solution utiliser onFocusChange et d'un indicateur défini lorsque l'utilisateur démarre l'édition d'un texte et d'une fonction permettant d'obtenir le texte de la dernière vue, ce que j'appelle quand le besoin.
Je viens d'effacer l'accent sur tous mes champs de texte à tricker le congé de texte afficher le code, Le clearFocus code est exécuté seulement si le champ a le focus. J'ai appeler la fonction dans onSaveInstanceState donc je n'ai pas pour sauver le drapeau (mEditing) comme un état de l'EditText vue lors de boutons importants est cliqué et lorsque l'activité est fermé.
Être prudent avec TexWatcher comme il est appel souvent j'utilise la condition au point de ne pas réagir lorsque l'onRestoreInstanceState code de la saisie de texte.
Je
J'ai fait quelque chose comme cette classe abstraite qui peut être utilisé à la place de TextView.OnEditorActionListener type.