Android: como fazer com que o teclado entre no botão diga "Pesquisar" e manipule seu clique?

373

Eu não consigo descobrir isso. Alguns aplicativos têm um EditText (caixa de texto) que, quando você toca nele e abre o teclado na tela, o teclado possui um botão "Pesquisar" em vez de uma tecla Enter.

Eu quero implementar isso. Como posso implementar esse botão Pesquisar e detectar o pressionamento do botão Pesquisar?

Editar : encontrado como implementar o botão Pesquisar; em XML android:imeOptions="actionSearch"ou em Java EditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH);. Mas como lidar com o usuário pressionando o botão Pesquisar? Tem algo a ver com isso android:imeActionId?

Ricket
fonte
3
Observe que imeOptions pode não funcionar em alguns dispositivos. Veja isso e isso .
Ermolai

Respostas:

904

No layout, defina as opções do seu método de entrada para pesquisar.

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

No java, adicione o ouvinte de ação do editor.

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
fonte
82
No SO 2.3.6, ele não funciona até eu colocar o atributo android: inputType = "text".
precisa
41
android: inputType = "text", também foi necessário para mim no Android 2.3.5 e 4.0.4
ccyrille
6
@Carol EditTexté uma subclasse de TextView.
howettl
13
android: inputType = "text" também é necessário para 4.4.0 - 4.4.2 (Android Kitkat).
precisa saber é o seguinte
12
Sim, android: inputType = "text" ainda é necessário no 5.0 :) #
lionelmessi
19

Ocultar teclado quando o usuário clicar em pesquisar. Além da resposta de Robby Pond

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

No xmlarquivo, colocar imeOptions="actionSearch"e 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
fonte
5

Na cidade Kotlin

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

Código XML parcial

 <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
fonte
1

Esta resposta é para TextInputEditText:

No arquivo XML de layout, defina suas opções de método de entrada para o tipo necessário. por exemplo feito .

<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"/>

Da mesma forma, você também pode definir imeOptions para actionSubmit, actionSearch, etc

No java, adicione o ouvinte de ação do editor.

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

Se você estiver usando o kotlin:

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

por 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" />

Por Java:

 editText.clearFocus();
    InputMethodManager in = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
Null Pointer Exception
fonte