web-dev-qa-db-fra.com

Comment gérer le clic sur le bouton Terminé d'ImeOptions?

J'ai une EditText où je suis en train de définir la propriété suivante afin que je puisse afficher le bouton Terminé sur le clavier lorsque l'utilisateur clique sur le texte d'édition.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Lorsque l'utilisateur clique sur le bouton Terminé du clavier à l'écran (la saisie est terminée), je souhaite modifier un état RadioButton.

Comment puis-je suivre le bouton done lorsqu'il est frappé depuis le clavier à l'écran?

enter image description here

158
d-man

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 active 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 triggered 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;
}
191
Thomas Ahle

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;
    } 
});
93
chikka.anddev
   <EditText Android:imeOptions="actionDone" 
    Android:inputType="text"/>

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;
    }
    });
24
Vinoj Vetha

Je sais que cette question est ancienne, mais je tiens à souligner ce qui a fonctionné pour moi.

J'ai essayé d'utiliser l'exemple de code du site Web Android Developers (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 sous la forme 0x00000004.

Exemple de code provenant de 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.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

Ensuite, j'ai édité mon fichier de mise en page res/layouts/activity_home.xml comme suit

<EditText Android:id="@+id/editTextEmail"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:imeActionId="@integer/send"
  Android:imeActionLabel="@+string/send_label"
  Android:imeOptions="actionSend"
  Android:inputType="textEmailAddress"/>

Et puis, l'exemple de code a fonctionné.

24
iRuth

Bien que la plupart des gens aient répondu directement à la question, je voulais développer davantage le concept qui la sous-tend. Tout d'abord, j'ai attiré l'attention d'IME lorsque j'ai créé une activité de connexion par défaut. Il a généré un 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 devez déjà être familiarisé avec l'attribut inputType. Cela indique simplement à Android le 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 peut être trouvée ici

C'est toutefois l'attribut imeOptions="actionUnspecified" que je n'ai pas compris son objectif. Android vous permet d'interagir avec le clavier qui apparaît du bas de l'écran lorsque du texte est sélectionné à l'aide de la variable InputMethodManager. Dans le coin inférieur du clavier, il y a un bouton, généralement indiqué "Suivant" ou "Terminé", en fonction du champ de texte actuel. Android vous permet de personnaliser cela 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 alors écouter les appuis sur le bouton d'action en définissant un 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'avais l'attribut Android:imeOptions="actionUnspecified". Ceci est utile lorsque vous souhaitez essayer de connecter un utilisateur lorsqu'il appuie sur la touche Entrée. Dans votre activité, vous pouvez détecter cette balise puis tenter de vous connecter:

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

Plus de détails sur la façon de définir OnKeyListener et de le laisser écouter pour le bouton Terminé.

Commencez par ajouter 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);
14
Robert Hawkey

Merci à chikka.anddev à Kotlin, c’est:

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        button.performClick()
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
0
CoolMind