114 votes

Soumettre implicitement après avoir appuyé sur Done sur le clavier à la dernière EditText

J'ai utilisé certaines applications où lorsque je saisis mon nom d'utilisateur, puis passe à mon mot de passe, si je touche "Terminé" sur le clavier, le formulaire de connexion est automatiquement soumis, sans que je n'aie à cliquer sur le bouton de soumission. Comment est-ce fait ?

218voto

Hariharan Points 14174

Essayez ceci :

Dans votre mise en page, mettez/modifiez ceci :

Dans votre activité, mettez ceci (par exemple dans onCreate) :

 // votre champ de texte
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

submit_btn est votre bouton de soumission avec votre gestionnaire d'événements onclick attaché.

34voto

Solution simple et efficace avec Kotlin

Étendre EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Ensuite, utilisez la nouvelle méthode comme ceci:

editText.onSubmit { submit() }

submit() ressemble à ceci:

fun submit() {
    // appel à l'api
}

Extension plus générique

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

Et ensuite, vous pouvez l'utiliser pour écouter votre événement:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

29voto

flx Points 6617

Vous devez définir les options IME sur votre EditText.

Ensuite, ajoutez un OnEditorActionListener à la vue pour écouter l'action "done".

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO faire quelque chose
            handled = true;
        }
        return handled;
    }
});

Documentation officielle de l'API : https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent

6voto

Jitender Dev Points 7147

C'est ainsi que cela se fait

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if(actionId == EditorInfo.IME_ACTION_DONE){
            //faire quelque chose
        }
        return false;
    }
});

N'oubliez pas d'ajouter ce qui suit

actionDone dans votre EditText.

2voto

Madhu Kumar Points 60

Dans votre fichier XML à l'intérieur de votre balise edittext ajoutez le snippet ci-dessous

android:imeOptions="actionDone"

Ensuite, à l'intérieur de votre classe Java, écrivez le code ci-dessous

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int id, KeyEvent event) {
        if (id == EditorInfo.IME_ACTION_DONE) {
            //faites quelque chose ici
            return true;
        }
        return false;
    }
});

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