Metodo n. 1:
Per ottenere una barra di stato completamente trasparente, è necessario utilizzare statusBarColor
, disponibile solo su API 21 e successive. windowTranslucentStatus
è disponibile su API 19 e successive, ma aggiunge uno sfondo colorato per la barra di stato. Tuttavia, l'impostazione windowTranslucentStatus
consente di ottenere una cosa che statusBarColor
non diventa trasparente: imposta i flag SYSTEM_UI_FLAG_LAYOUT_STABLE
e SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
. Il modo più semplice per ottenere lo stesso effetto è impostare manualmente questi flag, che disabilita efficacemente gli inserti imposti dal sistema di layout di Android e ti lascia fare da soli.
Chiamate questa linea nel vostro onCreate
metodo:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Assicurati di impostare anche la trasparenza in /res/values-v21/styles.xml:
<item name="android:statusBarColor">@android:color/transparent</item>
Oppure imposta la trasparenza a livello di codice:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Il lato positivo di questo approccio è che gli stessi layout e design possono essere utilizzati anche su API 19 scambiando la barra di stato trasparente per la barra di stato traslucida colorata.
<item name="android:windowTranslucentStatus">true</item>
Metodo n. 2:
Se devi solo dipingere un'immagine di sfondo sotto la barra di stato, anziché posizionare una vista dietro di essa, puoi farlo semplicemente impostando lo sfondo del tema della tua attività sull'immagine desiderata e impostando la trasparenza della barra di stato come mostrato nel metodo # 1. Questo è stato il metodo che ho usato per creare gli screenshot per l' articolo della polizia Android di alcuni mesi fa.
Metodo n. 3:
Se devi ignorare gli inserti di sistema standard per alcuni layout mentre li fai funzionare in altri, l'unico modo possibile per farlo è lavorare con la ScrimInsetsFrameLayout
classe spesso collegata . Naturalmente, alcune delle cose fatte in quella classe non sono necessarie per tutti gli scenari. Ad esempio, se non si prevede di utilizzare l'overlay di barra di stato sintetico, è sufficiente commentare tutto nel init()
metodo e non preoccuparsi di aggiungere nulla al file attrs.xml. Ho visto questo approccio funzionare, ma penso che scoprirai che comporta alcune altre implicazioni che potrebbero essere un sacco di lavoro da aggirare.
Ho anche visto che sei contrario a impacchettare più layout. Nel caso di avvolgere un layout all'interno di un altro, dove entrambi hanno match_parent
altezza e larghezza, le implicazioni sulle prestazioni sono troppo banali di cui preoccuparsi. Indipendentemente da ciò, puoi evitare completamente quella situazione cambiando la classe da cui si estende FrameLayout
a qualsiasi altro tipo di classe Layout che ti piace. Funzionerà bene.
android:fitsSystemWindows="true"