Tengo problemas con la barra de acción / barra de navegación translúcida en el nuevo Android KitKat (4.4) y el windowSoftInputMode="adjustResize"
.
Cambiando normalmente el InputMode para ajustarResize, la aplicación debería cambiar su tamaño cuando se muestra el teclado ... ¡pero aquí no lo hará! Si elimino las líneas para el efecto transparente, el cambio de tamaño está funcionando.
Entonces, si el teclado está visible, mi ListView está debajo y no puedo acceder a los últimos elementos. (Solo ocultando el teclado manualmente)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
values-v19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
¿Alguien ideas para arreglar esto?
Respuestas:
Te falta la siguiente propiedad:
en la raíz
RelativeLayout
del fragmento de diseño .xml.Actualizar:
El año pasado hubo una charla interesante de Chris Bane que explica en detalle cómo funciona esto:
https://www.youtube.com/watch?v=_mGDMVRO3iE
fuente
Hay un informe de error relacionado aquí . He encontrado una solución que, a partir de pruebas limitadas, parece hacer el truco sin repercusiones. Agregue una implementación personalizada de su raíz
ViewGroup
(casi siempre estoy usandoFrameLayout
, así que esto es con lo que he probado) con la lógica a continuación. Luego, use este diseño personalizado en lugar de su diseño raíz y asegúrese de configurarloandroid:fitsSystemWindows="true"
. Luego, puede llamar engetInsets()
cualquier momento después del diseño (por ejemplo, agregar unOnPreDrawListener
) para ajustar el resto de su diseño para tener en cuenta las inserciones del sistema, si lo desea.Dado que
fitSystemWindow
s ha quedado en desuso, consulte la respuesta a continuación para completar la solución.fuente
La respuesta de @kcoppock es realmente útil, pero fitSystemWindows quedó en desuso en el nivel 20 de API
Entonces, desde API 20 (KITKAT_WATCH), debe anular onApplyWindowInsets
fuente
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
(el mismo código) funcionó para míEsto funcionó para mí tener una barra de estado translúcida y ajustarResize en fragmentos:
Haga un RelativeLayout personalizado como @ Victor91 y @kcoppock dijeron.
Use CustomRelativeLayout como diseño principal para su fragmento.
Declarar tema con android: windowTranslucentStatus = true
La actividad del contenedor debe declararse en Manifiesto con android: windowSoftInputMode = "ajustarResize" y usar el tema declarado
¡Por favor, utiliza fitsSystemWindows en el diseño de raíz fragmentado!
Luego en xml,
fuente
Si desea personalizar las inserciones y está apuntando a un nivel de API> = 21, puede lograr esto sin tener que crear un grupo de vista personalizado. Simplemente configurando el
fitsSystemWindows
relleno, se aplicará a la vista de contenedor de forma predeterminada, lo que quizás no desee.Las verificaciones de versión están integradas en este método y solo los dispositivos> = 21 ejecutarán el código dentro del lambda. Ejemplo de Kotlin:
Asegúrese de que su diseño todavía establezca la
fitsSystemWindows
bandera; de lo contrario, no se llamará al oyente de inserciones de ventana.Estas fuentes son útiles:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
fuente
BaseFragment
, junto conview.fitsSystemWindows = true
y simplemente funciona sin ningún cambio en los diseños XML reales o las subclases Ver.Tuve el mismo problema, My Activity tenía un ScrollView como vista raíz y con la barra de estado translúcida activada, no cambió de tamaño correctamente cuando se mostró el teclado ... y consecuentemente, la pantalla no se desplazó ocultando las vistas de entrada.
Solución: Movió todo (diseño y lógica de actividad) dentro de un nuevo Fragmento. Luego cambió la Actividad para incluir solo este Fragmento. ¡Ahora todo funciona como se esperaba!
Este es el diseño de la actividad:
fuente
Basado en la solución alternativa de Joseph Johnson en Android Cómo ajustar el diseño en modo de pantalla completa cuando el teclado está visible
llama a esto
onCreate()
despuéssetContentView()
en tu actividad.AndroidBug5497Workaround.assistActivity(this);
un poco diferente del original reemplazar
return (r.bottom - r.top);
conreturn r.bottom;
encomputeUsableHeight()
por alguna razón, debo establecer mi
fitsSystemWindows
atributo de actividad enfalse
.Esta solución me salvó. Funciona bien para mí. La esperanza puede ayudarte.
la clase de implementación es:
fuente
No debería funcionar con la barra de estado translúcida; esa configuración fuerza a la ventana a modo de pantalla completa que no funciona con ajustarResize.
Puede usar ajustarPan o usar las propiedades de fitSystemWindows. Sin embargo, sugeriría leer sobre la función, tiene efectos secundarios significativos:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
fuente
AndroidBug5497Workaround.java se encarga de la pérdida de memoria. necesita debajo del código
Mi muestra usando RxJava que automáticamente llama a removeOnGlobalLayoutListener () cuando onPause () en el ciclo de vida de Activity
fuente
Tuve un problema
Configuré windowDrawsSystemBarBackgrounds en 'verdadero' y mi aplicación debería aparecer debajo de la barra de estado.
Es mi tema de actividad.
y obtuve ayuda del blog de jianshu . Puedes leer código pero texto como yo. Añado algunos códigos más.
Este es mi diseño de fragmento.
Quiero que te sea útil. ¡buena suerte!
fuente
fuente
Yo tuve el mismo problema. He resuelto usando coordinatorlayout
activity.main.xml
content_main2.xml
MainActivity.java
ahora agregue esta línea linearLayoutManager.setStackFromEnd (true);
fuente
fuente
Agregue esto primero en su diseño raíz.
Cuando utiliza este enfoque, se convierte en su responsabilidad asegurarse de que las partes críticas de la interfaz de usuario de su aplicación (por ejemplo, los controles integrados en una aplicación de Mapas) no terminen siendo cubiertas por las barras del sistema. Esto podría hacer que su aplicación sea inutilizable. En la mayoría de los casos, puede manejar esto agregando el atributo android: fitsSystemWindows a su archivo de diseño XML, establecido en verdadero. Esto ajusta el relleno del ViewGroup primario para dejar espacio para las ventanas del sistema. Esto es suficiente para la mayoría de las aplicaciones.
Sin embargo, en algunos casos, es posible que deba modificar el relleno predeterminado para obtener el diseño deseado para su aplicación. Para manipular directamente cómo se presenta su contenido en relación con las barras del sistema (que ocupan un espacio conocido como "insertos de contenido" de la ventana), anule fitSystemWindows (insertos Rect). La jerarquía de vistas llama al método fitSystemWindows () cuando las inserciones de contenido de una ventana han cambiado, para permitir que la ventana ajuste su contenido en consecuencia. Al anular este método, puede manejar las inserciones (y, por lo tanto, el diseño de su aplicación) como lo desee.
https://developer.android.com/training/system-ui/status#behind
Si quieres convertirte en un instalador de ventanas maestro, mira el video del desarrollador de Android. https://www.youtube.com/watch?v=_mGDMVRO3iE
fuente
La mejor práctica permite al usuario desplazarse por el contenido cuando se muestra el teclado. Entonces, para agregar esta funcionalidad, debe colocar su diseño raíz dentro
ScrollView
y usarwindowSoftInputMode="adjustResize"
método de actividad .Pero si quieres usar esta funcionalidad con
<item name="android:windowTranslucentStatus">true</item>
marca en el contenido de Android 5 no será desplazable y se superpondrá con el teclado.Para resolver este problema, verifique esta respuesta
fuente