Método 1:
Para obter uma barra de status completamente transparente, você deve usar o statusBarColor
que está disponível apenas na API 21 e acima. windowTranslucentStatus
está disponível na API 19 e acima, mas adiciona um fundo colorido à barra de status. No entanto, a configuração windowTranslucentStatus
alcança algo que a alteração statusBarColor
para transparente não: define os sinalizadores SYSTEM_UI_FLAG_LAYOUT_STABLE
e SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
. A maneira mais fácil de obter o mesmo efeito é definir manualmente esses sinalizadores, o que desativa efetivamente as inserções impostas pelo sistema de layout do Android e deixa você se defender.
Você chama esta linha no seu onCreate
método:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Defina também a transparência em /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Ou defina a transparência programaticamente:
getWindow().setStatusBarColor(Color.TRANSPARENT);
O lado bom dessa abordagem é que os mesmos layouts e designs também podem ser usados na API 19, negociando a barra de status transparente para a barra de status translúcida colorida.
<item name="android:windowTranslucentStatus">true</item>
Método 2:
Se você só precisar pintar uma imagem de plano de fundo sob a barra de status, em vez de posicionar uma vista por trás dela, isso pode ser feito simplesmente configurando o plano de fundo do tema da sua atividade para a imagem desejada e definindo a transparência da barra de status, conforme mostrado no método # 1 Este foi o método que eu usei para criar as capturas de tela do artigo Polícia Android de alguns meses atrás.
Método # 3:
Se você precisar ignorar as inserções padrão do sistema para alguns layouts, mantendo-os trabalhando em outros, a única maneira viável de fazer isso é trabalhar com a ScrimInsetsFrameLayout
classe frequentemente vinculada . Obviamente, algumas das coisas feitas nessa classe não são necessárias para todos os cenários. Por exemplo, se você não planeja usar a sobreposição da barra de status sintético, simplesmente comente tudoinit()
método e não se preocupe em adicionar nada ao arquivo attrs.xml. Eu já vi essa abordagem funcionar, mas acho que você descobrirá que ela traz outras implicações que podem dar muito trabalho para contornar.
Também vi que você se opõe a agrupar vários layouts. No caso de agrupar um layout dentro de outro, onde ambos têm match_parent
altura e largura, as implicações de desempenho são muito triviais para se preocupar. Independentemente disso, você pode evitar completamente essa situação alterando a classe da qual ela se estende FrameLayout
para qualquer outro tipo de classe de Layout que desejar. Funcionará muito bem.
android:fitsSystemWindows="true"