Methode 1:
Um eine vollständig transparente Statusleiste zu erhalten, müssen Sie diese verwenden statusBarColor
, die nur für API 21 und höher verfügbar ist. windowTranslucentStatus
ist für API 19 und höher verfügbar, fügt jedoch einen getönten Hintergrund für die Statusleiste hinzu. Mit der Einstellung wird windowTranslucentStatus
jedoch eines erreicht, was beim Wechsel statusBarColor
zu transparent nicht der Fall ist: Sie setzt das SYSTEM_UI_FLAG_LAYOUT_STABLE
undSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Flags . Der einfachste Weg, um den gleichen Effekt zu erzielen, besteht darin, diese Flags manuell zu setzen, wodurch die vom Android-Layoutsystem auferlegten Insets effektiv deaktiviert werden und Sie sich selbst überlassen bleiben.
Sie nennen diese Zeile in Ihrer onCreate
Methode:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Stellen Sie sicher, dass Sie die Transparenz auch in /res/values-v21/styles.xml festlegen:
<item name="android:statusBarColor">@android:color/transparent</item>
Oder stellen Sie die Transparenz programmgesteuert ein:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Die gute Seite dieses Ansatzes ist, dass dieselben Layouts und Designs auch für API 19 verwendet werden können, indem die transparente Statusleiste gegen die getönte durchscheinende Statusleiste ausgetauscht wird.
<item name="android:windowTranslucentStatus">true</item>
Methode 2:
Wenn Sie nur ein Hintergrundbild unter Ihre Statusleiste malen müssen, anstatt eine Ansicht dahinter zu positionieren, können Sie einfach den Hintergrund des Themas Ihrer Aktivität auf das gewünschte Bild einstellen und die Transparenz der Statusleiste wie in Methode # gezeigt einstellen. 1. Mit dieser Methode habe ich die Screenshots für den Artikel der Android Police erstellt einigen Monaten erstellt.
Methode 3:
Wenn Sie die Standardsystemeinfügungen für einige Layouts ignorieren müssen, während sie in anderen Layouts funktionieren, können Sie dies nur mit der häufig verknüpften ScrimInsetsFrameLayout
Klasse tun . Natürlich sind einige der in dieser Klasse durchgeführten Dinge nicht für alle Szenarien erforderlich. Wenn Sie beispielsweise nicht vorhaben, die Überlagerung der synthetischen Statusleiste zu verwenden, kommentieren Sie einfach alles in derinit()
vorhaben, die Methode aus und fügen Sie der Datei attrs.xml nichts hinzu. Ich habe gesehen, dass dieser Ansatz funktioniert, aber ich denke, Sie werden feststellen, dass er einige andere Implikationen mit sich bringt, die möglicherweise viel Arbeit bedeuten, um herumzukommen.
Ich habe auch gesehen, dass Sie es ablehnen, mehrere Layouts zu verpacken. Wenn Sie ein Layout in ein anderes einwickeln, bei dem sowohl die match_parent
Höhe als auch die Breite berücksichtigt werden, sind die Auswirkungen auf die Leistung zu trivial, um sich Sorgen zu machen. Unabhängig davon können Sie diese Situation vollständig vermeiden, indem Sie die Klasse, von der sie ausgeht, FrameLayout
auf eine andere Art von Layoutklasse ändern, die Sie mögen. Es wird gut funktionieren.
android:fitsSystemWindows="true"