Użyj klawisza „ENTER” na klawiaturze programowej zamiast klikania przycisku

94

Witam mam przeszukiwane EditTexti szukam Button. Kiedy wpisuję wyszukiwany tekst, chciałbym użyć klawisza ENTER na klawiaturze programowej zamiast wyszukiwania, Buttonaby aktywować funkcję wyszukiwania.

Z góry dziękuję za pomoc.

Peter O.
źródło

Odpowiedzi:

155

Robisz to, ustawiając OnKeyListenerna swoim EditText.

Oto próbka z mojego własnego kodu. Mam EditTextnazwany addCourseText, który wywoła funkcję addCourseFromTextBoxpo kliknięciu klawisza Enter lub pada kierunkowego.

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;
    }
});
juliański
źródło
4
W rzeczywistości nie jest to gwarantowane w przypadku klawiszy programowalnych. Na przykład nie działa dla „ENTER” na Nexusie 7 (Android 4.2), a dla „BACK” działa.
Ghedeon
4
@Ghedeon, możesz ustawić android:inputType="text"xml dla tekstu edycji, aby pokazać klawisz Enter w porównaniu z domyślną klawiaturą, która ma powrót karetki.
Nick
2
Ta metoda nie gwarantuje działania od wersji Jellybean, patrz developer.android.com/reference/android/view/KeyEvent.html
Constantin,
@Ghedeon, więc jak sprawić, by działał dla „ENTER” na Nexusie 7?
HairOfTheDog,
3
To rozwiązanie jest całkowicie zepsute na wielu urządzeniach, w tym na Nexusie 7. Nie używaj tego!
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" />

Następnie można nasłuchiwać naciśnięć przycisku akcji, definiując TextView.OnEditorActionListener dla elementu EditText. W odbiorniku odpowiedz na odpowiedni identyfikator akcji IME zdefiniowany w klasie EditorInfo, na przykład IME_ACTION_SEND. Na przykład:

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

Źródło: https://developer.android.com/training/keyboard-input/style.html

Andrii Kovalchuk
źródło
26

być może możesz dodać atrybut do swojego EditText w ten sposób:

android:imeOptions="actionSearch"
itemon
źródło
1
Jest to prostsze rozwiązanie, jeśli tworzysz tekst do edycji wyszukiwania.
stevyhacker
należy ustawić android:inputType="text"także
LI2
6

dodaj atrybut do EditText, taki jak android: imeOptions = "actionSearch"

jest to najlepszy sposób wykonania tej funkcji

a imeOptions mają również inne wartości, takie jak „go” 、 „next” 、 „done” itp.

ruyi.zhu
źródło
2

Możemy również użyć lambdy Kotlin

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
źródło
0

Aby uniknąć przechodzenia fokusu do następnego edytowalnego pola (jeśli takie masz), możesz zignorować zdarzenia naciśnięcia klawisza, ale obsłuż te zdarzenia. Wolę też najpierw filtrować na keyCode, zakładając, że byłoby to nieznacznie bardziej wydajne. Nawiasem mówiąc, pamiętaj, że zwrócenie wartości true oznacza, że ​​obsłużyłeś zdarzenie, więc żaden inny słuchacz tego nie zrobi. Tak czy inaczej, oto moja wersja.

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
źródło
0

to jest przykład jednej z moich aplikacji

 //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
źródło
0

Najbardziej aktualnym sposobem osiągnięcia tego jest:

Dodaj to do swojego EditText w XML:

android:imeOptions="actionSearch"

Następnie w swojej aktywności / fragmencie:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Hasan TBT
źródło