Comment puis-je détecter un événement clé de suppression (retour arrière) pour un editText? J'ai essayé d'utiliser TextWatcher, mais lorsque le editText est vide, lorsque j'appuie sur la touche Suppr, rien ne se passe. Je veux détecter la touche de suppression appuyée sur un editText même s'il n'a pas de texte.
android
events
android-edittext
key
Buda Gavril
la source
la source
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL
si vous ne voulez pas que l'événement tire deux fois par pression de retour arrièreCela fait un moment que vous n'avez pas posé la question, mais j'ai juste eu le même problème. Comme déjà mentionné par Estel, le problème avec les auditeurs clés est qu'ils ne fonctionnent qu'avec des claviers matériels. Pour ce faire avec un IME (soft keyboard) , la solution est un peu plus élaborée.
La seule méthode que nous voulons remplacer est
sendKeyEvent
dans la classeEditText
'sInputConnection
. Cette méthode est appelée lorsque des événements clés se produisent dans un IME. Mais pour remplacer cela, nous devons implémenter unEditText
qui remplace laonCreateInputConnection
méthode, enveloppant l'InputConnection
objet par défaut dans une classe proxy! : |Cela semble compliqué, mais voici l'exemple le plus simple que je puisse trouver:
La ligne avec l'appel à
setRandomBackgroundColor
est l'endroit où mon action spéciale de retour arrière se produit. Dans ce cas, changer laEditText
couleur d'arrière-plan de.Si vous gonflez cela à partir de XML, n'oubliez pas d'utiliser le nom complet du package comme balise:
la source
Ce n'est qu'un ajout à la réponse d'Idris, ajoutant également le remplacement à deleteSurroundingText. J'ai trouvé plus d'informations à ce sujet ici: Android: Backspace dans WebView / BaseInputConnection
la source
deleteSurroundingText
bit était exactement ce dont j'avais besoin après avoir essayé d'innombrables autres solutions.Voici ma solution simple, qui fonctionne pour toutes les API:
MISE À JOUR 17.04.18 .
Comme indiqué dans les commentaires, cette solution ne suit pas la presse de retour arrière si EditText est vide (comme la plupart des autres solutions).
Cependant, c'est suffisant pour la plupart des cas d'utilisation.
PS Si je devais créer quelque chose de similaire aujourd'hui, je ferais:
Ensuite, utilisez-le simplement comme TextWatcher normal:
la source
J'ai envoyé 2 jours pour trouver une solution et j'ai trouvé une solution fonctionnelle :) (sur les touches programmables)
Après avoir ajouté le textwatcher à votre EditText:
J'espère que cela fonctionne également sur d'autres appareils Android (Samsung, LG, etc.).
la source
Ma solution simple qui fonctionne parfaitement. Vous devriez ajouter un drapeau. Mon extrait de code:
la source
Exemple de création d'EditText avec TextWatcher
TextWatcher personnalisé
la source
pour quelqu'un qui utilise Kotlin
addOnTextChanged
n'est pas assez flexible pour gérer certains cas (ex: détecter si l'utilisateur appuie sur supprimer lorsque le texte d'édition était vide)setOnkeyListener
travaillé même clavier souple ou clavier dur! mais juste sur certains appareils . Dans mon cas, cela fonctionne sur Samsung s8 mais pas sur Xiaomi mi8 se.si vous utilisez kotlin, vous pouvez utiliser la fonction crossline,
doOnTextChanged
c'est la même chose queaddOnTextChanged
mais le rappel est déclenché même si le texte d'édition était vide.REMARQUE: doOnTextChanged fait partie de la bibliothèque Android KTX
la source
doOnTextChanged
fonction d'extension est accessible dans la bibliothèque Android KTXEditText
? Merci d'avanceIl y a une question similaire dans le Stackoverflow. Vous devez remplacer
EditText
pour accéder à l'InputConnection
objet qui contient ladeleteSurroundingText
méthode. Cela vous aidera à détecter l'événement de suppression (retour arrière). S'il vous plaît, jetez un œil à une solution que j'ai fournie là-bas Android - ne peut pas capturer le retour arrière / supprimer appuyez sur soft. clavierla source
Cela semble fonctionner pour moi:
la source
Je suis également confronté au même problème dans Dialog .. parce que j'utilise setOnKeyListener .. Mais j'ai défini le retour par défaut sur true. Après changement comme ci-dessous, le code fonctionne très bien pour moi.
la source
Basé sur @Jiff,
ZanyEditText
voiciWiseEditText
avecsetSoftKeyListener(OnKeyListener)
la source
Mon problème était que j'avais une coutume
Textwatcher
, donc je ne voulais pas ajouterOnKeyListener
à unEditText
ainsi que je ne voulais pas créer de coutumeEditText
. Je voulais détecter si le retour arrière était pressé dans maafterTextChanged
méthode, donc je ne devrais pas déclencher mon événement.C'est ainsi que j'ai résolu ce problème. J'espère que ce serait utile pour quelqu'un.
la source
J'ai testé la solution de @ Jeff sur la version 4.2, 4.4, 6.0. Sur les versions 4.2 et 6.0, cela fonctionne bien. Mais sur 4.4, cela ne fonctionne pas.
J'ai trouvé un moyen simple de contourner ce problème. Le point clé est d'insérer un caractère invisible dans le contenu de EditText au début et de ne pas laisser l'utilisateur déplacer le curseur avant ce caractère. Ma façon est d'insérer un caractère d'espace blanc avec un ImageSpan de largeur nulle dessus. Voici mon code.
Et nous avons besoin d'un EditText personnalisé qui a un SelectionChangeListener
}
Et la dernière étape
Et maintenant, nous avons terminé ~ Nous pouvons détecter l'événement de touche de retour arrière lorsque EditText n'a pas de contenu réel, et l'utilisateur ne saura rien de notre astuce.
la source
Cette question est peut-être ancienne, mais la réponse est vraiment simple en utilisant un TextWatcher.
la source
J'ai trouvé une solution vraiment simple qui fonctionne avec un clavier logiciel.
la source
Vous pouvez définir un écouteur de clé sur l'activité et, dans la méthode de rappel, vous pouvez détecter quelle touche l'utilisateur a frappé. Le code ci-dessous est pour votre référence. J'espère que ça aide.
la source