Die Statusleiste wird weiß und zeigt keinen Inhalt dahinter an


95

Ich probiere AppCompat auf Marshmallow aus. Und ich möchte eine transparente Statusleiste, die jedoch weiß wird. Ich habe ein paar Lösungen ausprobiert, aber sie haben bei mir nicht funktioniert ( Transparente Statusleiste funktioniert nicht mit windowTranslucentNavigation = "false" , Lollipop: Zeichnen Sie hinter statusBar, dessen Farbe auf transparent eingestellt ist ). Hier ist verwandter Code.

Meine styles.xml

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Aktivität

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

Fragment

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

Geben Sie hier die Bildbeschreibung ein


Können Sie dieses Problem lösen? Ich habe das gleiche Problem. In einer meiner Aktivitäten mit weißer Statusleiste
kirtan403

1
@ kirtan403 Ich habe mein Problem behoben, indem ich mein Aktivitätslayout von FrameLayout in RelativeLayout geändert habe. Bitte sehen Sie meine Antwort.
pt2121

Meins ist relativ und bekommt nur noch die weiße Statusleiste. Ich habe hier eine Frage gestellt: stackoverflow.com/q/33890066/1820644
kirtan403

Nachdem ich einen Tag lang gekämpft hatte, fand ich die Lösung, die für mich funktionierte. Hier ist die Antwort: stackoverflow.com/a/33892569/1820644
kirtan403

Ich habe den Status von android: windowTranslucentStatus in false geändert und es funktioniert
Kiran Benny Joseph

Antworten:


167

Ich habe die Antwort in diesem Link gefunden: Die Farbe der Statusleiste ändert sich nicht mit dem relativen Layout als Stammelement

Es stellt sich also heraus, dass wir das entfernen müssen

      <item name="android:statusBarColor">@android:color/transparent</item>

in styles.xml (v21). Und es funktioniert gut für mich.


Ja, das ist die Lösung. Weil android: fitSystemWindows Probleme verursacht, wenn die Registerkartenleiste scrollbar gemacht wird. Ich habe die gleiche Antwort gefunden, aber Sie haben sie früher gepostet. Erwähnen Sie auch, dass dies standardmäßig überschrieben ist, denke ich.
Jobbert

Dies sollte als akzeptierte Lösung gekennzeichnet werden. Dieses Problem hat sich überall in meiner App eingeschlichen. Diese Lösung hat es überall behoben, indem sie nur diese einzelne Zeile auskommentiert hat. Hat mir so Kopfschmerzen erspart!
BMB

Ich verwende CoordinatorLayout, daher funktioniert die andere Antwort auf CoordinatorLayout als Root für mich nicht (die Verwendung von fitSystemWindows = true, wie vorgeschlagen, hat auch nicht funktioniert). Diese Antwort funktioniert bei mir.
Bruce

Was ist, wenn meine Statusleistenfarbe transparent sein muss?
nullmn

1
@nullmn, dann müssen Sie Ihren Aktivitätshintergrund in etwas anderes ändern.
Phoenix Wang

95

(Ein bisschen spät zur Party, aber es könnte jemandem helfen)

Ich hatte genau das gleiche Problem. Irgendwie waren einige Aktivitäten normal, während neue, die ich erstellt habe, eine weiße Statusleiste anstelle eines colorPrimaryDarkWerts zeigten .

Nachdem ich einige Tipps ausprobiert hatte, bemerkte ich, dass die normal arbeitenden Aktivitäten alle CoordinatorLayoutals Wurzel des Layouts verwendet wurden, während ich sie für die anderen durch reguläre Layouts ersetzt hatte, da ich die von (bereitgestellten Funktionen usw.) nicht benötigte CoordinatorLayout.

Die Lösung besteht also darin, CoordinatorLayoutdas Root-Layout zu erstellen und dann darin Ihr früheres Layout-Root hinzuzufügen. Hier ist ein Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

BITTE BEACHTEN SIE, dass ohne android:fitsSystemWindows="true"diese Lösung bei mir nicht funktioniert.

Getestet auf Lollipop und Marshmallow


3
Die Lösung hat auch bei mir funktioniert. Aber warum passiert das? Die richtige Farbe der Statusleiste wird angezeigt, wenn root DrawerLayout oder CoordinatorLayout ist
user3316561

3
Dies funktionierte nur für mich beim Hinzufügen android:fitsSystemWindows="true"zu CoordinatorLayoutin Android 8.
Franco

2
@Franco Ich denke, dies ist der relevanteste Teil der Lösung. Ich sage das, weil ich hatte, CoordinatorLayoutals ich das gleiche Problem hatte und die spezifische Eigenschaft, die dies für mich android:fitsSystemWindows="true"
Wilhelm

Das android:fitsSystemWindows="true"hat bei mir nicht funktioniert. Was mein Problem gelöst hat, ist die Verwendung eines Themas, das nicht AppTheme.NoActionBarin der Aktivität mit a enthalten ist CoordinatorLayout. Ich weiß nicht, warum das das Problem behoben hat.
bmdelacruz

CoordinatorLayoutoder android:fitsSystemWindows="true"keiner arbeitet für mich.
Alif Hasnain

17
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

Ersetzen Sie dies einfach. StatusBarColor sollte Ihre erwartete Farbe sein und nicht TRANSPARENT


17

Sie müssen diese Eigenschaft Ihrem Stil hinzufügen, um den Inhalt anzuzeigen

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>

Das hat bei mir funktioniert. Dies sollte als Antwort akzeptiert werden.
Abdul Rehman

11

Fügen Sie dies in Ihre style.xml ein

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

und das in deinem onCreate ();

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

1
Danke, aber das funktioniert nicht. Die Statusleiste sieht gleich aus.
Pt2121

Bitte helfen Sie für dieses Problem ... das gleiche Problem hier ... keine der Lösungen funktioniert bis jetzt
Saeed Jassani

@SaeedJassani Ich habe eine Lösung gefunden, die für mich funktioniert hat. Wenn Sie das gleiche Problem haben, schauen Sie sich meine Frage und Antwort an: stackoverflow.com/a/33892569/1820644
kirtan403

9

Nachdem ich alle oben genannten Punkte erfolglos ausprobiert hatte, stellte ich fest, dass das Problem durch explizites Festlegen des Themas behoben wurde.

setTheme(R.style.AppTheme);

Das muss vor dem super.OnCreate () in Ihrer Aktivität gehen.


1
Ich kann bestätigen, dass dies die fehlerhafte Aktivität auf Marshmallow
behebt

liebe dich Mann, arbeitete wie ein Zauber, obwohl ich immer noch keine Ahnung habe warum: @
Adeel Ahmad

vor dem super.OnCreate () ist der Schlüssel
Karthik Rk

9

Fügen Sie dieses Element einfach in Ihre v21 \ styles.xml ein:

wahr

Es sollte so aussehen :

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>


1
Es hat bei mir mit falseWerten in den letzten 2 Elementen funktioniert . Seltsam, aber danke.
JCarlosR

Es funktioniert nur mit den beiden letzten Zeilen, aber der Inhalt wird hinter der Statusleiste angezeigt, Padding / Margin oder FitsSystemWindows helfen nicht. Getestet auf OP 5 mit Nougat
Anton Makov

9

Ich stand vor dem gleichen Problem. Ich habe in der Datei "v21 / styles.xml" den Wert true geändert:

 <item name="android:windowDrawsSystemBarBackgrounds">true</item>

zu:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>

7
<item name="android:statusBarColor">@android:color/transparent</item>

Sie sehen diese Codezeile in values ​​/ styles / styles.xml (v21). Entfernen Sie es und das löst das Problem

Link zu dieser Antwort


5

Ich habe mein Problem behoben, indem ich mein Aktivitätslayout von FrameLayout in RelativeLayout geändert habe. Vielen Dank an alle, die versucht haben zu helfen!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/transparent">

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

Versuchen Sie es mit Hierarchie-Viewer oder ViewInspector . Diese Tools könnten Ihnen helfen.


5

Entfernen Sie einfach das folgende Tag aus Style v21 @android: color / transparent

Das funktioniert bei mir.


@android: Farbe / transparent ist kein "Tag". Es kann der Wert eines Stilattributs sein, aber es ist kein "Tag". Was ist, wenn das OP diesen Wert mehr als einmal definiert hat? Welches sollte er entfernen? Ihre Antwort ist viel zu allgemein.
Geschütztes

Ja, das war auch bei mir der Fall. Danke, Shendre! :) und für Ihren Kommentar @protectedmember - das Betriebssystem hat kein Geschlecht.
zeroDivider

3

Besserer Ansatz

Überprüfen Sie Ihre style.xml-Datei, in der sich Ihr NoActionBar-Design befindet. Stellen Sie sicher, dass das übergeordnete Element Theme.AppCompat.NoActionBar hat, und passen Sie es an, indem Sie Ihr Farbschema hinzufügen. Legen Sie schließlich Ihre Themen nach Bedarf im Manifest fest.

Unten finden Sie ein Beispiel meiner Datei styles.xml (ActionBar + NoActionBar).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

2

Für mich hat es wie folgt funktioniert:

  1. Stellen Sie das Thema ein .NoActionBar
  2. Wickeln Sie die Symbolleiste ein android.support.design.widget.AppBarLayout
  3. Machen Sie android.support.design.widget.CoordinatorLayoutals übergeordnetes Layout.

Im Wesentlichen ist es der dritte Schritt, in dem die Statusleiste colorPrimaryDarkgezeichnet wird. Andernfalls wird sie nicht gezeichnet, wenn Sie ein NoActionBarThema verwenden. Der zweite Schritt gibt Ihrer Symbolleiste diese Überlagerung .


2

Für Stile v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

Für Stile v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

2

[Ausgabe]

Erweitern Sie im Projektfenster das Verzeichnis res -> values ​​-> styles.

Öffnen Sie styles.xml (v21)

BENUTZEN SIE EINEN VON UNTEN

  1. Ändern Sie in der Eigenschaft true in falseandroid:windowDrawsSystemBarBackgrounds .
  2. Ändern Sie @android: color / transparent in @ color / colorPrimaryDark in der android:statusBarColorEigenschaft.
  3. Entfernen Sie die android:statusBarColorEigenschaftslinie.

2

Wenn Ihre v21 / styles.xml enthält

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

Dann entfernen oder Kommentar unterhalb der Linie oder die Farbe wechselt von Statusleiste,

<item name="android:statusBarColor">@android:color/transparent</item>

Es funktioniert gut. Hoffe das ist hilfreich. Vielen Dank.


2

Ich habe eine Lösung dafür gefunden -

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

Fügen Sie dies Ihrem Stil hinzu und es funktioniert für API 21 oder höher.


1

Ich bin mir nicht sicher, ob es spät ist, aber ich hoffe, es hilft jemandem. * Erstellen Sie eine gefälschte Ansicht mit transparentem Hintergrund, die zum Layout passt, und erstellen Sie ein Koordinatorlayout als Stammlayoutelement.

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT


1

Das hat Arbeit für mich

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }

1
Hallo, willkommen bei StackOverflow! Könnten Sie Ihre Antwort bearbeiten, um herauszufinden, warum diese Antwort funktioniert? Kurze Erklärungen Ihres Codes reichen weit!
Gigazelle

0

Ich vermute, dass dies von Ihnen verursacht wird android:windowBackground. Ist @color/background_material_lightein Verweis auf Weiß?


Nee. Es ist definitiv nicht weiß, aber trotzdem danke! (Sie können die weißen Symbole darauf sehen.)
pt2121

Ich habe deine Frage falsch verstanden. Versuchen Sie es <item name="android:statusBarColor">@android:color/transparent</item>durch <item name="android:statusBarColor">@null</item>.
Hanspeide

Möchten Sie, dass das Bild hinter der Statusleiste angezeigt wird, um sicherzustellen, dass ich Sie richtig verstehe?
Hanspeide

0

Überprüfen Sie, ob diese Symbolleiste weiß wird - AppBar wird nach dem Scrollen vom Bildschirm nicht gezeichnet

https://code.google.com/p/android/issues/detail?id=178037#c19

Ich benutze Bibliotheken 23.0.0. und der Fehler tritt immer noch auf.

Um dieses Problem zu umgehen, fügen Sie eine Ansicht hinzu, die fast keinen Platz beansprucht und unsichtbar sein kann. Siehe die Struktur unten.

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Diese Fragen auf Stackoverflow.com beziehen sich auch auf diesen Fehler: CoordinatorLayout- Symbolleiste bei Eingabe bis zur vollen Höhe unsichtbar AppBarLayout - Layout manchmal unsichtbar, sobald es in die Ansicht aufgenommen wird (auch wenn es nicht eingegeben wurde)


Es ist nicht der gleiche Fehler. In meinem Fall ist es direkt nach der Aktivitätsanzeige weiß, nicht nach dem Scrollen vom Bildschirm.
Trotzdem

0

Wenn Sie RelativeLayout / CoordinatorLayout verwenden, ist dies die Lösung, die für mich funktioniert hat:

Du musst benutzen

  • KoordinatorLayout
  • AppBarLayout

Denken Sie daran, CoordinatorLayout anstelle von RelativeLayout zu verwenden (die Leistung ist besser und funktioniert perfekt mit AppBarLayout).

So sollte Ihr Fragment beginnen

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

Gute Codierung!


0
 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Fügen Sie das Element 'windowTranslucentStatus' in Stilen hinzu


0

Fügen Sie dies in Ihre style.xml ein

<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

Hinweis: Die Färbung der Statusleiste wird unterhalb der API-Ebene 21 nicht unterstützt.


-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Fügen Sie diese 2 Zeilen in der Java-Datei unten hinzu


1
Willkommen bei Stack Overflow. Könnten Sie bitte erläutern, wie Ihr Code funktioniert und wie er bei der Lösung der OP-Frage hilft? Bitte
Tom M
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.