FLAG_TRANSLUCENT_NAVIGATION no está disponible en modo horizontal?
Este problema es similar a Compruebe si la navegación translúcida está disponible, pero no completamente. Tengo un Nexus 4 con CyanogenMod 11 o Android 4.4 equivalente y cualquier aplicación que se ejecuta en modo horizontal con FLAG_TRANSLUCENT_NAVIGATION no cuenta con la translucidez en la interfaz de usuario del sistema como en el modo vertical.
El mismo problema se puede reproducir en Nexus 5, ya que no he visto ninguna aplicación de Google construido para Android 4.4 en modo horizontal con botones translúcidos.
- Comprender la necesidad de las señales de Android VSYNC
- Emulación de tarjeta basada en host con tarjeta fija ID
- IsValidFragment Android API 19
- Ejecutar un tarro multidex independiente en Android Kitkat
- Android 4.4: ¿es válido el permiso WRITE_EXTERNAL_STORAGE en el almacenamiento externo primario / mnt / sdcard?
Este es el código que estoy usando
int API_LEVEL = android.os.Build.VERSION.SDK_INT; if (API_LEVEL >= 19) { getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ); }
Y mientras que la superficie de la ventana se hace más grande (e inutilizable) no hay translucidez.
Así que la pregunta es, ¿tengo que hacer algo más para que funcione en modo horizontal? O es un error de Android?
- Carpeta de Android KitKat 4.4 en la tarjeta sd
- TWO_SWIPE_DOWN TAP no puede capturar en Google Glass GDK (XE16)
- Navegación incorrecta al guardar contactos en Android
- Cómo hacer Android Webview Background Transparente en KITKAT (4.4)
- No se ha encontrado actividad para manejar Intent - android.intent.action.OPEN_DOCUMENT
- MediaPlayer: Debe tener un controlador de subtítulos ya establecido: KitKat
- ¿Cómo salir completamente de Immersive pantalla completa?
- Texto de contenido de notificación de Android no aparecerá en OS 4.4.4 Kitkat, pero se muestra en OS 5.0 Lollipop
No sé si tienen la intención de cambiar el comportamiento, pero parece deliberado. Desde que FLAG_TRANSLUCENT_NAVIGATION
fue introducido en Android Kitkat, los dispositivos de "teléfono" siempre han tenido una barra de navegación negra opaca en el lado derecho de la pantalla en el paisaje. Incluso en el momento de este post, hay una nueva bandera en Android Lollipop ( FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
) que tiene el mismo comportamiento, no importa lo que se pasó a setStatusBarColor() )
.
He aquí un código aproximado que podrías usar para saber cuándo el estilo de la barra de navegación está fuera de tu control.
class MyActivity extends Activity { // ... boolean isNavigationForcedBlack() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return true; } final int windowFlags = getWindow().getAttributes().flags; int navControlFlags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { navControlFlags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; } if ((windowFlags & navControlFlags) == 0) { return true; } boolean deviceHasOpaqueSideLandscapeNav = getDeviceSmallestWidthDp() < 600; boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; return deviceHasOpaqueSideLandscapeNav && isLandscape; } DisplayMetrics dm = new DisplayMetrics(); float getDeviceSmallestWidthDp() { getWindowManager().getDefaultDisplay().getRealMetrics(dm); float widthDp = dm.widthPixels / dm.density; float heightDp = dm.heightPixels / dm.density; return Math.min(widthDp, heightDp); } }
Puede ver si el efecto translúcido está disponible en el dispositivo actual utilizando el código siguiente:
int id = getResources().getIdentifier("config_enableTranslucentDecor", "bool", "android"); if (id != 0 && getResources().getBoolean(id)) { // Translucent available Window w = getWindow(); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }
Con este código, puede comprobar si el dispositivo puede utilizar los FLAG_TRANSLUCENT_NAVIGATION
y FLAG_TRANSLUCENT_STATUS
. Entonces, tienes que decir que quieres que Actionbar, la barra de notificaciones y la barra de botones suaves se superpongan a tu diseño (que se llamará antes de setContentView(R.layout.yourlayout);
en onCreate()
):
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
No se olvide de añadir un poco de relleno a su contenido para evitar que sea inalcanzable, ya que sería "ocultos" por esos elementos. Para lograr esto, puede agregar el android:fitsSystemWindows="true"
en su contenedor principal en su diseño.