Método 1:
Para lograr una barra de estado completamente transparente, debe usar statusBarColor
, que solo está disponible en API 21 y superior. windowTranslucentStatus
está disponible en API 19 y superior, pero agrega un fondo teñido para la barra de estado. Sin embargo, la configuración windowTranslucentStatus
logra una cosa que no es el cambio statusBarColor
a transparente: establece las banderas SYSTEM_UI_FLAG_LAYOUT_STABLE
y SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
. La forma más fácil de obtener el mismo efecto es establecer manualmente estos indicadores, lo que desactiva de manera efectiva las inserciones impuestas por el sistema de diseño de Android y te deja valerte por ti mismo.
Llama a esta línea en su onCreate
método:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Asegúrese de establecer también la transparencia en /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
O establezca la transparencia mediante programación:
getWindow().setStatusBarColor(Color.TRANSPARENT);
El lado bueno de este enfoque es que los mismos diseños y diseños también se pueden usar en API 19 al cambiar la barra de estado transparente por la barra de estado translúcida teñida.
<item name="android:windowTranslucentStatus">true</item>
Método 2:
Si solo necesita pintar una imagen de fondo debajo de su barra de estado, en lugar de colocar una vista detrás de ella, esto puede hacerse simplemente configurando el fondo del tema de su actividad a la imagen deseada y configurando la transparencia de la barra de estado como se muestra en el método # 1) Este fue el método que usé para crear las capturas de pantalla para el artículo de Android Police de hace unos meses.
Método 3:
Si tiene que ignorar las inserciones del sistema estándar para algunos diseños mientras los mantiene trabajando en otros, la única forma viable de hacerlo es trabajar con la ScrimInsetsFrameLayout
clase a menudo vinculada . Por supuesto, algunas de las cosas que se hacen en esa clase no son necesarias para todos los escenarios. Por ejemplo, si no planea usar la superposición de la barra de estado sintética, simplemente comente todo en el init()
método y no se moleste en agregar nada al archivo attrs.xml. He visto que este enfoque funciona, pero creo que encontrará que trae algunas otras implicaciones que pueden ser mucho trabajo para sortear.
También vi que te opones a envolver múltiples diseños. En el caso de envolver un diseño dentro de otro, donde ambos tienen match_parent
altura y ancho, las implicaciones de rendimiento son demasiado triviales para preocuparse. En cualquier caso, puede evitar esa situación por completo cambiando la clase que se extiende FrameLayout
a cualquier otro tipo de clase de diseño que desee. Funcionará bien.
android:fitsSystemWindows="true"