web-dev-qa-db-fra.com

Comment changer la couleur de la barre d'état dans Android

Tout d'abord, il ne s'agit pas d'un doublon comme dans Comment changer la couleur de fond de la barre d'état Android

Comment changer la couleur de la barre d'état qui devrait être identique à celle de la barre de navigation.

Je veux que la couleur de la barre d'état soit identique à celle de la barre de navigation

enter image description here

305
codercat

Mettre à jour:

Sucette:

public abstract void setStatusBarColor (int color)

Ajouté dans le niveau 21 de l'API

Android Lollipop offre la possibilité de changer la couleur de la barre d'état de votre application pour une expérience utilisateur plus immersive et en phase avec le Material Design Guidelines de Google. 

Voici comment modifier la couleur de la barre d'état à l'aide de la nouvelle méthode window.setStatusBarColor introduite dans API level 21

Pour modifier la couleur de la barre d'état, vous devez également définir deux indicateurs supplémentaires dans la fenêtre. vous devez ajouter l'indicateur FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS et effacer l'indicateur FLAG_TRANSLUCENT_STATUS.

Code de travail:

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Référence développeur officielle: setStatusBarColor (int)

Exemple: conception-matière-partout

Chris Banes Blog- appcompat v21: conception matérielle pour les appareils pré-Lollipop!

enter image description here

La transitionName pour l'arrière-plan de la vue sera Android:status:background.

295
codercat

Android 5.0 Lollipop a introduit le thème Material Design qui colorie automatiquement la barre d'état en fonction de la valeur colorPrimaryDark du thème. 

Ceci est supporté sur les appareils pré-Lollipop grâce à la bibliothèque support-v7-appcompat à partir de la version 21. Blogpost à propos du support appcompat v21 de Chris Banes

enter image description here

En savoir plus sur le thème Matériau sur le site officiel des développeurs Android

485
Giorgio

Placez ceci est votre values-v21/styles.xml, pour l'activer sur Lollipop:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="Android:statusBarColor">@color/color_primary</item>
    </style>
</resources>
172
Niels

c'est un moyen très simple de faire cela sans bibliothèque: si la version du système d'exploitation n'est pas prise en charge - sous KitKat -, il ne se passe donc rien . Je fais ceci comme suit:

  1. dans mon xml j'ai ajouté au dessus cette vue:
<View
        Android:id="@+id/statusBarBackground"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

alors j'ai fait cette méthode:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

vous avez également besoin de ces deux méthodes pour obtenir une action. Hauteur de la barre et de la barre d'état:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

alors la seule chose dont vous avez besoin est cette ligne pour définir la couleur de la barre d'état:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(Android.R.color.white));
47
itzhar

Eh bien, la solution Izhar était OK mais, Personnellement, j'essaie d'éviter le code qui ressemble à ceci:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
//Do what you need for this SDK
};

De plus, je n'aime pas non plus dupliquer le code. Dans votre réponse, je dois ajouter cette ligne de code à toutes les activités:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(Android.R.color.white));

J'ai donc pris la solution Izhar et utilisé XML pour obtenir le même résultat: Créer une présentation pour StatusBar status_bar.xml

<View xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:layout_width="match_parent"
     Android:layout_height="@dimen/statusBarHeight"
     Android:background="@color/primaryColorDark"
     Android:elevation="@dimen/statusBarElevation">

Remarquez les attributs de hauteur et d'élévation, ceux-ci seront définis dans valeurs, valeurs-v19, valeurs-v21 plus bas.

Ajoutez cette mise en page à la mise en page de vos activités en utilisant include, main_activity.xml:

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

<include layout="@layout/status_bar"/>
<include Android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

Pour la barre d'outils, ajoutez l'attribut de marge supérieure:

<Android.support.v7.widget.Toolbar 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="?android:attr/actionBarSize"
Android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
Android:elevation="@dimen/toolbarElevation"
Android:layout_marginTop="@dimen/appBarTopMargin"
Android:textDirection="ltr"
Android:layoutDirection="ltr">

Dans vos styles appTheme style-v19.xml et styles-v21.xml, ajoutez le paramètre windowTranslucent:

styles-v19.xml, v21:

<resources>
<item name="Android:windowTranslucentStatus">true</item>
</resources>

Et enfin, sur vos dimensions, dimens-v19, dimens-v21, ajoutez les valeurs de la barre supérieure de barre d’outils et la hauteur de statusBarHeight:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

La hauteur de la barre d'état est toujours de 24dp Dimens-v19.xml pour KitKat et les versions supérieures:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

dimens-v21.xml pour Lolipop, il suffit d’ajouter l’élévation si nécessaire:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

Voici le résultat pour Jellybean KitKat et Lollipop:

enter image description here

29
Moti Bartov

Créez simplement un nouveau thème dans res/values ​​/ styles.xml où vous modifiez le "colorPrimaryDark" qui est la couleur de la barre d'état:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

Et modifiez le thème d'activité dans AndroidManifest.xml en celui que vous souhaitez. Lors de l'activité suivante, vous pouvez rétablir la couleur d'origine en sélectionnant le thème d'origine:

<activity
    Android:name=".LoginActivity"
    Android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />

        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Voici comment votre res/values ​​/ colors.xml devrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>
17
lcompare

Comme @Niels a dit que vous devez placer dans values-v21/styles.xml:

<item name="Android:statusBarColor">@color/black</item>

Mais ajoutez tools:targetApi="Lollipop" si vous voulez un seul style.xml, comme:

<item name="Android:statusBarColor" tools:targetApi="Lollipop">@color/black</item>
15
Faisal Shaikh

J'avais cette exigence: Modification par programme de la couleur de la barre d'état en la maintenant transparente , pour permettre au tiroir de navigation de se dessiner lui-même en chevauchant la barre d'état transparente.

Je ne peux pas faire cela en utilisant l'API

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

Si vous cochez ici en cas de dépassement de pile, tout le monde avant cette ligne de code définit la transparence de la barre d'état sur Solid avec

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

Je suis capable de gérer couleur et transparence de barre d'état comme ceci:

  • Android 4: vous ne pouvez pas faire grand chose, car vous ne pouvez pas gérer la couleur de la barre d'état à partir de l'API ... La seule chose à faire est de définir la barre d'état sur translucide et de déplacer un élément coloré de votre interface utilisateur sous l'état bar. Pour ce faire, vous devez jouer avec

    Android:fitsSystemWindows="false"
    

    dans votre mise en page principale. Cela vous permet de dessiner votre mise en page sous la barre d'état. Ensuite, vous devez jouer avec du rembourrage en haut de votre mise en page principale.

  • Android 5 et supérieur: vous devez définir un style avec

    <item name="Android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="Android:statusBarColor">@Android:color/transparent</item>
    

    cela permet au tiroir de navigation de chevaucher la barre d'état.

    Ensuite, pour changer la couleur en maintenant la barre d'état transparente, vous devez définir la couleur de la barre d'état avec

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))
    

    où drawLayout est défini comme ceci

    <Android.support.v4.widget.DrawerLayout
        Android:id="@+id/drawer_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true">
    
12
DSoldo

Vous pouvez changer la couleur de la barre d'état avec cette fonction. fonctionne sur Android L signifie API 21 et supérieur et nécessite une chaîne de couleur telle que "#ffffff".

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}
11
sajad abbasi

Si vous voulez travailler sur Android 4.4 et supérieur, essayez ceci. Je me réfère à la réponse de Harpreet et à ce lien. Android et la barre d'état transparente

Commencez par appeler la méthode setStatusBarColored dans la méthode onCreate de Activity (je le mets dans une classe util). J'utilise une image ici, vous pouvez la changer pour utiliser une couleur.

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

Avant:  before

Après:  after

La couleur de la barre d'état a été modifiée, mais la barre de navigation est coupée. Nous devons donc définir la marge ou le décalage de la barre de navigation dans la méthode onCreate.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

Ensuite, la barre d'état ressemblera à ceci.

 status bar

5
Allan

C'est ce qui a fonctionné pour moi dans KitKat et avec de bons résultats.

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }
4
Harpreet

Modifiez colorPrimary dans le fichier colors.xml dans Values ​​de la couleur souhaitée pour la barre d'état. Par exemple:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>

3
PhilipS

Une autre solution:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);
2
Vova K.

Vous pouvez utiliser ce code simple:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}
1
steve moretz

modifiez le colorPrimaryDark de la couleur de votre choix dans le fichier res/values ​​/ styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
0

Pour changer la couleur de lolipop ci-dessus, ajoutez simplement ceci à votre styles.xml

<item name="Android:statusBarColor">@color/statusBarColor</item>

mais rappelez-vous, si vous voulez avoir une couleur claire pour la barre d'état, ajoutez également cette ligne

<item name="Android:windowLightStatusBar">true</item>
0
Amin Keshavarzian