web-dev-qa-db-fra.com

Utilisez la touche "Entrée" sur le clavier logiciel au lieu de cliquer sur le bouton

Bonjour J'ai une recherche EditText et une recherche Button. Lorsque je tape le texte recherché, j'aimerais utiliserENTRERsur la touche programmable au lieu de search Button pour activer la fonction de recherche.

Merci d'avance pour votre aide.

86
Peter O.

Vous le faites en définissant une OnKeyListener sur votre EditText.

Voici un exemple de mon propre code. J'ai un EditText nommé addCourseText, qui appellera la fonction addCourseFromTextBox lorsque l'utilisateur clique sur la touche Entrée ou sur le pavé tactile.

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;
    }
});
136
Julian
<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 appuis 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

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

Android:imeOptions="actionSearch"
25
itemon

ajouter un attribut à EditText comme Android: imeOptions = "actionSearch" 

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

et les imeOptions ont aussi d'autres valeurs comme "go" next "next" "done" etc.

5
ruyi.zhu

On peut aussi 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
    }
1
Artem Botnev

ceci est un échantillon de l'un de mes app 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
Alejandro Serret

Pour éviter que le focus ne passe au champ éditable suivant (si vous en avez un), vous pouvez ignorer les événements de raccourci clavier, mais gérer les événements de raccourci clavier. Je préfère également filtrer d'abord sur le keyCode, en supposant qu'il serait légèrement plus efficace. En passant, rappelez-vous que si vous retournez la valeur true, cela signifie que vous avez géré l'événement. Aucun autre auditeur ne le fera. Quoi qu'il en soit, 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
Wojtek Jarosz