Cerrar el teclado virtual al presionar un botón

4 minutos de lectura

avatar de usuario
Andrés

Yo tengo un Activity con un EditTextun botón y un ListView. El propósito es escribir una pantalla de búsqueda en el EditTextpresione el botón y haga que los resultados de la búsqueda llenen esta lista.

Todo esto funciona perfectamente, pero el teclado virtual se comporta de manera extraña.

Si hago clic en el EditText, obtengo el teclado virtual. Si hago clic en el botón “Listo” en el teclado virtual, desaparece. Sin embargo, si hago clic en mi botón de búsqueda antes de hacer clic en “Listo” en el teclado virtual, el teclado virtual permanece y no puedo deshacerme de él. Hacer clic en el botón “Listo” no cierra el teclado. Cambia el botón “Listo” de “Listo” a una flecha y permanece visible.

Gracias por tu ayuda

avatar de usuario
Pablo Maserrat

InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Pongo esto justo después de la onClick(View v) evento.

Necesitas importar android.view.inputmethod.InputMethodManager;

El teclado se oculta al hacer clic en el botón.

  • Nota: (en caso de que desee utilizar este método en instancias en las que podría no haber foco (por ejemplo, onPause(), etc.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    -Peter Ajtai

    16 de febrero de 2012 a las 1:37


  • También tienes que importar Context.

    – Si8

    22 de julio de 2013 a las 18:19

  • PRECAUCIÓN: arroja NPE si el teclado ya está oculto. Siga el comentario de Peter para evitar esto.

    – Don Laringe

    21 de mayo de 2015 a las 8:47


  • ¿Por qué aparece el teclado después de hacer clic en un botón irrelevante? ¿Alguien puede proporcionar alguna explicación o un enlace?

    – kommradHomero

    25 de enero de 2016 a las 11:22

  • ¡Funciona como el encanto!

    – ARIF

    02/09/2016 a las 14:44

avatar de usuario
Andrés

mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

  • Esto funciona para mi. ¡Gracias!

    – Aman Goyal

    29 de abril de 2019 a las 10:20

avatar de usuario
Prashant Maheshwari Andro

Usar el siguiente código

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

  • Atrapar la excepción en lugar de un simple control nulo, ¿en serio?

    – Dr. Glass

    06/11/2016 a las 20:52

  • Trabajando para mí, oculta el teclado al hacer clic en el botón

    – Ashishdhiman2007

    18 de marzo de 2017 a las 10:12

  • solución simple a lo que necesitaba: ocultar el teclado después de hacer clic en el botón de búsqueda.

    – dawoodman71

    27/04/2017 a las 20:15

  • funcionó sin ningún problema.

    – Luz de la luna

    26 de septiembre de 2021 a las 11:38

avatar de usuario
píxel

deberías implementar OnEditorActionListener para su EditView

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Y ocultas el teclado por:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

También debe disparar el teclado escondido en su botón usando onClickListener

Ahora, al hacer clic en ‘Listo’ en el teclado virtual y el botón, se hará lo mismo: ocultar el teclado y realizar la acción de clic.

avatar de usuario
priya rajan

para la actividad,

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

Para fragmentos, utilice obtenerActividad()

getActivity().getSystemService();

getActivity().getCurrentFocus();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

avatar de usuario
Centro Comercial Gaurav

En su caso, como solo tiene un EditText, creo que la siguiente solución es la mejor. Si tuviera más de un componente EditText, entonces tendría que concentrarse en el EditText que desea cerrar o llamar a la siguiente función para cada EditText. Sin embargo, para ti, esto funciona de manera brillante:

editText.onEditorAction(EditorInfo.IME_ACTION_DONE);

Básicamente, EditText ya tiene una función que está destinada a tratar qué hacer después de que se haya utilizado el teclado. Simplemente pasamos que queremos cerrar el teclado.

avatar de usuario
Ziem

Agregue el siguiente código dentro de su evento de clic de botón:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

  • ¡Funciona como el encanto!

    – codificador pc

    25 de julio de 2017 a las 3:40

¿Ha sido útil esta solución?