Comment gérer le clic sur le bouton ImeOptions?

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?

entrer la description de l'image ici

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);