Utilisez la touche «ENTER» du clavier logiciel au lieu de cliquer sur le bouton

94

Bonjour, j'ai une recherche EditTextet une recherche Button. Lorsque je tape le texte recherché, j'aimerais utiliser la touche ENTRÉE sur le clavier logiciel au lieu de rechercher Buttonpour activer la fonction de recherche.

Merci d'avance pour votre aide.

Peter O.
la source

Réponses:

155

Vous le faites en définissant un OnKeyListenersur votre EditText.

Voici un exemple de mon propre code. J'ai un EditTextnommé addCourseText, qui appellera la fonction addCourseFromTextBoxlorsque la touche Entrée ou le D-pad est cliqué.

addCourseText = (EditText) findViewById(R.id.clEtAddCourse);
addCourseText.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
        {
            switch (keyCode)
            {
                case KeyEvent.KEYCODE_DPAD_CENTER:
                case KeyEvent.KEYCODE_ENTER:
                    addCourseFromTextBox();
                    return true;
                default:
                    break;
            }
        }
        return false;
    }
});
julien
la source
4
En fait, ce n'est pas garanti pour les touches programmables. Par exemple, cela ne fonctionne pas pour «ENTER» sur Nexus 7 (Android 4.2) et pour «BACK», c'est le cas.
Ghedeon
4
@Ghedeon vous pouvez définir le android:inputType="text"xml du texte d'édition pour afficher la touche Entrée par rapport au clavier par défaut qui a un retour chariot.
Nick
2
Cette méthode n'est pas garantie de fonctionner à partir de Jellybean, voir developer.android.com/reference/android/view/KeyEvent.html
Constantin
@Ghedeon alors comment le faire fonctionner pour "ENTER" sur Nexus 7?
HairOfTheDog
3
Cette solution est complètement cassée sur de nombreux appareils, Nexus 7 inclus. Ne l'utilisez pas!
user3562927
44
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Vous pouvez ensuite écouter les pressions sur le bouton d'action en définissant un TextView.OnEditorActionListener pour l'élément EditText. Dans votre écouteur, répondez à l'ID d'action IME approprié défini dans la classe EditorInfo, tel que IME_ACTION_SEND. Par exemple:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Source: https://developer.android.com/training/keyboard-input/style.html

Andrii Kovalchuk
la source
26

peut-être que vous pourriez ajouter un attribut à votre EditText comme ceci:

android:imeOptions="actionSearch"
article sur
la source
1
Il s'agit d'une solution plus simple si vous créez un texte d'édition de recherche.
stevyhacker
besoin de définir android:inputType="text"également
li2
6

ajouter un attribut au EditText comme android: imeOptions = "actionSearch"

c'est la meilleure façon de faire la fonction

et les imeOptions ont également d'autres valeurs comme "go" 、 "next" 、 "done" etc.

ruyi.zhu
la source
2

Nous pouvons également utiliser Kotlin lambda

editText.setOnKeyListener { _, keyCode, keyEvent ->
        if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Log.d("Android view component", "Enter button was pressed")
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
Artem Botnev
la source
0

Pour éviter que le focus ne passe au champ modifiable suivant (si vous en avez un), vous souhaiterez peut-être ignorer les événements key-down, mais gérer les événements key-up. Je préfère également filtrer d'abord sur le keyCode, en supposant qu'il serait légèrement plus efficace. Au fait, rappelez-vous que renvoyer true signifie que vous avez géré l'événement, donc aucun autre auditeur ne le fera. Bref, voici ma version.

ETFind.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (keyCode ==  KeyEvent.KEYCODE_DPAD_CENTER
        || keyCode ==  KeyEvent.KEYCODE_ENTER) {

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                // do nothing yet
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                        findForward();      
            } // is there any other option here?...

            // Regardless of what we did above,
            // we do not want to propagate the Enter key up
            // since it was our task to handle it.
            return true;

        } else {
            // it is not an Enter key - let others handle the event
            return false;
        }
    }

});
Wojtek Jarosz
la source
0

ceci est un exemple d'une de mes applications comment je gère

 //searching for the Edit Text in the view    
    final EditText myEditText =(EditText)view.findViewById(R.id.myEditText);
        myEditText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                 if (event.getAction() == KeyEvent.ACTION_DOWN)
                      if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
                             (keyCode == KeyEvent.KEYCODE_ENTER)) {
                                //do something
                                //true because you handle the event
                                return true;
                               }
                       return false;
                       }
        });
Alejandro Serret
la source
0

Le moyen le plus récent pour y parvenir est:

Ajoutez ceci à votre EditText en XML:

android:imeOptions="actionSearch"

Puis dans votre activité / fragment:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Hasan TBT
la source