Me gustaría alterar el diseño en función de si se muestra o no el teclado virtual. He buscado en la API y en varios blogs, pero parece que no puedo encontrar nada útil.
¿Es posible?
¡Gracias!
android
events
android-softkeyboard
Sander Versluys
fuente
fuente
Respuestas:
Nota
Tienes que manejar los cambios de configuración tú mismo.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Muestra:
Luego, simplemente cambie la visibilidad de algunas vistas, actualice un campo y cambie su archivo de diseño.
fuente
newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~ ChrisEsta puede no ser la solución más efectiva. Pero esto funcionó para mí cada vez ... Llamo a esta función donde necesito escuchar el softKeyboard.
Nota: Este enfoque causará problemas si el usuario usa un teclado flotante.
fuente
android:windowSoftInputMode="adjustPan"
, oadjustResize
con una ventana de pantalla completa, ya que el diseño nunca cambia de tamaño.Si desea manejar mostrar / ocultar la ventana del teclado IMM (virtual) desde su Actividad, deberá subclasificar su diseño y anular el método onMesure (para que pueda determinar el ancho medido y la altura medida de su diseño). Después de eso, establezca el diseño subclasificado como vista principal para su Actividad mediante setContentView (). Ahora podrá manejar los eventos de ventana mostrar / ocultar IMM. Si esto suena complicado, en realidad no es así. Aquí está el código:
main.xml
Ahora dentro de su Actividad, declare la subclase para su diseño (main.xml)
Puede ver en el código que inflamos el diseño de nuestra Actividad en el constructor de subclase
Y ahora solo configure la vista de contenido del diseño subclasificado para nuestra Actividad.
fuente
android:windowSoftInputMode="adjustPan"
, oadjustResize
con una ventana de pantalla completa, ya que el diseño nunca cambia de tamaño.Hice de esta manera:
Agregar
OnKeyboardVisibilityListener
interfaz.HomeActivity.java :
Espero que esto te ayude.
fuente
Basado en el Código de Nebojsa Tomcic, he desarrollado la siguiente Subclase RelativeLayout:
Esto funciona bastante bien ... Marque, que esta solución simplemente funcionará cuando el Modo de entrada suave de su Actividad esté configurado en "WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE"
fuente
android:windowSoftInputMode="adjustPan"
, oadjustResize
con una ventana de pantalla completa, ya que el diseño nunca cambia de tamaño.Al igual que la respuesta de @ amalBit, registre un oyente en el diseño global y calcule la diferencia de la parte inferior visible de dectorView y su parte inferior propuesta, si la diferencia es mayor que algún valor (altura de IME adivinada), creemos que IME está arriba:
el umbral de altura 100 es la altura mínima adivinada de IME.
Esto funciona tanto para ajustarPan como para ajustarResize.
fuente
La solución de Nebojsa casi me funcionó. Cuando hice clic dentro de un EditText de varias líneas, sabía que se mostraba el teclado, pero cuando comencé a escribir dentro de EditText, la altura real y la altura propuesta seguían siendo las mismas, por lo que no sabía que todavía se mostraba el teclado. Hice una ligera modificación para almacenar la altura máxima y funciona bien. Aquí está la subclase revisada:
fuente
No estoy seguro si alguien publica esto. ¡Encontré esta solución simple de usar! . La clase SoftKeyboard está en gist.github.com . Pero mientras la devolución de llamada del evento emergente / oculto del teclado necesitamos un controlador para hacer correctamente las cosas en la interfaz de usuario:
fuente
Resuelvo esto anulando onKeyPreIme (int keyCode, KeyEvent event) en mi EditText personalizado.
fuente
Tengo una especie de truco para hacer esto. Aunque no parece haber una forma de detectar cuándo se ha mostrado u ocultado el teclado virtual, de hecho puede detectar cuándo está a punto de mostrarse u ocultarse configurando un botón
OnFocusChangeListener
en elEditText
que está escuchando.NOTA: Una cosa a tener en cuenta con este truco es que esta devolución de llamada se dispara inmediatamente cuando
EditText
gana o pierde el foco. Esto realmente disparará justo antes de que se muestre u oculte el teclado virtual. La mejor manera que he encontrado para hacer algo después de que el teclado muestra u oculta es usarHandler
ay retrasar algo ~ 400 ms, así:fuente
OnFocusChangeListener
solo dice siEditText
tiene foco después de que el estado cambió. PeroIME
puede estar oculto cuandoEditText
tiene foco, ¿cómo detectar este caso?Sander, creo que estás intentando mostrar la vista bloqueada por el teclado virtual. Pruebe esto http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html .
fuente
He resuelto el problema en la codificación posterior de vista de texto de una sola línea.
fuente
También puede verificar el primer relleno inferior infantil de DecorView. Se establecerá en un valor distinto de cero cuando se muestre el teclado.
fuente
Ocultar | Mostrar eventos para el teclado se puede escuchar a través de un simple hack en OnGlobalLayoutListener:
Aquí activityRootView es la vista raíz de su Actividad.
fuente
usando viewTreeObserver para obtener fácilmente el evento del teclado.
** layout_parent es tu vista como
edit_text.parent
fuente
La respuesta de Nebojsa Tomcic no fue útil para mí. Tengo
RelativeLayout
conTextView
yAutoCompleteTextView
dentro de ella. Necesito desplazarmeTextView
hacia la parte inferior cuando se muestra el teclado y cuando está oculto. Para lograr esto, anulé elonLayout
método y funciona bien para mí.fuente