La barre d'état devient blanche et n'affiche pas le contenu derrière elle

96

J'essaye AppCompat sur Marshmallow. Et je veux avoir une barre d'état transparente mais elle devient blanche. J'ai essayé quelques solutions mais elles n'ont pas fonctionné pour moi (la barre d'état transparente ne fonctionne pas avec windowTranslucentNavigation = "false" , Lollipop: dessiner derrière statusBar avec sa couleur définie sur transparent ). Voici le code associé.

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

Activité

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

entrez la description de l'image ici

pt2121
la source
Êtes-vous en mesure de résoudre ce problème? J'ai le même problème. Dans l'une de mes activités ayant une barre d'état blanche
kirtan403
1
@ kirtan403 J'ai résolu mon problème en changeant la disposition de mon activité de FrameLayout à RelativeLayout. S'il vous plaît voir ma réponse.
pt2121
Le mien est relatif, mais ne reçoit que la barre d'état blanche. J'ai posté la question ici: stackoverflow.com/q/33890066/1820644
kirtan403
Après avoir lutté pendant une journée, j'ai trouvé la solution qui fonctionnait pour moi. Voici la réponse: stackoverflow.com/a/33892569/1820644
kirtan403
J'ai changé le statut d'Android: windowTranslucentStatus en faux et son fonctionnement
Kiran Benny Joseph

Réponses:

167

J'ai trouvé la réponse dans ce lien: La couleur de la barre d'état ne change pas avec la disposition relative comme élément racine

Il s'avère donc que nous devons supprimer le

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

dans styles.xml (v21). Et cela fonctionne très bien pour moi.

Phoenix Wang
la source
Oui, c'est la solution. Parce que android: fitsSystemWindows causera des problèmes lors du défilement de la barre d'onglets. Vous avez trouvé la même réponse, mais vous l'avez postée plus tôt. Mentionnez également que c'est écrasé par défaut, je pense.
jobbert
Cela devrait être marqué comme la solution acceptée. Ce problème rampait partout dans mon application, cette solution l'a résolu partout en commentant cette seule ligne. M'a sauvé un tel mal de tête!
BMB
J'utilise CoordinatorLayout, donc l'autre réponse à nous CoordinatorLayout en tant que racine ne fonctionne pas pour moi (l'utilisation de fitSystemWindows = true comme suggéré ne fonctionnait pas non plus). Cette réponse fonctionne pour moi.
Bruce
Et si j'exige que la couleur de ma barre d'état soit transparente?
nullmn
1
@nullmn alors vous devez changer votre arrière-plan d'activité en autre chose.
Phoenix Wang
96

(Un peu tard à la fête mais ça pourrait aider quelqu'un)

J'ai eu exactement le même problème. D'une manière ou d'une autre, certaines activités étaient normales tandis que les nouvelles que j'ai créées affichaient une barre d'état blanche au lieu de la colorPrimaryDarkvaleur.

Après avoir essayé plusieurs astuces, j'ai remarqué que les activités de travail normal utilisaient toutes CoordinatorLayoutcomme racine de la mise en page, tandis que pour les autres, je l'avais remplacée par des mises en page régulières car je n'avais pas besoin des fonctionnalités (animation, etc.) fournies par CoordinatorLayout.

La solution consiste donc à créer CoordinatorLayoutla disposition racine, puis à y ajouter votre ancienne racine de disposition. Voici un exemple:

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

VEUILLEZ NOTER que sans android:fitsSystemWindows="true"cette solution ne fonctionne pas pour moi.

Testé sur sucette et guimauve

Mauro Banze
la source
3
La solution a fonctionné pour moi aussi. Mais .. pourquoi cela arrive-t-il? La bonne couleur de StatusBar est affichée lorsque la racine est DrawerLayout ou CoordinatorLayout
user3316561
3
Cela n'a fonctionné que pour moi lors de l'ajout android:fitsSystemWindows="true"à CoordinatorLayoutAndroid 8.
Franco
2
@Franco Je pense que c'est la partie la plus pertinente de la solution. Je dis cela parce que j'ai eu CoordinatorLayoutquand j'ai rencontré le même problème et que la propriété spécifique qui a résolu cela pour moi étaitandroid:fitsSystemWindows="true"
Wilhelm
Le android:fitsSystemWindows="true"n'a pas fonctionné pour moi. Ce qui a résolu mon problème est d'utiliser un thème qui n'est pas AppTheme.NoActionBarsur l'activité avec un CoordinatorLayout. Je ne sais pas pourquoi cela a résolu le problème.
bmdelacruz
CoordinatorLayoutou android:fitsSystemWindows="true"ni l'un ni l' autre ne fonctionne pour moi.
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

Remplacez simplement ceci, statusBarColor doit être votre couleur attendue et non TRANSPARENTE

Shrini Jaiswal
la source
17

Vous devez ajouter cette propriété à votre style pour voir le contenu

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
Andres Paez
la source
Cela a fonctionné pour moi. Cela devrait être une réponse acceptée.
abdul rehman le
11

Ajoutez ceci dans votre style.xml

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

et ceci dans votre onCreate ();

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Michèle Lacorte
la source
1
Merci mais cela ne fonctionne pas. La barre d'état a la même apparence.
pt2121
s'il vous plaît aidez pour ce problème ... même problème ici .... aucune des solutions jusqu'à présent ne fonctionne
Saeed Jassani
@SaeedJassani J'ai trouvé une solution qui a fonctionné pour moi. Si vous avez le même problème, jetez un œil à ma question et réponse: stackoverflow.com/a/33892569/1820644
kirtan403
9

Après avoir essayé sans succès tout ce qui précède, j'ai trouvé que la définition explicite du thème résolvait le problème.

setTheme(R.style.AppTheme);

Cela doit précéder le super.OnCreate () dans votre activité.

James Britton
la source
1
Je peux confirmer que cela corrige l'activité errante sur Marshmallow
dare0021
je t'aime mec, a fonctionné comme un charme, même si je ne sais toujours pas pourquoi: @
Adeel Ahmad
avant le super.OnCreate () est la clé
Karthik Rk
9

Mettez simplement cet élément dans votre v21 \ styles.xml:

vrai

Ça devrait ressembler à ça :

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

Rami
la source
1
Cela a fonctionné pour moi en utilisant les falsevaleurs des 2 derniers éléments. Bizarre, mais merci.
JCarlosR
Cela ne fonctionne qu'avec les deux dernières lignes, mais le contenu va derrière la barre d'état, le remplissage / marge ou correspond àSystemWindows n'aide pas. Testé sur OP 5 running nougat
Anton Makov
9

J'ai fait face au même problème. Ce que j'ai fait, c'est que dans le fichier "v21 / styles.xml" a changé la valeur true:

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

à:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
Dégomos
la source
7
<item name="android:statusBarColor">@android:color/transparent</item>

Vous verrez cette ligne de code dans values ​​/ styles / styles.xml (v21). Retirez-le et cela résout le problème

Lien vers cette réponse

Phares
la source
5

J'ai résolu mon problème en modifiant la disposition de mon activité de FrameLayout en RelativeLayout. Merci à tous ceux qui ont essayé de vous aider!

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

Essayez le visualiseur de hiérarchie ou ViewInspector . Ces outils peuvent vous aider.

pt2121
la source
5

Supprimez simplement la balise suivante du style v21 @android: couleur / transparent

Cela fonctionne pour moi.

Shendre Kiran
la source
@android: couleur / transparent n'est pas une "balise". Cela peut être la valeur d'un attribut de style, mais ce n'est pas une "balise". Que faire si l'OP a cette valeur définie plus d'une fois? Lequel doit-il supprimer? Votre réponse est beaucoup trop générique.
protectedmember
ouais, c'était le cas pour moi aussi .. merci, Shendre! :) et pour votre commentaire, @protectedmember - l'OS n'a pas de sexe.
zeroDivider
3

Meilleure approche

Vérifiez votre fichier style.xml où se trouve votre thème NoActionBar. Assurez-vous que son parent est Theme.AppCompat.NoActionBar et personnalisez-le également en ajoutant votre jeu de couleurs. Enfin, définissez vos thèmes dans le manifeste selon vos besoins.

Voici un exemple de mon fichier 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>
Nilesh Mahant
la source
2

Pour moi, cela a fonctionné en procédant comme suit:

  1. Définissez le thème .NoActionBar
  2. Enveloppez la barre d'outils dans android.support.design.widget.AppBarLayout
  3. Faites android.support.design.widget.CoordinatorLayoutcomme mise en page parent.

C'est essentiellement la troisième étape qui dessine la barre d'état dans le colorPrimaryDarkcas contraire, elle n'est pas dessinée si vous utilisez le NoActionBarthème. La deuxième étape donnera à votre barre d'outils cette superposition .

Priyankvex
la source
2

Pour les styles v23

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

Pour les styles v21

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

[Production]

Développez le répertoire res -> values ​​-> styles à partir du panneau Projet.

Ouvrez styles.xml (v21)

UTILISEZ N'IMPORTE QUELLE MANIÈRE CI-DESSOUS

  1. Remplacez true par false dans la android:windowDrawsSystemBarBackgroundspropriété.
  2. Remplacez @android: color / transparent par @ color / colorPrimaryDark dans la android:statusBarColorpropriété.
  3. Retirez la android:statusBarColorligne de propriété.
Ketan Ramani
la source
2

Si votre v21 / styles.xml contient

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

Ensuite, supprimez ou commentez sous la ligne ou changez la couleur de la barre d'état,

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

Son fonctionne bien. J'espère que c'est utile. Merci.

sahu
la source
2

J'ai trouvé une solution pour cela -

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

ajoutez ceci à votre style et cela fonctionnera pour l'api 21 ou supérieur.

être_sohelkhan
la source
1

Je ne sais pas s'il est tard mais j'espère que cela aide quelqu'un. * Créez une fausse vue avec un arrière-plan transparent qui correspond à la mise en page et créez une mise en page de coordination en tant qu'élément de mise en page racine.

<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

vahidlazio
la source
1

Cela a du travail pour moi

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);
        }
Valdemir Nunes de Freitas
la source
1
Bonjour, bienvenue sur StackOverflow! Pourriez-vous modifier votre réponse pour expliquer pourquoi cette réponse fonctionne? De courtes explications de votre code vont très loin!
Gigazelle le
0

Je suppose que cela est causé par votre android:windowBackground. Une @color/background_material_lightréférence au blanc?

hanspeide
la source
Nan. Ce n'est certainement pas blanc mais merci quand même! (Vous pouvez voir les icônes blanches dessus.)
pt2121
J'ai mal lu votre question. Essayez de remplacer <item name="android:statusBarColor">@android:color/transparent</item>par <item name="android:statusBarColor">@null</item>.
hanspeide
Pour être sûr de bien vous comprendre, voulez-vous que l’image soit affichée derrière la barre d’état?
hanspeide
0

Vérifiez que cette barre d'outils devient blanche - AppBar n'est pas dessinée après avoir été défilée hors de l'écran

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

J'utilise les bibliothèques 23.0.0. et le bogue persiste.

La solution de contournement consiste à ajouter une vue qui ne prend presque pas d'espace et peut être invisible. Voir la structure ci-dessous.

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

Ces questions sur Stackoverflow.com font également référence à ce bogue: la barre d'outils CoordinatorLayout invisible à l'entrée jusqu'à pleine hauteur AppBarLayout - Disposition parfois invisible une fois qu'elle entre dans la vue (même si elle n'est pas entrée)

clickdroid
la source
ce n'est pas le même bug. dans mon cas, il est blanc juste après que l'activité s'affiche et non après avoir été défilée hors de l'écran. merci quand même
pt2121
0

Si vous utilisez RelativeLayout / CoordinatorLayout, c'est la solution qui a fonctionné pour moi:

Vous devez utiliser

  • CoordinateurMise en page
  • AppBarLayout

N'oubliez pas d'utiliser CoordinatorLayout au lieu de RelativeLayout (les performances sont meilleures et fonctionnent parfaitement avec AppBarLayout)

Voici comment votre fragment doit commencer

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

Bon codage!

Faustino Gagneten
la source
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>

ajouter l'élément 'windowTranslucentStatus' dans les styles

Sanjay
la source
0

Ajoutez ceci dans votre style.xml

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

Remarque: la coloration de la barre d'état n'est pas prise en charge en dessous du niveau d'API 21.

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

Ajoutez cette ligne 2 dans le fichier java ci-dessous

nitin kapsikar
la source
1
Bienvenue dans Stack Overflow. Pourriez-vous s'il vous plaît expliquer comment fonctionne votre morceau de code et comment il aide à résoudre la question des OP? Veuillez vous référer à la façon d'écrire une bonne réponse pour améliorer votre réponse
Tom M