La barra di stato diventa bianca e non mostra il contenuto dietro di essa


96

Sto provando AppCompat su Marshmallow. E voglio avere una barra di stato trasparente anche se diventa bianca. Ho provato un paio di soluzioni ma non hanno funzionato per me ( barra di stato trasparente non funziona con windowTranslucentNavigation = "false" , Lollipop: disegnare dietro statusBar con il suo colore impostato su trasparente ). Ecco il codice correlato.

Il mio 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>

Attività

<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>

Frammento

<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>

inserisci qui la descrizione dell'immagine


Sei in grado di risolvere questo problema? Sto avendo lo stesso problema. In una delle mie attività con barra di stato bianca
kirtan403

1
@ kirtan403 Ho risolto il problema modificando il layout delle attività da FrameLayout a RelativeLayout. Si prega di vedere la mia risposta.
pt2121

Il mio è relativo solo ottenendo ancora la barra di stato bianca. Ho inviato domanda qui: stackoverflow.com/q/33890066/1820644
kirtan403

Dopo aver lottato per un giorno ho trovato la soluzione che ha funzionato per me. Ecco la risposta: stackoverflow.com/a/33892569/1820644
kirtan403

Ho cambiato lo stato di android: windowTranslucentStatus su false e funziona
Kiran Benny Joseph,

Risposte:


167

Ho trovato la risposta in questo link: Il colore della barra di stato non cambia con il layout relativo come elemento principale

Quindi risulta che dobbiamo rimuovere il file

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

in styles.xml (v21). E funziona bene per me.


Sì, questa è la soluzione. Perché android: fitsSystemWindows causerà problemi quando si rende scorrevole la barra delle schede. Ho trovato la stessa risposta ma l'hai postata prima. Menziona anche che questo è il valore predefinito sovrascritto credo.
jobbert

Questo dovrebbe essere contrassegnato come la soluzione accettata. Questo problema si stava insinuando in tutta la mia app, questa soluzione lo ha risolto ovunque semplicemente commentando quella singola riga. Mi ha risparmiato un tale mal di testa!
BMB

Sto usando CoordinatorLayout, quindi l'altra risposta a noi CoordinatorLayout come root non funziona per me (l'uso di fitsSystemWindows = true come suggerito non ha funzionato neanche). Questa risposta funziona per me.
Bruce

E se richiedo che il colore della mia barra di stato sia trasparente?
nullmn

1
@nullmn, devi cambiare lo sfondo dell'attività con qualcos'altro.
Phoenix Wang

96

(Un po 'tardi per la festa ma potrebbe aiutare qualcuno)

Ho avuto lo stesso identico problema. In qualche modo, alcune attività erano normali mentre quelle nuove che creavo mostravano la barra di stato bianca invece del colorPrimaryDarkvalore.

Dopo aver provato diversi suggerimenti, ho notato che le normali attività lavorative erano tutte utilizzate CoordinatorLayoutcome root del layout, mentre per gli altri l'avevo sostituita con layout regolari perché non avevo bisogno delle funzionalità (animazione, ecc.) Fornite da CoordinatorLayout.

Quindi la soluzione è creare CoordinatorLayoutil layout di root, quindi al suo interno aggiungere la tua precedente root di layout. Ecco un esempio:

<?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>

NOTA BENE che senza android:fitsSystemWindows="true"questa soluzione non funziona per me.

Testato su Lollipop e Marshmallow


3
La soluzione ha funzionato anche per me. Ma .. perché succede? Il colore corretto della StatusBar viene visualizzato quando la radice è DrawerLayout o CoordinatorLayout
user3316561

3
Questo ha funzionato solo per me quando si aggiunge android:fitsSystemWindows="true"a CoordinatorLayoutAndroid 8.
Franco

2
@Franco Penso che questa sia la parte più rilevante della soluzione. Dico questo perché ho avuto CoordinatorLayoutquando ho riscontrato lo stesso problema e la proprietà specifica che lo ha risolto per me eraandroid:fitsSystemWindows="true"
Wilhelm

Il android:fitsSystemWindows="true"non ha funzionato per me. Ciò che ha risolto il mio problema è stato utilizzare un tema non AppTheme.NoActionBarpresente nell'attività con un file CoordinatorLayout. Non so perché sia ​​stato risolto.
bmdelacruz

CoordinatorLayouto android:fitsSystemWindows="true"nessuno dei due funziona per me.
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

Sostituisci semplicemente questo, statusBarColor dovrebbe essere il tuo colore previsto e non TRASPARENTE


17

Devi aggiungere questa proprietà al tuo stile per vedere il contenuto

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

Questo ha funzionato per me. Questa dovrebbe essere una risposta accettata.
abdul rehman il

11

Aggiungilo nel tuo style.xml

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

e questo nel tuo onCreate ();

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

1
Grazie ma non funziona. La barra di stato ha lo stesso aspetto.
pt2121

per favore
aiutatemi

@SaeedJassani ho trovato una soluzione che ha funzionato per me. Se hai lo stesso problema, dai un'occhiata alla mia domanda e risposta:
stackoverflow.com/a/33892569/1820644

9

Dopo aver provato senza successo tutto quanto sopra, ho scoperto che l'impostazione esplicita del tema ha risolto il problema.

setTheme(R.style.AppTheme);

Deve essere preceduto da super.OnCreate () nella tua attività.


1
Posso confermare che questo risolve l'attività errante su Marshmallow
dare0021

ti amo amico, ha funzionato a meraviglia, anche se non ho ancora idea del perché: @
Adeel Ahmad

prima del super.OnCreate () è la chiave
Karthik Rk

9

Metti semplicemente questo elemento nella tua v21 \ styles.xml:

vero

Dovrebbe sembrare come questo :

<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
Ha funzionato per me utilizzando i falsevalori negli ultimi 2 elementi. Strano, ma grazie.
JCarlosR

Funziona solo con le ultime due righe, ma il contenuto va dietro la barra di stato, padding / margin o fitsSystemWindows non aiuta. Testato su OP 5 torrone da corsa
Anton Makov

9

Ho affrontato lo stesso problema. Quello che ho fatto è stato, nel file "v21 / styles.xml", ho modificato il valore true:

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

per:

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

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

Vedrai quella riga di codice in values ​​/ styles / styles.xml (v21). Rimuovilo e questo risolverà il problema

Link a questa risposta


5

Ho risolto il problema modificando il layout delle attività da FrameLayout a RelativeLayout. Grazie a tutti coloro che hanno cercato di aiutare!

<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>

Prova hierarchy-viewer o ViewInspector . Questi strumenti potrebbero aiutarti.


5

Basta rimuovere il seguente tag dallo stile v21 @android: color / transparent

Questo funziona per me.


@android: color / transparent non è un "tag". Può essere il valore di un attributo di stile, ma non è un "tag". Cosa succede se l'OP ha questo valore definito più di una volta? Quale dovrebbe rimuovere? La tua risposta è troppo generica.
protectedmember

sì, è stato così anche per me .. grazie, Shendre! :) e per il tuo commento, @protectedmember - il sistema operativo non ha sesso.
zeroDivider

3

Approccio migliore

Controlla il tuo file style.xml dove si trova il tuo tema NoActionBar. Assicurati che abbia il genitore come Theme.AppCompat.NoActionBar e personalizzalo anche aggiungendo la tua combinazione di colori. Infine imposta i tuoi temi in manifest come richiesto.

Di seguito è riportato un esempio del mio file 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

Per me ha funzionato facendo quanto segue:

  1. Imposta il tema .NoActionBar
  2. Avvolgi la barra degli strumenti android.support.design.widget.AppBarLayout
  3. Crea android.support.design.widget.CoordinatorLayoutcome layout genitore.

Essenzialmente è il terzo passaggio che disegna la barra di stato nel colorPrimaryDarkaltrimenti non viene disegnata se usi il NoActionBartema. Il secondo passaggio darà alla barra degli strumenti quella sovrapposizione .


2

Per gli stili v23

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

Per gli stili 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

[Produzione]

Espandi res -> values ​​-> styles directory dal pannello del progetto.

Apri styles.xml (v21)

UTILIZZA QUALUNQUE TRA I MODI SOTTO

  1. Cambia true in false nella android:windowDrawsSystemBarBackgroundsproprietà.
  2. Cambia @android: color / transparent in @ color / colorPrimaryDark nella android:statusBarColorproprietà.
  3. Rimuovere la android:statusBarColorlinea corretta.

2

Se il tuo v21 / styles.xml contiene

<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>

Quindi, rimuovi o commenta sotto la riga o cambia il colore della barra di stato,

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

Funziona bene. Spero che questo sia utile. Grazie.


2

Ho trovato una soluzione per questo -

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

aggiungilo al tuo stile e funzionerà per api 21 o superiore.


1

Non sono sicuro che sia tardi ma spero che aiuti qualcuno. * Crea una vista falsa con sfondo trasparente che si adatti al layout e crea un layout coordinatore come elemento del layout principale.

<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

Questo ha funzionato per me

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
Salve, benvenuto in StackOverflow! Potresti modificare la tua risposta per approfondire il motivo per cui funziona? Brevi spiegazioni del tuo codice fanno molto!
Gigazelle

0

La mia ipotesi è che questo sia causato dal tuo android:windowBackground. È @color/background_material_lightun riferimento al bianco?


No. Non è sicuramente bianco, ma grazie comunque! (Puoi vedere le icone bianche su di esso.)
pt2121

Ho letto male la tua domanda. Prova a sostituire <item name="android:statusBarColor">@android:color/transparent</item>con <item name="android:statusBarColor">@null</item>.
hanspeide

Solo per assicurarti di averti capito correttamente, vuoi che l'immagine venga mostrata dietro la barra di stato?
hanspeide

0

Verifica che questa barra degli strumenti diventi bianca - AppBar non viene disegnata dopo essere stata fatta scorrere fuori dallo schermo

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

Sto usando le librerie 23.0.0. e il bug si verifica ancora.

La soluzione alternativa è l'aggiunta di una vista che non occupa quasi spazio e può essere invisibile. Vedi la struttura sotto.

<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>

Queste domande su Stackoverflow.com si riferiscono anche a questo bug: CoordinatorLayout Toolbar invisibile in entrata fino a piena altezza AppBarLayout - Layout a volte invisibile una volta entrato in visualizzazione (anche se non è stato inserito)


non è lo stesso bug. nel mio caso, è bianco subito dopo la visualizzazione dell'attività non dopo essere stato fatto scorrere fuori dallo schermo. grazie comunque
pt2121

0

Se stai usando RelativeLayout / CoordinatorLayout questa è la soluzione che ha funzionato per me:

Devi usare

  • CoordinatorLayout
  • AppBarLayout

Ricorda di usare CoordinatorLayout invece di RelativeLayout (la performance è migliore e funziona perfettamente con AppBarLayout)

Ecco come dovrebbe iniziare il tuo frammento

<?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"
    >
    ...

Buona codifica!


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>

aggiungi l'elemento "windowTranslucentStatus" negli stili


0

Aggiungilo nel tuo style.xml

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

Nota: la colorazione della barra di stato non è supportata al di sotto del livello API 21.


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

Aggiungi questa 2 riga nel file java di seguito


1
Benvenuto in Stack Overflow. Potresti per favore spiegare come funziona il tuo pezzo di codice e come aiuta a risolvere la domanda OP? Si prega di fare riferimento a come scrivere una buona risposta per migliorare la tua risposta
Tom M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.