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.

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

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


26

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

android:imeOptions="actionSearch"

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.


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
    }

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

});

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

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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.