Android: Wie kann man die Tastatur-Eingabetaste dazu bringen, "Suchen" zu sagen und mit dem Klicken umzugehen?


373

Ich kann das nicht herausfinden. Einige Apps verfügen über einen EditText (Textfeld). Wenn Sie ihn berühren und die Bildschirmtastatur aufrufen, verfügt die Tastatur über eine Schaltfläche "Suchen" anstelle einer Eingabetaste.

Ich möchte dies umsetzen. Wie kann ich diese Suchtaste implementieren und das Drücken der Suchtaste erkennen?

Bearbeiten : gefunden, wie die Schaltfläche Suchen implementiert wird; in XML android:imeOptions="actionSearch"oder in Java , EditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH);. Aber wie gehe ich mit dem Benutzer um, der diese Suchtaste drückt? Hat es etwas damit zu tun android:imeActionId?


3
Beachten Sie, dass imeOptions auf einigen Geräten möglicherweise nicht funktioniert. Sehen Sie dies und das .
Ermolai

Antworten:


904

Stellen Sie im Layout Ihre Eingabemethodenoptionen für die Suche ein.

<EditText
    android:imeOptions="actionSearch" 
    android:inputType="text" />

Fügen Sie in Java den Editor Action Listener hinzu.

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});

82
Unter OS 2.3.6 funktioniert es erst, wenn ich das Attribut android: inputType = "text" eingefügt habe.
thanhbinh84

41
android: inputType = "text" war auch für mich auf Android 2.3.5 und 4.0.4 erforderlich
Ccyrille

6
@Carol EditTextist eine Unterklasse von TextView.
Howettl

13
android: inputType = "text" ist auch für 4.4.0 - 4.4.2 (Android Kitkat) erforderlich.
user818455

12
Yup, android: inputType = "text" wird noch in 5.0 benötigt :)
lionelmessi

19

Tastatur ausblenden, wenn der Benutzer auf Suchen klickt. Ergänzung zu Robby Pond Antwort

private void performSearch() {
    editText.clearFocus();
    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
    //...perform search
}

7

In die xmlDatei setzen imeOptions="actionSearch"und inputType="text", maxLines="1":

<EditText
    android:id="@+id/search_box"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search"
    android:imeOptions="actionSearch"
    android:inputType="text"
    android:maxLines="1" />

5

In Kotlin

evLoginPassword.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        doTheLoginWork()
    }
    true
}

Teilweiser XML-Code

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
       <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginUserEmail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/email"
                android:inputType="textEmailAddress"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/password"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>
</LinearLayout>

1

Diese Antwort gilt für TextInputEditText:

Stellen Sie in der Layout-XML-Datei Ihre Eingabemethodenoptionen auf den gewünschten Typ ein. zum Beispiel gemacht .

<com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionGo"/>

In ähnlicher Weise können Sie imeOptions auch auf actionSubmit, actionSearch usw. Setzen

Fügen Sie in Java den Editor Action Listener hinzu.

textInputLayout.getEditText().setOnEditorActionListener(new 

    TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_GO) {
                performYourAction();
                return true;
            }
            return false;
        }
    });

Wenn Sie Kotlin verwenden:

textInputLayout.editText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_GO) {
        performYourAction()
    }
    true
}

0

per XML:

 <EditText
        android:id="@+id/search_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/search"
        android:imeOptions="actionSearch"
        android:inputType="text" />

Mit Java:

 editText.clearFocus();
    InputMethodManager in = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
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.