Use a tecla “ENTER” no teclado virtual em vez de clicar no botão

94

Olá, eu tenho uma busca EditTexte pesquisa Button. Quando eu digito o texto pesquisado, gostaria de usar a tecla ENTER no teclado virtual em vez de pesquisar Buttonpara ativar a função de pesquisa.

Obrigado pela ajuda antecipadamente.

Peter O.
fonte

Respostas:

155

Você faz isso definindo um OnKeyListenerem seu EditText.

Aqui está um exemplo do meu próprio código. Eu tenho um EditTextnome addCourseText, que irá chamar a função addCourseFromTextBoxquando a tecla Enter ou o d-pad for clicado.

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;
    }
});
Julian
fonte
4
Na verdade, não é garantido para teclas de função. Por exemplo, não funciona para "ENTER" no Nexus 7 (Android 4.2) e para "VOLTAR" sim.
Ghedeon
4
@Ghedeon você pode definir o android:inputType="text"xml para o texto de edição para mostrar a tecla Enter versus o teclado padrão que tem um retorno de carro.
Nick
2
Este método não tem garantia de funcionamento a partir do Jellybean, consulte developer.android.com/reference/android/view/KeyEvent.html
Constantin
@Ghedeon, então como você faz isso funcionar para "ENTER" no Nexus 7?
HairOfTheDog
3
Esta solução é completamente quebrada em muitos dispositivos, Nexus 7 incluído. Não use isso!
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" />

Você pode, então, ouvir pressionamentos no botão de ação, definindo um TextView.OnEditorActionListener para o elemento EditText. Em seu ouvinte, responda à ID de ação IME apropriada definida na classe EditorInfo, como IME_ACTION_SEND. Por exemplo:

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

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

Andrii Kovalchuk
fonte
26

pode ser que você possa adicionar um atributo ao seu EditText como este:

android:imeOptions="actionSearch"
itemon
fonte
1
Esta é uma solução mais simples se você estiver construindo um texto de edição de pesquisa.
stevyhacker
necessidade de conjunto android:inputType="text"bem
LI2
6

adicione um atributo ao EditText como android: imeOptions = "actionSearch"

esta é a melhor maneira de fazer a função

e as imeOptions também têm alguns outros valores, como "go" 、 "next" 、 "done" etc.

ruyi.zhu
fonte
2

Também podemos usar Kotlin lambda

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

Para evitar que o foco avance para o próximo campo editável (se você tiver um), você pode ignorar os eventos de tecla para baixo, mas lidar com eventos de tecla para cima. Também prefiro filtrar primeiro no keyCode, supondo que seja um pouco mais eficiente. A propósito, lembre-se de que retornar true significa que você manipulou o evento, portanto nenhum outro ouvinte o fará. Enfim, aqui está minha versão.

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

este é um exemplo de um dos meus aplicativos como eu lido

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

A maneira mais atualizada de conseguir isso é:

Adicione ao seu EditText em XML:

android:imeOptions="actionSearch"

Em seguida, em sua atividade / fragmento:

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