93 votes

Listener pour le bouton Done sur EditText ?

Si j'ai un EditText et que je veux écouter si l'utilisateur appuie sur le bouton "terminé" du clavier, comment dois-je faire ?

1 votes

Un point à prendre en compte : le téléphone peut avoir un clavier physique, et l'utilisateur peut ne jamais appuyer sur le bouton "Terminer" du clavier. Avez-vous pensé à effectuer votre opération en fonction de la perte du focus ou de la fin de l'édition d'un texte ?

0 votes

162voto

Jone Points 552

La réponse de Dinash est bien, mais elle ne fonctionne pas sur tous les appareils. Le code ci-dessous fonctionne bien sur tous les appareils

edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
});

6 votes

Cette réponse devrait être acceptée - c'est celle qui fonctionne sur le Samsung s4

5 votes

Ajout : La balise xml " Android:imeOptions="actionDone" " doit être définie sur l'EditText en question. Cela fonctionne très bien - merci !

102voto

Dinash Points 2190

Le code est

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
});

Dans ce cas, 'edittext' est l'identifiant du champ de texte.

Consultez ce lien Il suffit de définir setOnKeyListener à votre editText

6 votes

Salut Dinash. Le fait de poster un lien n'est généralement pas utile. Il est préférable de fournir un exemple de code qui répond à la question de l'auteur de la demande, puis d'établir un lien vers l'article source à titre de référence ou pour une lecture plus approfondie.

0 votes

Bonjour Chris, je pensais que vous pouviez trouver la réponse à partir de ce lien lui-même, mais j'ai quand même donné un code exact disponible dans le lien lui-même... Le code est final EditText edittext = (EditText) findViewById(R.id.edittext) ; edittext.setOnKeyListener(new OnKeyListener() {public boolean onKey(View v, int keyCode, KeyEvent event event) {if ((event.getAction() == KeyEvent. ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show() ; return true;}return false;}}) ; J'espère que cela vous sera utile... Dans ce cas, 'edittext' est l'identifiant du champ de texte.

0 votes

Il ne fonctionnera pas sur les claviers personnalisés. setOnKeyListener ne sera pas appelé sur certains claviers personnalisés.

20voto

Gibolt Points 4072

Solution d'extension Kotlin

La méthode de base pour gérer l'action effectuée en Kotlin est la suivante :

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call onDone result here
        true
    }
    false
}

Extension Kotlin

Utilisez-le pour appeler edittext.onDone {/*action*/} dans votre code principal. Cela le rend plus lisible et plus facile à maintenir.

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

N'oubliez pas d'ajouter ces options à votre Xml d'edittext, si ce n'est pas dans le code

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Si vous avez besoin inputType="textMultiLine" soutien, lire cet article

0 votes

Juste une remarque pour tout le monde, Android:imeOptions="actionDone" ne fonctionne pas uniformément sur tous les appareils, je l'ai explicitement évité autant que possible car les appareils plus anciens avec des écouteurs de touches qui fonctionnent commencent à les ignorer lorsque cette option est active. Je trouve aussi qu'il peut vous mettre dans des endroits bizarres, il a aussi récupéré la touche de retour arrière sur le Samsung S20.

2 votes

Vous devriez ajouter explicitement return@setOnEditorActionListener parce que "if" n'est pas la dernière déclaration.

7voto

Emmanuel GH Points 145

Sur la base de la réponse d'Asad Rao, j'ai créé cette fonction d'extension KOTLIN.

fun TextView.onClickKeyboardDoneButton(funExecute: () -> Unit) {
    this.setOnEditorActionListener { _, actionId, _ ->
        when (actionId) {
            EditorInfo.IME_ACTION_DONE -> {
                funExecute.invoke()
                true
            }
            else -> false
        }
    }
}

Utilisez :

myEditText.onClickKeyboardDoneButton{myFunctionToExecuteWhenUserClickDone()}

6voto

Serg Burlaka Points 674

Le site même Jone réponse, mais avec des lambdas remplacés :

etPointCombatFirst.setOnEditorActionListener((v, actionId, event) -> {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                    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