523 votes

Android - Gérer la touche "Entrée" dans un EditText

Je me demande s'il existe un moyen de gérer l'utilisateur qui appuie sur le bouton Enter pendant que vous tapez dans un EditText quelque chose comme l'événement HTML onSubmit.

Je me demande également s'il existe un moyen de manipuler le clavier virtuel de manière à ce que le bouton "Done" porte un autre nom (par exemple "Go") et exécute une certaine action lorsqu'il est cliqué (à nouveau, comme onSubmit).

2 votes

Kotlin & Extensions : jetez un coup d'œil ici : stackoverflow.com/a/48810268/1912924

411voto

CommonsWare Points 402670

Je me demande s'il existe un moyen de gérer l'utilisateur qui appuie sur Enter tandis que en train de taper dans un EditText, quelque chose comme l'événement HTML onSubmit.

Sí.

Je me demande également s'il existe un moyen de manipuler le clavier virtuel de manière à ce que de manière à ce que le bouton "Done" soit porte un autre nom (par exemple "Go") et qu'il exécute une certaine action lorsqu'il est cliqué lorsqu'il est cliqué (à nouveau, comme onSubmit).

Oui aussi.

Vous voudrez bien regarder le android:imeActionId y android:imeOptions ainsi que les attributs setOnEditorActionListener() tous sur TextView .

Pour changer le texte du bouton "Done" en une chaîne personnalisée, utilisez :

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

27 votes

(P.S. EditText étend TextView, c'est pourquoi les propriétés que vous devez regarder sont sur TextView - quand j'ai lu cette dernière phrase, j'ai fait une double prise :) )

1 votes

Ouais, je ne suis pas sûr de savoir pourquoi tant de choses qui semblent spécifiques à l'édition sont sur TextView et non EditText . Je pense que soit il y a d'autres classes de type champ en usage, soit ils se réservent le droit pour ce genre de choses.

17 votes

À noter . Tous les claviers ne supportent pas l'attribut standard Android:imeOptions. Ce qui est vraiment décevant. Par exemple, IME_ACTION_DONE est défini comme 6, alors que le clavier par défaut de HTC (sur les téléphones comme Incredible, Evo 4G) la touche retour est définie comme 0.

313voto

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

0 votes

Cela créerait un problème en cas de copier-coller dans le champ EditText.

2 votes

Pour une raison quelconque, lorsque je clique sur enter dans mon texte d'édition, l'ensemble du texte d'édition se déplace vers le bas... Comment puis-je corriger cela ?

2 votes

@RuchirBaronia Ajoutez Android:maxLines="1" à votre EditText. Votre EditText ne se "déplace pas vers le bas", mais insère plutôt un saut de ligne dans le texte saisi. Le fait de définir maxLines à 1 empêche l'insertion du saut de ligne.

220voto

Chad Hedgcock Points 2198

Voici ce que vous devez faire. C'est également caché dans l'exemple de code "Bluetooth Chat" du développeur Android. Remplacez les parties en gras qui disent "exemple" avec vos propres variables et méthodes.

Tout d'abord, importez ce dont vous avez besoin dans l'activité principale où vous voulez que le bouton de retour fasse quelque chose de spécial :

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Maintenant, faites une variable de type TextView.OnEditorActionListener pour votre clé de retour (ici j'utilise exampleListener ) ;

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Ensuite, vous devez dire à l'auditeur deux choses sur ce qu'il doit faire lorsque le bouton retour est pressé. Il doit savoir de quel EditText il s'agit (ici j'utilise exempleVoir ), puis il doit savoir ce qu'il faut faire lorsque la touche Entrée est enfoncée (ici, exemple_confirm() ). S'il s'agit du dernier ou du seul EditText de votre activité, il doit faire la même chose que la méthode onClick de votre bouton Submit (ou OK, Confirm, Send, Save, etc.).

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Enfin, définissez l'écouteur (très probablement dans votre méthode onCreate) ;

exampleView.setOnEditorActionListener(exampleListener);

21 votes

Bien, j'ai utilisé EditorInfo.IME_ACTION_SEND et j'ai Android:imeOptions="actionSend" sur le XML.

0 votes

La recherche de EditorInfo.IME_ACTION_SEND n'a pas eu d'effet pour moi (émulateur) donc comme déclencheur infaillible j'ai aussi cherché KeyEvent.KEYCODE_ENTER. Voir ici : stackoverflow.com/questions/2004344/

5 votes

Il est généralement préférable d'effectuer des actions sur KeyEvent.ACTION_UP . Pour que cela fonctionne, vous devez d'abord consommer l'option ACTION_DOWN événement : if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; } . Ensuite, vous pouvez vérifier si le ACTION_UP et effectuer l'action (similaire à la réponse ci-dessus). Si vous ne consommez pas l'événement ACTION_DOWN l'événement, alors onEditorAction ne seront pas appelés pour ACTION_UP .

44voto

earlcasper Points 319

Les claviers matériels produisent toujours des événements d'entrée, mais les claviers logiciels renvoient différents actionID et nuls dans les EditTexts à ligne unique. Ce code répond à chaque fois que l'utilisateur appuie sur la touche Entrée dans un EditText pour lequel cet écouteur a été défini, quel que soit le type d'EditText ou de clavier.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.

    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

L'apparence par défaut de la touche d'entrée dans singleLine=false donne un clavier d'entrée à flèche coudée. Lorsque singleLine=true dans le dernier EditText, la touche indique DONE, et dans les EditTexts précédents, elle indique NEXT. Par défaut, ce comportement est cohérent sur tous les émulateurs vanilla, Android et google. L'attribut scrollHorizontal ne fait aucune différence. Le test null est important car la réponse des téléphones aux entrées programmées est laissée au fabricant et même dans les émulateurs, les émulateurs vanilla Level 16 répondent aux longues entrées programmées dans les EditTexts multi-lignes et scrollHorizontal avec un actionId de NEXT et un null pour l'événement.

0 votes

Quand j'ai mis à jour Java, ma chaîne d'outils Android s'est cassée. C'était un 32 bits. J'ai tout réinstallé en 64 bits et j'ai découvert qu'il y a beaucoup plus de versions publiques d'émulateurs disponibles maintenant. Je dois admettre que je sais seulement que le comportement de l'EditorActionListener est cohérent dans les émulateurs que j'ai testés.

0 votes

Lorsque j'ai publié ce message sur mon blog, quelqu'un a fait remarquer que pour que cela fonctionne sur Eclipse, il fallait modifier l'action ime par défaut, en ajoutant Android:imeOptions="actionGo".

0 votes

Oups, j'ai mal lu le commentaire sur mon billet de blog. Pour que cela fonctionne sur eclipse, vous devez changer l'action ime par défaut, en ajoutant Android:imeOptions="actionGo". à l'"EditText" dans le layout xml.

22voto

Newbie Points 180

Je sais que cela date d'un an, mais je viens de découvrir que cela fonctionne parfaitement pour un EditText.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Il empêche tout sauf le texte et l'espace. Je ne pouvais pas tabuler, "retourner" (" \n "), ou autre.

0 votes

Cela a fonctionné pour moi, avec l'ajout de l'option IME_ACTION_DONE.

1 votes

Fonctionne parfaitement bien si vous voulez désactiver la touche "Entrée".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X