2010-08-24 19 views

Respuesta

283

¿Desea desactivar o descartar un teclado virtual?

Si desea simplemente descartarlo puede utilizar las siguientes líneas de código en tus del botón de evento Click

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 
+1

+1. Funciona como el encanto. –

+1

Dos problemas con esto ... uno es que myEditText debe ser Final. En segundo lugar, tengo que saber qué cuadro EditText tiene el foco. ¿Alguna solución para esto? –

+66

Para cualquier persona que tropiece aquí, puede usar la actividad (ya sea la actividad en la que se encuentra o los fragmentos 'getActivity()') 'getCurrentFocus(). GetWindowToken()' para la primera arg a 'hideSoftInputFromWindow()'. Además, hazlo en 'onPause()' y no en 'onStop()' si estás intentando que desaparezca al cambiar las actividades. –

13

también puede utilizar este código en el botón evento click

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
+0

Ese método fue el único que funcionó para mí, ¡gracias! – Emilio

+11

Hmm. Esto no funciona en absoluto para mí. – tomwhipple

+0

No funciona para mí tampoco en API 23 –

5

El La primera solución con InputMethodManager funcionó como un campeón para mí, el método getWindow(). setSoftInputMode no funcionaba en Android 4.0.3 HTC Amaze.

@Ethan Allen, no tuve que hacer el texto de edición final. ¿Tal vez estás usando una clase interna EditText que has declarado el método contenedor? Puede hacer que EditText sea una variable de clase de la Actividad. O simplemente declare un nuevo EditText dentro de la clase/método interno y use findViewById() nuevamente. Además, no encontré que necesitaba saber qué EditText en el formulario tenía foco. Podría elegir uno arbitrariamente y usarlo. Como lo siguiente:

+3

¡Bienvenido a Stack Overflow! Esto es realmente un comentario, no una respuesta. Con un poco más de representante, [podrá publicar comentarios] (http://stackoverflow.com/privileges/comment). – Jack

+2

Es una respuesta correcta. Gracias Andy! –

50

La solución anterior no funciona para todos los dispositivos y, además, usa EditText como parámetro. Esta es mi solución, simplemente llame a este método simple:

private void hideSoftKeyBoard() { 
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open      
     imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
    } 
} 
+1

punto fantástico, gracias – Fattie

+2

'isAcceptingText()' hizo que esta respuesta sea mejor que otras – user1506104

22

Ésta es mi solución

public static void hideKeyboard(Activity activity) { 
    View v = activity.getWindow().getCurrentFocus(); 
    if (v != null) { 
     InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
    } 
} 
4
public static void hideSoftInput(Activity activity) { 
    try { 
     if (activity == null || activity.isFinishing()) return; 
     Window window = activity.getWindow(); 
     if (window == null) return; 
     View view = window.getCurrentFocus(); 
     //give decorView a chance 
     if (view == null) view = window.getDecorView(); 
     if (view == null) return; 

     InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
     if (imm == null || !imm.isActive()) return; 
     imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 
3

Aquí hay una solución Kotlin (mezcla de los diferentes respuestas en el hilo)

crear una función de extensión (quizás en una clase común de ViewHelpers)

fun Activity.dismissKeyboard() { 
    val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 
    if(inputMethodManager.isAcceptingText) 
     inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken, /*flags:*/ 0) 
} 

Después, simplemente consumen usando:

// from activity 
this.dismissKeyboard() 

// from fragment 
activity.dismissKeyboard() 
Cuestiones relacionadas