He investigado mucho para ajustar el diseño cuando softkeyboard está activo y lo he implementado con éxito, pero el problema surge cuando lo uso android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
en mi etiqueta de actividad en el archivo de manifiesto.
Para esto lo he usado android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"
con diferentes opciones pero sin suerte.
Después de eso, implementé mediante FullScreen
programación y probé varios diseños para trabajar, FullScreen
pero todo fue en vano.
Hice referencia a estos enlaces y he buscado muchas publicaciones relacionadas con este tema:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Aquí está el código xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff">
<ScrollView android:id="@+id/parentScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
android:textColor="@color/top_header_txt_color" android:textSize="20dp"
android:padding="8dp" android:gravity="center_horizontal" />
<TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
android:layout_height="40dp" android:text="AutoReply:"
android:textColor="@color/top_header_txt_color" android:textSize="14dp"
android:textStyle="bold" android:padding="10dp"
android:layout_below="@+id/setup_txt" />
<EditText android:id="@+id/edit_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Some text here." android:textSize="16dp"
android:textColor="@color/setting_editmsg_color" android:padding="10dp"
android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
android:gravity="top" android:scrollbars="vertical"
android:maxLength="132" />
<ImageView android:id="@+id/image_bottom"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/edit_message" />
</LinearLayout>
</ScrollView>
<RelativeLayout android:id="@+id/scoringContainerView"
android:layout_width="fill_parent" android:layout_height="50px"
android:orientation="vertical" android:layout_alignParentBottom="true"
android:background="#535254">
<Button android:id="@+id/btn_save" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentRight="true"
android:layout_marginTop="7dp" android:layout_marginRight="15dp"
android:layout_below="@+id/edit_message"
android:text = "Save" />
<Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="7dp"
android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />
</RelativeLayout>
</RelativeLayout>
Quiero que los 2 botones inferiores deben ir hacia arriba cuando aparezca el teclado virtual en la imagen.
fuente
android:windowSoftInputMode="adjustPan"
dime si este trabajo ..adjustResize
y,adjustPan
al mismo tiempo, del javadoc deandroid.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE
: "Esto no se puede combinar con {@link SOFT_INPUT_ADJUST_PAN}"Respuestas:
Basado en la solución de yghm, codifiqué una clase de conveniencia que me permite resolver el problema con una sola línea (después de agregar la nueva clase a mi código fuente, por supuesto). El one-liner es:
Y la clase de implementación es:
Espero que esto ayude a alguien.
fuente
return (r.bottom - r.top);
areturn r.bottom
conseguir que funcione en mi HTC uno mini, de lo contrario la vista de la actividad sería empujado demasiado alto por el tamaño de la barra de estado. Sin embargo, aún no lo he probado en otro dispositivo. Espero que pueda ayudar.frameLayoutParams.height = usableHeightSansKeyboard;
tengo que usarlo.frameLayoutParams.height = usableHeightNow;
Si no lo hago, algunos elementos quedan fuera de la pantalla.Como la respuesta ya ha sido elegida y se sabe que el problema es un error, pensé que agregaría un "Posible solución".
Puede alternar el modo de pantalla completa cuando se muestra el teclado virtual. Esto permite que el "ajustarPan" funcione correctamente.
En otras palabras, todavía uso @android: style / Theme.Black.NoTitleBar.Fullscreen como parte del tema de la aplicación y stateVisible | ajustarResize como parte del modo de entrada suave de la ventana de actividad, pero para que funcionen juntos debo alternar el modo de pantalla completa antes de que aparezca el teclado.
Use el siguiente código:
Desactivar el modo de pantalla completa
Activar el modo de pantalla completa
Nota: la inspiración vino de: Ocultar el título en modo de pantalla completa
fuente
Probé la solución de Joseph Johnson , pero al igual que otros, me encontré con el problema de la brecha entre el contenido y el teclado. El problema se produce porque el modo de entrada suave siempre se desplaza al usar el modo de pantalla completa. Esta panorámica interfiere con la solución de Joseph cuando activa un campo de entrada que estaría oculto por la entrada de software.
Cuando aparece la entrada de software, el contenido se desplaza primero en función de su altura original, y luego se redimensiona según el diseño solicitado por la solución de Joseph. El cambio de tamaño y el diseño posterior no deshacen la panorámica, lo que da como resultado el espacio. El orden completo de los eventos es:
No es posible deshabilitar la panorámica, pero es posible forzar el desplazamiento de la panorámica a 0 cambiando la altura del contenido. Esto se puede hacer en el oyente, ya que se ejecuta antes de que se realice la panorámica. Establecer la altura del contenido a la altura disponible da como resultado una experiencia de usuario fluida, es decir, sin parpadeos.
También hice estos cambios. Si alguno de estos presenta problemas, avíseme:
getWindowVisibleDisplayFrame
. losRect
almacena en caché para evitar un poco de basura innecesaria.Se ha probado en un Nexus 5 y en emuladores con niveles de API 16-24 con tamaños de pantalla que varían de pequeño a grande.
El código ha sido portado a Kotlin, pero portar mis cambios a Java es simple. Déjame saber si necesitas ayuda:
fuente
possiblyResizeChildOfContent
llamada y laremoveListener
llamada, e incluso después de alcanzar elremoveListener
punto de interrupción,possiblyResizeChildOfContent
todavía se está llamando. ¿Alguien más tiene este problema?Acabo de encontrar una solución simple y confiable si está utilizando el enfoque de interfaz de usuario del sistema ( https://developer.android.com/training/system-ui/immersive.html ).
Funciona en el caso cuando está usando
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, por ejemplo, si está usandoCoordinatorLayout
.No funcionará para
WindowManager.LayoutParams.FLAG_FULLSCREEN
(El que también puede configurar en el temaandroid:windowFullscreen
), pero puede lograr un efecto similar conSYSTEM_UI_FLAG_LAYOUT_STABLE
(que "tiene el mismo efecto visual" según los documentos ) y esta solución debería funcionar nuevamente.Lo probé en mi dispositivo con Marshmallow.
La clave es que los teclados suaves también son una de las ventanas del sistema (como la barra de estado y la barra de navegación), por lo que el
WindowInsets
envío por el sistema contiene información precisa y confiable al respecto.Para el caso de uso como en
DrawerLayout
cuando estamos tratando de dibujar detrás de la barra de estado, podemos crear un diseño que ignore solo el recuadro superior y aplique el recuadro inferior que representa el teclado virtual.Aquí está mi costumbre
FrameLayout
:Y para usarlo:
Teóricamente, esto debería funcionar para cualquier dispositivo sin modificación loca, mucho mejor que cualquier hack que intente tomar un tamaño aleatorio
1/3
o1/4
de pantalla como referencia.(Requiere API 16+, pero estoy usando pantalla completa solo en Lollipop + para dibujar detrás de la barra de estado, por lo que es la mejor solución en este caso).
fuente
Tenga en cuenta que
android:windowSoftInputMode="adjustResize"
no funciona cuandoWindowManager.LayoutParams.FLAG_FULLSCREEN
se configura para una actividad. Tienes dos opciones.Desactive el modo de pantalla completa para su actividad. La actividad no se redimensiona en modo de pantalla completa. Puede hacerlo en xml (cambiando el tema de la actividad) o en código Java. Agregue las siguientes líneas en su método onCreate ().
O
Use una forma alternativa para lograr el modo de pantalla completa. Agregue el siguiente código en su método onCreate ().
Tenga en cuenta que el método 2 solo funciona en Android 4.1 y superior.
fuente
Tuve que enfrentar este problema también y tuve un trabajo en torno al cual revisé HTC uno, galaxy s1, s2, s3, nota y sensación de HTC.
poner un oyente de diseño global en la vista raíz de su diseño
y allí comprobé la diferencia de altura y si la diferencia de altura de la pantalla es mayor que un tercio de la altura de la pantalla, podemos suponer que el teclado está abierto. lo tomé de esta respuesta .
Esto probablemente no sea a prueba de balas y tal vez en algunos dispositivos no funcione, pero funcionó para mí y espero que también lo ayude.
fuente
Implementé la solución Joseph Johnson y funcionó bien, noté que después de usar esta solución, a veces el cajón de la aplicación no se cierra correctamente. Agregué una funcionalidad para eliminar el escucha removeOnGlobalLayoutListener cuando el usuario cierra el fragmento donde se encuentran los textos de edición.
utiliza la clase donde se encuentran mis textos de edición
fuente
Agregue
android:fitsSystemWindows="true"
al diseño, y este diseño cambiará de tamaño.fuente
Para que funcione con FullScreen:
Use el complemento de teclado iónico. Esto le permite escuchar cuándo aparece y desaparece el teclado.
OnDeviceReady agrega estos oyentes de eventos:
La lógica:
Básicamente, si la diferencia es negativa, esa es la cantidad de píxeles que el teclado cubre de su entrada. Entonces, si ajusta su div padre por esto, eso debería contrarrestarlo.
Agregar tiempos de espera a la lógica dice que 300 ms también debería optimizar el rendimiento (ya que esto permitirá que aparezca el tiempo del teclado.
fuente
Probé la clase de Joseph Johnson, y funcionó, pero no satisfizo mis necesidades. En lugar de emular android: windowSoftInputMode = "ajustarResize", necesitaba emular android: windowSoftInputMode = "ajustarPan".
Estoy usando esto para una vista web a pantalla completa. Para desplazar la vista de contenido a la posición correcta, necesito usar una interfaz de JavaScript que proporcione detalles sobre la posición del elemento de página que tiene el foco y, por lo tanto, está recibiendo la entrada del teclado. He omitido esos detalles, pero proporcioné mi reescritura de la clase de Joseph Johnson. Proporcionará una base muy sólida para que pueda implementar una panorámica personalizada frente a su cambio de tamaño.
fuente
De hecho, la apariencia del teclado suave no parece afectar
Activity
de ninguna manera, sin importar lowindowSoftInputMode
que seleccione en elFullScreen
modo.Aunque no pude encontrar mucha documentación sobre esta propiedad, creo que el
FullScreen
modo fue diseñado para aplicaciones de juegos que no requieren mucho uso del teclado virtual. Si la suya es una actividad que requiere la interacción del usuario a través del teclado virtual, reconsidere el uso de un tema que no sea de pantalla completa. Puede apagar la barra de título usando unNoTitleBar
tema. ¿Por qué querrías ocultar la barra de notificaciones?fuente
Solo mantenlo como
android:windowSoftInputMode="adjustResize"
. Porque se da para mantener sólo uno de cada"adjustResize"
y"adjustPan"
(El modo de ajuste de la ventana se especifica, ya sea con o adjustResize adjustPan. Se recomienda que siempre se especifica una o la otra). Puede encontrarlo aquí: http://developer.android.com/resources/articles/on-screen-inputs.htmlFunciona perfectamente para mí.
fuente
Actualmente estoy usando este enfoque y funciona de maravilla. El truco es que obtenemos la altura del teclado de diferentes métodos en 21 arriba y abajo y luego lo usamos como el relleno inferior de nuestra vista raíz en nuestra actividad. Supuse que su diseño no necesita un relleno superior (va debajo de la barra de estado) pero en caso de que lo haga, infórmeme para actualizar mi respuesta.
MainActivity.java
No olvide abordar su vista raíz con una identificación:
activity_main.xml
Espero que ayude a alguien.
fuente
solo use
android:windowSoftInputMode="adjustResize|stateHidden
mientras usa AdjustPan y luego deshabilita la propiedad de cambiofuente
fuente
basado en https://stackoverflow.com/a/19494006/1815624 y deseo de que esto suceda ...
idea actualizada
combinando respuestas de
Código relevante:
Fuente completa en https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java
vieja idea
Cree un valor estático de la altura de los contenedores antes de abrir el teclado Establezca la altura del contenedor en función de
usableHeightSansKeyboard - heightDifference
cuándo se abre el teclado y vuelva a establecer el valor guardado cuando se cierreMétodos en MainActivity
Ejemplo de contenedor XML
de manera similar, se pueden agregar márgenes si es necesario ...
Otra consideración es el uso de relleno, un ejemplo de esto se puede encontrar en:
https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589
fuente
1) Crear KeyboardHeightHelper:
2) Deja que tu actividad sea pantalla completa:
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
3) Escuche los cambios de altura del teclado y agregue el relleno inferior para su vista:
Por lo tanto , cada vez que aparezca el teclado en la pantalla, el relleno inferior para su vista cambiará y el contenido se reorganizará.
fuente
Desea que la barra inferior se adhiera a la parte inferior de la vista, pero cuando se muestra el teclado, deben moverse hacia arriba para colocarse encima del teclado, ¿verdad?
Puedes probar este fragmento de código:
La barra inferior se adherirá a la parte inferior de la vista y el diseño lineal que contiene la vista de desplazamiento tomará lo que quede de la vista después de que se muestren la barra superior / inferior y el teclado. Avísame si también te funciona.
fuente
Gracias Joseph por tu respuesta. Sin embargo, en el método posiblementeResizeChildOfContent (), la porción
no funcionaba para mí, ya que la parte inferior de la vista se ocultó. Así que tuve que tomar una variable global restoreHeight, y en el constructor, inserté la última línea
y luego reemplacé la parte mencionada anteriormente con
Pero no tengo idea de por qué su código no funcionó para mí. Sería de gran ayuda, si alguien puede arrojar luz sobre esto.
fuente
Solo estaba usando el modo de pantalla completa para ocultar la barra de estado. Sin embargo, quiero que la aplicación cambie de tamaño cuando se muestre el teclado. Todas las otras soluciones (probablemente debido a la antigüedad de la publicación) fueron complicadas o no fueron posibles para mi uso (quiero evitar cambiar el código Java para el saqueo de PhoneGap Build).
En lugar de usar Pantalla completa, modifiqué mi configuración para Android para que no sea de pantalla completa:
Y agregó el
cordova-plugin-statusbar
, a través de la línea de comando:Cuando la aplicación se ha cargado, simplemente llamo a un método en el complemento para esconderse, como:
Esto funciona como un encanto. El único inconveniente real es que la barra de estado es brevemente visible mientras se carga la aplicación. Para mis necesidades, eso no fue un problema.
fuente
He probado todas las respuestas posibles de stackOverflow, finalmente resolví después de una semana de búsqueda. He usado el diseño de coordenadas y cambié esto con linearLayout y mi problema está solucionado. No sé, posiblemente, el diseño de coordenadas tiene errores o cualquier cosa, mi error.
fuente
Intenté muchas soluciones, incluidas las de Joseph Johnson y Johan Stuyts. Pero como resultado obtuve un espacio en blanco entre el contenido y el teclado en algunos dispositivos (como Lenovo s820) en todos los casos. Así que hice algunos cambios en sus códigos y finalmente obtuve una solución de trabajo.
Mi idea se basa en agregar margen a la parte superior del contenido cuando se muestra el teclado.
Como puede ver, agrego 30 px a la diferencia porque hay un pequeño espacio en blanco entre la parte superior de la pantalla y la zona de contenido con margen. Y no sé de dónde aparece, así que decidí reducir los márgenes y ahora funciona exactamente como lo necesitaba.
fuente
Hoy no funciona el ajuste de ajuste de tamaño en pantalla completa es real para Android SDK.
De las respuestas que encontré:
la solución , pero la solución muestra esto en el problema de la imagen:
Entonces encontré la solución y eliminé la única acción innecesaria:
Entonces, vea mi código de solución fija en Kotlin:
Mi código de implementación de corrección de errores:
fuente
No utilizar:
porque funciona mal En lugar de eso, use:
fuente
En mi caso, este problema comenzó a suceder una vez que agregué Crosswalk a mi aplicación Cordova. Mi aplicación no se usa en pantalla completa y Android: windowSoftInputMode = "ajustarPan".
Ya tenía el complemento de teclado iónico en la aplicación, por lo que fue fácil detectar si el teclado estaba arriba o abajo:
Intenté todas las soluciones anteriores, pero la línea simple que terminó haciéndolo fue este bit de css:
Espero que esto te salve los pocos días que pasé en esto. :)
fuente