Cerrar el teclado virtual al presionar el botón


133

Tengo un Activitycon un EditText, un botón y un ListView. El propósito es escribir una pantalla de búsqueda en EditText, presionar el botón y hacer que los resultados de búsqueda llenen esta lista.

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

Si hago clic en 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. Al hacer clic en el botón "Listo" no se cierra el teclado. Cambia el botón "Listo" de "Listo" a una flecha y permanece visible.

Gracias por tu ayuda

Respuestas:


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

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

Puse esto justo después del onClick(View v)evento.

Necesitas importar android.view.inputmethod.InputMethodManager;

El teclado se oculta cuando hace clic en el botón.


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

55
También debes importar Context.
Si8

44
PRECAUCIÓN: Lanza NPE si el teclado ya está oculto. Sigue el comentario de Peter para evitar esto.
Don Larynx

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

1
Funciona como encanto!
ARiF

59
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

Usar debajo del 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) {

        }
    }
});

2
Capturando una excepción en lugar de una simple verificación nula, ¿en serio?
Dr Glass

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

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

13

Debe implementar OnEditorActionListenerpara 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 oculto en su botón usando onClickListener

Ahora hacer clic en 'Listo' en el teclado virtual y el botón hará lo mismo: ocultar el teclado y realizar una acción de clic.


Excelente, pero no estoy del todo siguiendo. Creo que la publicación se comió parte del código (no hay nada después del "vacío público" en su muestra). Intenté establecer SetOnEditorActionListner en el método onCreate de mi Actividad, pero no sabe qué es setOnEditorActionListener. Recibo una notificación de "Tipo interno anónimo". (Estoy haciendo esto en mi método Activity onCreate) i37.tinypic.com/6ozkig.png
Andrew

1
Parece que hay un par de errores en este código, pero es la idea correcta. Por un lado, la interfaz OnEditorActionListener es una clase interna, por lo que debe importarla explícitamente (Eclipse no lo hará por usted en este caso) o referirse a ella como TextView.OnEditorActionListener.
MatrixFrog

Estoy teniendo un poco de problemas. He implementado onEditorActionListener (la clase pública SearchActivity extiende ListActivity implementa OnClickListener, OnEditorActionListener), he adjuntado un oyente a mi EditText (mSearchText.setOnEditorActionListener (this);), pero Eclipse no me permitirá anular el onEditorAction hand (onEditorAction hand (onEditorAction) (TextView v, int actionId, evento KeyEvent)). Dice que debe anular un método de superclase. ¿Algunas ideas?
Andrew

Hola, puedes alinear tu OnEditorActionListener escribiendo yourEditView.setOnEditorActionListener (nuevo OnEditorActionListener () {....
pixel

11

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

1
Funciona como encanto!
coderpc

10

Dado que solo tiene un texto de edición, simplemente llame a la acción realizada para ese texto de edición dentro de su clic de botón y el resto es manejado por el sistema. Si tuviera más de un texto de edición, esto no sería tan eficiente porque primero debe obtener el texto de edición enfocado. Pero en tu caso funcionará perfectamente

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
¿Puede dejar una explicación de por qué su solución funciona para que otros puedan entenderla y aprender de ella? ¡Gracias!
Shawn

Claro Shawn Acabo de editar la parte superior, ya que soy nuevo en posar si no está claro, házmelo saber y me expandiré con el botón onclick
Laert

Créeme, esta es una de las formas más elegantes de hacer esto. Gracias @Laert
WitVault

9

Para la actividad,

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

Para fragmentos, use getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

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

7

Esta solución funciona perfecta para mí:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

Prueba esto...

  1. Para mostrar el teclado

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Para ocultar teclado

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

El método "Para ocultar el teclado" es un toogle (ocultar si está visible, mostrar si está oculto) no un ocultar,
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

¡Hola! Aunque esta respuesta podría satisfacer las necesidades de @Andrew , sería genial, si pudieras extenderla con alguna explicación, ¡para asegurarte de que los futuros lectores puedan beneficiarse al máximo!
derM

1

Ejemplo de Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

del fragmento:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

de la actividad:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

Utiliza este código en tu evento de clic de botón

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

0

Crash Null Point Exception Fix: tuve un caso en el que el teclado podría no abrirse cuando el usuario hace clic en el botón. Debe escribir una instrucción if para verificar que getCurrentFocus () no sea nulo:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

-2

Si configura android:singleLine="true", automáticamente el botón oculta el teclado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.