J’ai un EditText
où je EditText
la propriété suivante pour que je puisse afficher le bouton Terminé sur le clavier lorsque l’utilisateur clique sur EditText.
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Lorsque l’utilisateur clique sur le bouton terminé sur le clavier de l’écran (fini de taper), je souhaite modifier l’état de RadioButton
.
Comment est-ce que je peux suivre le bouton fait quand il est frappé du clavier d’écran?
Je me suis retrouvé avec une combinaison de réponses Roberts et chirags:
((EditText)findViewById(R.id.search_field)).setOnEditorActionListener( new EditText.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // Identifier of the action. This will be either the identifier you supplied, // or EditorInfo.IME_NULL if being called due to the enter key being pressed. if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { onSearchAction(v); return true; } // Return true if you have consumed the action, else false. return false; } });
Mise à jour: Le code ci-dessus activera parfois le rappel deux fois. Au lieu de cela, j’ai opté pour le code suivant, que j’ai reçu des clients de chat Google:
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // If sortingggered by an enter key, this is the event; otherwise, this is null. if (event != null) { // if shift key is down, then we want to insert the '\n' char in the TextView; // otherwise, the default action is to send the message. if (!event.isShiftPressed()) { if (isPreparedForSending()) { confirmSendMessageIfNeeded(); } return true; } return false; } if (isPreparedForSending()) { confirmSendMessageIfNeeded(); } return true; }
Essayez ceci, cela devrait fonctionner pour ce dont vous avez besoin:
editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { @Override public boolean onEditorAction(EditText v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { //do here your stuff f return true; } return false; } });
Je sais que cette question est ancienne, mais je veux souligner ce qui a fonctionné pour moi.
J’ai essayé d’utiliser l’exemple de code du site Web Android Developers (illustré ci-dessous), mais cela n’a pas fonctionné. J’ai donc vérifié la classe EditorInfo et j’ai réalisé que la valeur entière IME_ACTION_SEND était spécifiée en tant que 0x00000004
.
Exemple de code à partir des développeurs Android:
editTextEmail = (EditText) findViewById(R.id.editTextEmail); editTextEmail .setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if (actionId == EditorInfo.IME_ACTION_SEND) { /* handle action here */ handled = true; } return handled; } });
J’ai donc ajouté la valeur entière à mon fichier res/values/integers.xml
.
0x00000004
Ensuite, j’ai modifié mon fichier de mise en page res/layouts/activity_home.xml
comme suit
Et puis, l’exemple de code a fonctionné.
alors, le code java est,
edittext.setOnEditorActionListener(new OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((actionId == EditorInfo.IME_ACTION_DONE)) { Log.i(TAG,"Here you can write the code"); return true; } return false; } });
Alors que la plupart des gens ont répondu directement à la question, je voulais en dire plus sur le concept sous-jacent. Tout d’abord, j’ai été attiré l’attention d’IME lorsque j’ai créé une activité de connexion par défaut. Il a généré du code pour moi qui comprenait ce qui suit:
Vous devriez déjà être familier avec l’atsortingbut inputType. Cela informe simplement Android du type de texte attendu, comme une adresse e-mail, un mot de passe ou un numéro de téléphone. La liste complète des valeurs possibles est disponible ici .
C’était cependant l’atsortingbut imeOptions="actionUnspecified"
que je ne comprenais pas son but. Android vous permet d’interagir avec le clavier qui apparaît depuis le bas de l’écran lorsque le texte est sélectionné à l’aide du InputMethodManager
. Dans le coin inférieur du clavier, il y a un bouton, en général il est dit “Suivant” ou “Terminé”, en fonction du champ de texte actuel. Android vous permet de personnaliser ceci en utilisant android:imeOptions
. Vous pouvez spécifier un bouton “Envoyer” ou “Suivant”. La liste complète peut être trouvée ici .
Avec cela, vous pouvez ensuite écouter des pressions sur le bouton d’action en définissant un object TextView.OnEditorActionListener
pour l’élément EditText
. Comme dans votre exemple:
editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { @Override public boolean onEditorAction(EditText v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { //do here your stuff f return true; } return false; } });
Maintenant, dans mon exemple, j’ai eu android:imeOptions="actionUnspecified"
atsortingbut. Ceci est utile lorsque vous souhaitez vous connecter à un utilisateur en appuyant sur la touche Entrée. Dans votre activité, vous pouvez détecter cette balise et ensuite tenter la connexion:
mPasswordView = (EditText) findViewById(R.id.password); mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { if (id == R.id.login || id == EditorInfo.IME_NULL) { attemptLogin(); return true; } return false; } });
Plus de détails sur la façon de définir OnKeyListener et de l’écouter pour le bouton Done.
Ajoutez d’abord OnKeyListener à la section implémentation de votre classe. Ajoutez ensuite la fonction définie dans l’interface OnKeyListener:
/* * Respond to soft keyboard events, look for the DONE press on the password field. */ public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { // Done pressed! Do something here. } // Returning false allows other listeners to react to the press. return false; }
Étant donné un object EditText:
EditText textField = (EditText)findViewById(R.id.MyEditText); textField.setOnKeyListener(this);