Tengo una EditText
y una Button
en mi diseño.
Después de escribir en el campo de edición y hacer clic en Button
, quiero ocultar el teclado virtual. Supongo que este es un código simple, pero ¿dónde puedo encontrar un ejemplo?
Al tocar fuera del teclado.
Respuestas:
Para ayudar a aclarar esta locura, me gustaría comenzar disculpándome en nombre de todos los usuarios de Android por el tratamiento absolutamente ridículo del teclado suave de Google. La razón por la que hay tantas respuestas, cada una diferente, para la misma pregunta simple es porque esta API, como muchas otras en Android, está terriblemente diseñada. No se me ocurre ninguna forma cortés de decirlo.
Quiero esconder el teclado Espero para proporcionar Android con la siguiente afirmación:
Keyboard.hide()
. El fin. Muchas gracias. Pero Android tiene un problema. Debe usar elInputMethodManager
para ocultar el teclado. OK, bien, esta es la API de Android para el teclado. ¡PERO! Debes tener unContext
para poder acceder al IMM. Ahora tenemos un problema. Es posible que desee ocultar el teclado de una clase estática o de utilidad que no tiene uso o necesidad de ningunaContext
. o Y MUCHO peor, el IMM requiere que especifique de quéView
(o peor aún, de quéWindow
) quiere ocultar el teclado.Esto es lo que hace que ocultar el teclado sea tan desafiante. Estimado Google: ¡Cuando busco la receta de un pastel, no hay nadie
RecipeProvider
en la Tierra que se niegue a proporcionarme la receta a menos que responda primero a QUIÉN se comerá el pastel Y dónde se comerá!Esta triste historia termina con la fea verdad: para ocultar el teclado de Android, deberá proporcionar 2 formas de identificación: a
Context
y aView
o aWindow
.He creado un método de utilidad estática que puede hacer el trabajo MUY sólidamente, siempre que lo llame desde un
Activity
.Tenga en cuenta que este método de utilidad SOLO funciona cuando se llama desde un
Activity
! El método anterior llamagetCurrentFocus
al objetivoActivity
para obtener el token de ventana adecuado.Pero supongamos que desea ocultar el teclado de un
EditText
host en unDialogFragment
? No puede usar el método anterior para eso:¡Esto no funcionará porque pasará una referencia al
Fragment
host del sistemaActivity
, que no tendrá control enfocado mientrasFragment
se muestra! ¡Guauu! Entonces, para ocultar el teclado de los fragmentos, recurro al nivel inferior, más común y más feo:A continuación hay información adicional obtenida de más tiempo perdido persiguiendo esta solución:
Acerca de windowSoftInputMode
Hay otro punto de contención a tener en cuenta. Por defecto, Android asignará automáticamente el foco inicial al primer
EditText
control enfocable en suActivity
. Naturalmente, se deduce que InputMethod (generalmente el teclado virtual) responderá al evento de enfoque mostrándose. ElwindowSoftInputMode
atributo enAndroidManifest.xml
, cuando se establece enstateAlwaysHidden
, indica al teclado que ignore este foco inicial asignado automáticamente.Casi increíblemente, parece no hacer nada para evitar que el teclado se abra cuando se toca el control (a menos que
focusable="false"
y / ofocusableInTouchMode="false"
están asignados al control). Aparentemente, la configuración windowSoftInputMode se aplica solo a eventos de enfoque automático, no a eventos de enfoque activados por eventos táctiles.Por lo tanto,
stateAlwaysHidden
es MUY mal nombrado. Quizás debería llamarse en suignoreInitialFocus
lugar.Espero que esto ayude.
ACTUALIZACIÓN: más formas de obtener un token de ventana
Si no hay una vista enfocada (por ejemplo, puede suceder si acaba de cambiar fragmentos), hay otras vistas que proporcionarán un token de ventana útil.
Estas son alternativas para el código anterior.
if (view == null) view = new View(activity);
No se refieren explícitamente a su actividad.Dentro de una clase de fragmento:
Dado un fragmento
fragment
como parámetro:A partir de su cuerpo de contenido:
ACTUALIZACIÓN 2: enfoque claro para evitar mostrar el teclado nuevamente si abre la aplicación desde el fondo
Agregue esta línea al final del método:
view.clearFocus();
fuente
Fragment
Parece que puedes usarlogetActivity().getWindow().getDecorView()
Keyboard.hide();
utilidadPuede forzar a Android a ocultar el teclado virtual usando InputMethodManager , llamando
hideSoftInputFromWindow
y pasando el token de la ventana que contiene su vista enfocada.Esto obligará al teclado a ocultarse en todas las situaciones. En algunos casos, querrá pasar
InputMethodManager.HIDE_IMPLICIT_ONLY
como el segundo parámetro para asegurarse de que solo oculta el teclado cuando el usuario no lo forzó explícitamente a aparecer (manteniendo presionado el menú).Nota: Si quieres hacer esto en Kotlin, usa:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Sintaxis de Kotlin
fuente
editText.clearFocus()
a continuación,InputMethodManager.HIDE_IMPLICIT_ONLY
funciona incluso en4.1
View focused = getCurrentFocus()
para obtener lo que definitivamente es la vista actualmente enfocada, la llamadafocused.clearFocus()
y luegoinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(con marcas claras).También es útil para ocultar el teclado virtual:
Esto se puede usar para suprimir el teclado virtual hasta que el usuario realmente toque la Vista editText.
fuente
Tengo una solución más para ocultar el teclado:
Aquí pasa
HIDE_IMPLICIT_ONLY
en la posición deshowFlag
y0
en la posición dehiddenFlag
. Se cerrará con fuerza el teclado suave.fuente
La solución de Meier también funciona para mí. En mi caso, el nivel superior de mi aplicación es un tabHost y quiero ocultar la palabra clave cuando cambio de pestañas: obtengo el token de la ventana de la vista tabHost.
fuente
Por favor intente esto debajo del código en
onCreate()
fuente
editView.setInputType(InputType.TYPE_NULL);
Actualización: no sé por qué esta solución ya no funciona (acabo de probar en Android 23). Utiliza la solución de Saurabh Pareek en su lugar. Aquí está:
Vieja respuesta:
fuente
I don't know why this solution is not work any more
- porque es Android , todo podrá cambiar, tal vez en parte debido a un mal diseño ... Escribimos descuidadamente, luego tachamos todo y reescribimos todo.fuente
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
de este código. Cambió el comportamiento del teclado yinputType
para elEditText
.Si todas las otras respuestas aquí no funcionan para usted como le gustaría, hay otra forma de controlar manualmente el teclado.
Cree una función con la que administrará algunas de las
EditText
propiedades de:Luego, asegúrese de que al enfocar
EditText
cuando abra / cierre el teclado:Ahora, cada vez que desee abrir el teclado, llame manualmente:
Y para cerrar la llamada:
fuente
Saurabh Pareek tiene la mejor respuesta hasta ahora.
Sin embargo, también podría usar las banderas correctas.
Ejemplo de uso real
fuente
fragment.getActivity().getSystemService();
de esa búsqueda, aquí encontré una respuesta que me funciona
fuente
La respuesta corta
En su
OnClick
oyente llame alonEditorAction
de laEditText
conIME_ACTION_DONE
El desglose
Siento que este método es mejor, más simple y más alineado con el patrón de diseño de Android. En el ejemplo simple anterior (y generalmente en la mayoría de los casos comunes) tendrá un
EditText
foco que tiene / tuvo y también fue el que invocó el teclado en primer lugar (definitivamente es capaz de invocarlo en muchos escenarios comunes). De la misma manera, que debe ser el que para liberar el teclado, por lo general lo que puede hacerse por unaImeAction
. Solo vea cómo se comporta unEditText
conandroid:imeOptions="actionDone"
, desea lograr el mismo comportamiento por los mismos medios.Comprueba esta respuesta relacionada
fuente
Esto debería funcionar:
fuente
hide()
yshow()
métodos para tener más control sobre cuando debe mostrar y cuándo no. Funciona para mí, yo también lo hice :)KeyBoard.toggle(fragment.getActivity())
Fragment
, como un comentario. Aprenda a usar métodos, por favor, y luego regrese. Estás confundiendo a la gente con tus respuestas tontasEstoy usando un teclado personalizado para ingresar un número hexadecimal, así que no puedo mostrar el teclado IMM ...
En v3.2.4_r1
setSoftInputShownOnFocus(boolean show)
se agregó para controlar el clima o no para mostrar el teclado cuando TextView obtiene el foco, pero todavía está oculto, por lo que se debe usar la reflexión:Para versiones anteriores, obtuve muy buenos resultados (pero lejos de ser perfectos) con un
OnGlobalLayoutListener
, agregado con la ayuda de aViewTreeObserver
desde mi vista raíz y luego comprobando si el teclado se muestra así:Esta última solución puede mostrar el teclado por una fracción de segundo y se mete con los controladores de selección.
Cuando en el teclado ingresa a pantalla completa, onGlobalLayout no se llama. Para evitar eso, use TextView # setImeOptions (int) o en la declaración XML de TextView:
Actualización: Acabo de encontrar qué diálogos usan para nunca mostrar el teclado y funciona en todas las versiones:
fuente
fuente
He pasado más de dos días trabajando en todas las soluciones publicadas en el hilo y he encontrado que carecen de una forma u otra. Mi requisito exacto es tener un botón que muestre u oculte con un 100% de confiabilidad el teclado en pantalla. Cuando el teclado está oculto, no debería volver a aparecer, sin importar en qué campos de entrada haga clic el usuario. Cuando está en su estado visible, el teclado no debe desaparecer sin importar en qué botones haga clic el usuario. Esto debe funcionar en Android 2.2+ hasta los últimos dispositivos.
Puede ver una implementación funcional de esto en mi aplicación RPN limpia .
Después de probar muchas de las respuestas sugeridas en varios teléfonos diferentes (incluidos los dispositivos froyo y gingerbread), se hizo evidente que las aplicaciones de Android pueden:
Para mí, ocultar temporalmente el teclado no es suficiente. En algunos dispositivos, volverá a aparecer tan pronto como se enfoque un nuevo campo de texto. Como mi aplicación usa múltiples campos de texto en una página, enfocar un nuevo campo de texto hará que el teclado oculto vuelva a aparecer.
Lamentablemente, los elementos 2 y 3 de la lista solo funcionan con fiabilidad cuando se inicia una actividad. Una vez que la actividad se ha hecho visible, no puede ocultar o mostrar permanentemente el teclado. El truco consiste en reiniciar su actividad cuando el usuario presiona el botón de alternancia del teclado. En mi aplicación cuando el usuario presiona el botón de alternar teclado, se ejecuta el siguiente código:
Esto hace que la actividad actual tenga su estado guardado en un paquete, y luego se inicia la actividad, pasando por un valor booleano que indica si el teclado debe mostrarse u ocultarse.
Dentro del método onCreate se ejecuta el siguiente código:
Si se debe mostrar el teclado virtual, se le indica al InputMethodManager que muestre el teclado y se le indica a la ventana que haga siempre visible la entrada virtual. Si el teclado virtual debe estar oculto, se configura WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM.
Este enfoque funciona de manera confiable en todos los dispositivos que he probado, desde un teléfono HTC de 4 años con Android 2.2 hasta un nexus 7 con 4.2.2. La única desventaja con este enfoque es que debe tener cuidado al manejar el botón Atrás. Como mi aplicación esencialmente solo tiene una pantalla (es una calculadora), puedo anular onBackPressed () y volver a la pantalla de inicio del dispositivo.
fuente
Alternativamente a esta solución completa , si desea cerrar el teclado virtual desde cualquier lugar sin tener una referencia al campo (Editar Texto) que se utilizó para abrir el teclado, pero aún así quería hacerlo si el campo estaba enfocado, podría usar esto (de una Actividad):
fuente
Gracias a esta respuesta SO , deduje lo siguiente que, en mi caso, funciona muy bien al desplazarse por los fragmentos de un ViewPager ...
fuente
Las respuestas anteriores funcionan para diferentes escenarios, pero si desea ocultar el teclado dentro de una vista y lucha por obtener el contexto correcto, intente esto:
y para que el contexto lo obtenga del constructor :)
fuente
Si desea cerrar el teclado virtual durante una unidad o prueba funcional, puede hacerlo haciendo clic en el "botón Atrás" de su prueba:
Pongo "botón de retroceso" entre comillas, ya que lo anterior no activa
onBackPressed()
la actividad en cuestión. Simplemente cierra el teclado.Asegúrese de hacer una pausa por un momento antes de continuar, ya que lleva un poco de tiempo cerrar el botón Atrás, por lo que los clics posteriores a Vistas, etc., no se registrarán hasta después de una breve pausa (1 segundo es lo suficientemente largo )
fuente
Así es como lo haces en Mono para Android (también conocido como MonoDroid)
fuente
searchbox
en el fragmento?Esto funcionó para mí por todo el extraño comportamiento del teclado
fuente
Agregue a su actividad
android:windowSoftInputMode="stateHidden"
en el archivo de manifiesto. Ejemplo:fuente
Método simple y fácil de usar, solo llame a hideKeyboardFrom (YourActivity.this); para ocultar el teclado
fuente
Simplemente use este código optimizado en su actividad:
fuente
después de esa llamada en onTouchListener:
fuente
utilizar este
fuente
Para mi caso, estaba usando un SearchView en la barra de acción. Después de que un usuario realiza una búsqueda, el teclado se abriría nuevamente.
El uso de InputMethodManager no cerró el teclado. Tuve que borrar el enfoque y establecer el foco de la vista de búsqueda en falso:
fuente
clearFocus()
en las páginas de la API de Android, por lo que esto no funcionó para mí, pero otra solución sí (consulte mi respuesta a continuación).Tengo el caso, donde mi
EditText
puede ubicarse también en unAlertDialog
, por lo que el teclado debe cerrarse al descartar. El siguiente código parece estar funcionando en cualquier lugar:fuente
Casi he probado todas estas respuestas, tuve algunos problemas al azar, especialmente con el Samsung Galaxy S5.
Lo que termino es forzar el espectáculo y esconderse, y funciona perfectamente:
fuente