Use la tecla "ENTER" en el teclado en lugar de hacer clic en el botón

94

Hola, tengo una búsqueda EditTexty una búsqueda Button. Cuando escribo el texto buscado, me gustaría usar la tecla ENTER en el teclado en lugar de buscar Buttonpara activar la función de búsqueda.

Gracias por la ayuda de antemano.

Peter O.
fuente

Respuestas:

155

Para hacerlo, establezca un OnKeyListeneren su EditText.

Aquí hay una muestra de mi propio código. Tengo un EditTextnombre addCourseText, que llamará a la función addCourseFromTextBoxcuando se haga clic en la tecla Intro o en el D-pad.

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
fuente
4
En realidad, no está garantizado para las teclas de función. Por ejemplo, no funciona para "ENTER" en Nexus 7 (Android 4.2) y para "BACK" sí.
Ghedeon
4
@Ghedeon puede configurar el android:inputType="text"xml para que el texto de edición muestre la tecla Intro frente al teclado predeterminado que tiene un retorno de carro.
Nick
2
Este método no está garantizado para funcionar a partir de Jellybean, consulte developer.android.com/reference/android/view/KeyEvent.html
Constantin
@Ghedeon, ¿cómo se consigue que funcione para "ENTER" en Nexus 7?
HairOfTheDog
3
Esta solución está completamente rota en muchos dispositivos, incluido Nexus 7. ¡No lo uses!
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" />

A continuación, puede escuchar las pulsaciones en el botón de acción definiendo un TextView.OnEditorActionListener para el elemento EditText. En su oyente, responda al ID de acción de IME apropiado definido en la clase EditorInfo, como IME_ACTION_SEND. Por ejemplo:

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

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

Andrii Kovalchuk
fuente
26

puede ser que pueda agregar un atributo a su EditText como este:

android:imeOptions="actionSearch"
itemon
fuente
1
Esta es una solución más sencilla si está creando un texto de edición de búsqueda.
stevyhacker
necesidad de establecer android:inputType="text"así
LI2
6

agregue un atributo al EditText como android: imeOptions = "actionSearch"

esta es la mejor manera de hacer la función

y las imeOptions también tienen otros valores como "ir" 、 "siguiente" 、 "hecho", etc.

ruyi.zhu
fuente
2

También podemos utilizar 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
fuente
0

Para evitar que el enfoque avance al siguiente campo editable (si tiene uno), es posible que desee ignorar los eventos de tecla hacia abajo, pero maneje los eventos de tecla hacia arriba. También prefiero filtrar primero en el keyCode, asumiendo que sería un poco más eficiente. Por cierto, recuerde que devolver verdadero significa que ha manejado el evento, por lo que ningún otro oyente lo hará. De todos modos, aquí está mi versión.

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

esta es una muestra de una de mis aplicaciones cómo manejo

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

La forma más actualizada de lograr esto es:

Agregue esto a su EditText en XML:

android:imeOptions="actionSearch"

Luego, en tu Actividad / Fragmento:

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