Verwenden Sie die ENTER-Taste auf dem Softkeyboard, anstatt auf die Schaltfläche zu klicken

94

Hallo, ich habe eine Suche EditTextund Suche Button. Wenn ich den gesuchten Text eingebe , möchte ich anstelle der Suche die EINGABETASTE auf dem Softkeyboard verwenden, um die Suchfunktion Buttonzu aktivieren.

Vielen Dank für Ihre Hilfe im Voraus.

Peter O.
quelle

Antworten:

155

Sie tun dies, indem Sie ein OnKeyListenerauf Ihrem setzen EditText.

Hier ist ein Beispiel aus meinem eigenen Code. Ich habe einen EditTextNamen addCourseText, der die Funktion aufruft, addCourseFromTextBoxwenn entweder die Eingabetaste oder das Steuerkreuz angeklickt wird.

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;
    }
});
julianisch
quelle
4
Tatsächlich ist dies für Softkeys nicht garantiert. Zum Beispiel funktioniert es nicht für "ENTER" unter Nexus 7 (Android 4.2) und für "BACK".
Ghedeon
4
@Ghedeon Sie können die android:inputType="text"XML- Datei für den Bearbeitungstext so einstellen , dass die Eingabetaste gegenüber der Standardtastatur mit Wagenrücklauf angezeigt wird.
Nick
2
Diese Methode kann nicht ab Jellybean verwendet werden, siehe developer.android.com/reference/android/view/KeyEvent.html
Constantin
@Ghedeon, wie bringt man es dazu, für "ENTER" auf Nexus 7 zu funktionieren?
HairOfTheDog
3
Diese Lösung ist auf vielen Geräten, einschließlich Nexus 7, völlig defekt. Benutze es nicht!
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" />

Sie können dann auf Drücken der Aktionstaste warten, indem Sie einen TextView.OnEditorActionListener für das EditText-Element definieren. Antworten Sie in Ihrem Listener auf die entsprechende IME-Aktions-ID, die in der EditorInfo-Klasse definiert ist, z. B. IME_ACTION_SEND. Beispielsweise:

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

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

Andrii Kovalchuk
quelle
26

Möglicherweise können Sie Ihrem EditText ein Attribut wie folgt hinzufügen:

android:imeOptions="actionSearch"
itemon
quelle
1
Dies ist eine einfachere Lösung, wenn Sie einen Suchbearbeitungstext erstellen.
Stevyhacker
Notwendigkeit, Satz android:inputType="text"und
li2
6

füge dem EditText ein Attribut wie android hinzu: imeOptions = "actionSearch"

Dies ist der beste Weg, um die Funktion auszuführen

und die imeOptions haben auch einige andere Werte wie "go" 、 "next" 、 "done" usw.

ruyi.zhu
quelle
2

Wir können auch Kotlin Lambda verwenden

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
quelle
0

Um zu vermeiden, dass der Fokus auf das nächste bearbeitbare Feld (falls vorhanden) übergeht, möchten Sie möglicherweise die Key-Down-Ereignisse ignorieren, aber Key-Up-Ereignisse behandeln. Ich bevorzuge es auch, zuerst nach dem keyCode zu filtern, vorausgesetzt, er wäre geringfügig effizienter. Denken Sie übrigens daran, dass die Rückgabe von true bedeutet, dass Sie das Ereignis behandelt haben, sodass dies kein anderer Listener tun wird. Wie auch immer, hier ist meine 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
quelle
0

Dies ist ein Beispiel für eine meiner Apps, wie ich damit umgehe

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

Der aktuellste Weg, dies zu erreichen, ist:

Fügen Sie dies Ihrem EditText in XML hinzu:

android:imeOptions="actionSearch"

Dann in Ihrer Aktivität / Fragment:

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