240 votes

Comment gérer le clic sur le bouton "done" de ImeOptions ?

J'ai un EditText où je définis la propriété suivante afin de pouvoir afficher le bouton "done" sur le clavier lorsque l'utilisateur clique sur l'EditText.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Lorsque l'utilisateur clique sur le bouton "Terminé" du clavier de l'écran (lorsqu'il a fini de taper), je veux modifier un paramètre de l'écran. RadioButton l'État.

Comment puis-je suivre le bouton fait quand il est frappé à partir du clavier de l'écran ?

Screenshot showing the bottom right 'done' button on the software keyboard

1 votes

Peut-être que OnKeyboardActionListener m'aidera à trouver un exemple de code ?

18voto

Robert Hawkey Points 213

Plus de détails sur la façon de définir l'écouteur OnKeyListener et de le faire écouter le bouton Done.

Ajoutez d'abord OnKeyListener à la section implements 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 objet EditText :

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);

2 votes

Cela ne fonctionne plus sur les applications visant le niveau 17+ de l'API, car votre OnKeyListener n'est plus activé pour les événements liés aux touches programmables : developer.Android.com/reference/Android/text/method/

0 votes

Suggèrent-ils une alternative maintenant ?

2 votes

J'utilise désormais setOnEditorActionListener pour rechercher EditorInfo.IME_ACTION_DONE, ce qui semble bien fonctionner.

17voto

Donato Points 1745

Bien que la plupart des gens aient répondu directement à la question, je voulais approfondir le concept qui se cache derrière. Tout d'abord, l'attention d'IME a été attirée sur moi lorsque j'ai créé une activité de connexion par défaut. Il a généré un certain code pour moi qui comprenait ce qui suit :

<EditText
  android:id="@+id/password"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="@string/prompt_password"
  android:imeActionId="@+id/login"
  android:imeActionLabel="@string/action_sign_in_short"
  android:imeOptions="actionUnspecified"
  android:inputType="textPassword"
  android:maxLines="1"
  android:singleLine="true"/>

Vous devriez déjà être familiarisé avec l'attribut inputType. Celui-ci informe simplement Android du type de texte attendu, tel qu'une adresse électronique, un mot de passe ou un numéro de téléphone. La liste complète des valeurs possibles se trouve à l'adresse suivante aquí .

C'était, cependant, l'attribut imeOptions="actionUnspecified" que je ne comprenais pas son but. Android vous permet d'interagir avec le clavier qui s'affiche en bas de l'écran lorsque du texte est sélectionné en utilisant la fonction InputMethodManager . Dans le coin inférieur du clavier, il y a un bouton, qui indique généralement "Suivant" ou "Terminé", selon le champ de texte en cours. Android vous permet de le personnaliser en utilisant android:imeOptions . Vous pouvez spécifier un bouton "Envoyer" ou "Suivant". La liste complète peut être trouvée aquí .

Avec cela, vous pouvez ensuite écouter les pressions sur le bouton d'action en définissant une fonction TextView.OnEditorActionListener pour le EditText élément. 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;
    } 
});

Dans mon exemple, j'avais android:imeOptions="actionUnspecified" attribut. Ceci est utile lorsque vous voulez essayer de connecter un utilisateur lorsqu'il appuie sur la touche Entrée. Dans votre activité, vous pouvez détecter cette balise et tenter d'ouvrir une session :

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

12voto

CoolMind Points 11

Merci à chikka.anddev y Alex Cohn en Kotlin, c'est le cas :

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE ||
        event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
        doSomething()
        true
    } else {
        false
    }
}

Ici, je vérifie Enter car elle renvoie EditorInfo.IME_NULL au lieu de IME_ACTION_DONE .

Voir aussi Android imeOptions="actionDone" ne fonctionne pas . Ajouter android:singleLine="true" dans le EditText .

0voto

Rafael Rocha Points 19

Si vous utilisez les annotations Android https://github.com/androidannotations/androidannotations

Vous pouvez utiliser l'annotation @EditorAction

@EditorAction(R.id.your_component_id)
void onDoneAction(EditText view, int actionId){
    if(actionId == EditorInfo.IME_ACTION_DONE){
        //Todo: Do your work or call a method
    }
}

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