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

Andrés
fuente

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.

Paul Maserrat
fuente
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;
    }
});
Andrés
fuente
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) {

        }
    }
});
Prashant Maheshwari Andro
fuente
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.

píxel
fuente
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);
Ashana.Jackol
fuente
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)
Laert
fuente
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);
Priya Rajan
fuente
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);
}
Giedrius Šlikas
fuente
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);
Affa Musaffa
fuente
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}
Farruh Habibullaev
fuente
¡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)
norbDEV
fuente
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);
}
Pankaj Talaviya
fuente
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);
CacheMeOutside
fuente
-2

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

Terranología
fuente