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?

Ricket
quelle
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;
    }
});
Robby Pond
quelle
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
}
kaMChy
quelle
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" />
Braj Bhushan Singh
quelle
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>
Shaon
quelle
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
}
iAmSauravSharan
quelle
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);
Nullzeiger-Ausnahme
quelle