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 a esto?
Ethan Allen
78
Para cualquier otra persona que tropiece aquí, puede usar la actividad (ya sea la actividad en la que se encuentra o los fragmentos getActivity()) getCurrentFocus().getWindowToken()para el primer argumento hideSoftInputFromWindow(). Además, hágalo en onPause()y no onStop()si está tratando de que desaparezca cuando cambie de actividades.
Drake Clarris
2
¡Esta respuesta, combinada con el comentario aquí arriba, resolvió totalmente mi problema!
aveschini
9
Qué enfoque tan feo y feo para descartar un teclado. Espero que haya una forma más limpia en el futuro de hacer algo tan simple.
Subby
73
La solución anterior no funciona para todos los dispositivos y, además, está usando EditText como parámetro. Esta es mi solución, solo llame a este método simple:
privatevoid hideSoftKeyBoard(){InputMethodManager imm =(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm.isAcceptingText()){// verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);}}
isAcceptingText()hizo esta respuesta mejor que otras
user1506104
Buena solución ... en casos excepcionales, isAcceptingText () puede devolver false cuando el teclado todavía está en la pantalla, por ejemplo, haga clic fuera de EditText para texto que se puede seleccionar pero no editar en la misma ventana.
Aquí hay una solución de Kotlin (mezclando las diferentes respuestas en hilo)
Crear una función de extensión (quizás en una clase ViewHelpers común)
fun Activity.dismissKeyboard(){
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Luego simplemente consume usando:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
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 necesitaba hacer que el texto de edición sea definitivo. ¿Tal vez está utilizando una clase interna EditText que declaró 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 descubrí que necesitaba saber qué EditText en el formulario tenía el foco. Podría elegir uno arbitrariamente y usarlo. Al igual que:
Esta solución asegura que oculta el teclado y que no hace nada si no se abre. Utiliza la extensión, por lo que se puede usar desde cualquier clase de Context Owner.
fun Context.dismissKeyboard(){
val imm by lazy {this.getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(height >0){
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0)}}
Al usar el contexto de la vista, podemos lograr el resultado deseado con los siguientes métodos de extensión en Kotlin:
/**
* Get the [InputMethodManager] using some [Context].
*/
fun Context.getInputMethodManager():InputMethodManager{if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M){return getSystemService(InputMethodManager::class.java)}return getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard()= context
.getInputMethodManager().hideSoftInputFromWindow(
windowToken
,0)
Respuestas:
¿Desea deshabilitar o descartar un teclado virtual?
Si solo desea descartarlo, puede usar las siguientes líneas de código en el botón al hacer clic en Evento
fuente
getActivity()
)getCurrentFocus().getWindowToken()
para el primer argumentohideSoftInputFromWindow()
. Además, hágalo enonPause()
y noonStop()
si está tratando de que desaparezca cuando cambie de actividades.La solución anterior no funciona para todos los dispositivos y, además, está usando EditText como parámetro. Esta es mi solución, solo llame a este método simple:
fuente
isAcceptingText()
hizo esta respuesta mejor que otrasEsta es mi solucion
fuente
También puede usar este código en el evento de clic del botón
fuente
Aquí hay una solución de Kotlin (mezclando las diferentes respuestas en hilo)
Crear una función de extensión (quizás en una clase ViewHelpers común)
Luego simplemente consume usando:
fuente
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 necesitaba hacer que el texto de edición sea definitivo. ¿Tal vez está utilizando una clase interna EditText que declaró 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 descubrí que necesitaba saber qué EditText en el formulario tenía el foco. Podría elegir uno arbitrariamente y usarlo. Al igual que:
fuente
fuente
Esta solución asegura que oculta el teclado y que no hace nada si no se abre. Utiliza la extensión, por lo que se puede usar desde cualquier clase de Context Owner.
fuente
Al usar el contexto de la vista, podemos lograr el resultado deseado con los siguientes métodos de extensión en Kotlin:
Una vez que estén en su lugar, solo llame al:
fuente