Utilizzare il tasto "INVIO" sulla tastiera virtuale invece di fare clic sul pulsante


94

Ciao, ho una ricerca EditTexte una ricerca Button. Quando digito il testo cercato, vorrei utilizzare il tasto INVIO sulla softkey al posto della ricerca Buttonper attivare la funzione di ricerca.

Grazie per l'aiuto in anticipo.

Risposte:


155

Lo fai impostando un OnKeyListenersul tuo EditText.

Ecco un esempio dal mio codice. Ho un EditTextnome addCourseText, che chiamerà la funzione addCourseFromTextBoxquando si fa clic sul tasto Invio o sul tasto direzionale.

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
In realtà, non è garantito per i tasti soft. Ad esempio, non funziona per "INVIO" su Nexus 7 (Android 4.2) e per "INDIETRO" sì.
Ghedeon

4
@ Ghedeon puoi impostare l' android:inputType="text"xml per il testo di modifica per mostrare il tasto Invio rispetto alla tastiera predefinita che ha un ritorno a capo .
Nick

2
Questo metodo non è garantito per funzionare a partire da Jellybean, vedere developer.android.com/reference/android/view/KeyEvent.html
Constantin

@ Ghedeon, quindi come fai a farlo funzionare per "INVIO" su Nexus 7?
HairOfTheDog

3
Questa soluzione è completamente rotta su molti dispositivi, Nexus 7 incluso. Non usarlo!
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" />

È quindi possibile ascoltare le pressioni sul pulsante di azione definendo un TextView.OnEditorActionListener per l'elemento EditText. Nel tuo listener, rispondi all'ID azione IME appropriato definito nella classe EditorInfo, ad esempio IME_ACTION_SEND. Per esempio:

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

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


26

potresti aggiungere un attributo al tuo EditText come questo:

android:imeOptions="actionSearch"

1
Questa è una soluzione più semplice se stai creando una ricerca per modificare il testo.
stevyhacker

è necessario impostare android:inputType="text"anche
li2

6

aggiungi un attributo a EditText come android: imeOptions = "actionSearch"

questo è il modo migliore per eseguire la funzione

e le imeOptions hanno anche altri valori come "go" 、 "next" 、 "done" ecc.


2

Possiamo anche usare 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

Per evitare che il focus avanzi al campo modificabile successivo (se ne hai uno) potresti voler ignorare gli eventi key-down, ma gestire gli eventi key-up. Preferisco anche filtrare prima sul keyCode, supponendo che sarebbe leggermente più efficiente. A proposito, ricorda che restituire true significa che hai gestito l'evento, quindi nessun altro ascoltatore lo farà. Comunque, ecco la mia versione.

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

questo è un esempio di una delle mie app come gestisco

 //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

Il modo più aggiornato per raggiungere questo obiettivo è:

Aggiungi questo al tuo EditText in XML:

android:imeOptions="actionSearch"

Quindi nella tua attività / frammento:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.