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.

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

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


26

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

android:imeOptions="actionSearch"

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.


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
    }

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

});

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

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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.