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


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


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


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


17

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

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

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

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


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>


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>

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


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.


5

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

Cela fonctionne pour moi.


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

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 .


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>

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

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.


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.


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


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);
        }

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?


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)


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!


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


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.


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

Ajoutez cette ligne 2 dans le fichier java ci-dessous


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.