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

Tout d’abord ce n’est pas un doublon comme dans Comment changer la couleur de fond de la barre d’état android

Comment puis-je changer la couleur de la barre d’état qui devrait être la même que dans la barre de navigation.

Je souhaite que la couleur de la barre d’état soit identique à celle de la barre de navigation

entrer la description de l'image ici

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

Ceci est pris en charge sur les périphériques pré-lollipop grâce à la bibliothèque support-v7-appcompat à partir de la version 21. Blogpost sur le support appcompat v21 de Chris Banes

entrer la description de l'image ici

En savoir plus sur le thème matériel sur le site officiel des développeurs Android

Mettre à jour:

Sucette:

 public abstract void setStatusBarColor (int color) 

Ajouté au niveau 21 de l’API

Android Lollipop a permis de changer la couleur de la barre d’état de votre application pour une expérience utilisateur plus immersive et conforme aux Material Design Guidelines de Google.

Voici comment vous pouvez modifier la couleur de la barre d’état à l’aide de la nouvelle méthode window.setStatusBarColor introduite au API level 21 .

La modification de la couleur de la barre d’état nécessite également de définir deux indicateurs supplémentaires sur la fenêtre. vous devez append 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 officielle du développeur: setStatusBarColor (int)

Exemple: design matériel partout

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

entrer la description de l'image ici

Le nom de transitionName pour l’arrière-plan de la vue sera android:status:background .

Place this est vos valeurs-v21 / styles.xml, pour activer ceci sur Lollipop:

     

C’est un moyen très simple de le faire sans aucune bibliothèque: si la version du système d’exploitation n’est pas prise en charge – sous kitkat – alors rien ne se passe. Je fais ceci étapes:

  1. dans mon xml j’ai ajouté au dessus cette vue:
  

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. Bar et hauteur de la barre d’état:

 public int getActionBarHeight() { int actionBarHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAtsortingbute(android.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMesortingcs()); } 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)); 

Eh bien, la solution Izhar était correcte 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 append une telle ligne de code dans toutes les activités:

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

Donc, j’ai pris la solution Izhar et utilisé XML pour obtenir le même résultat: Créer une mise en page pour StatusBar status_bar.xml

  

Notez les atsortingbuts height et elevation, ceux-ci seront définis dans des valeurs, values-v19, values-v21 plus bas.

Ajoutez cette disposition à votre disposition d’activités en utilisant include, main_activity.xml:

    //The rest of your layout  

Pour la barre d’outils, ajoutez l’atsortingbut de marge supérieure:

  

Dans votre appTheme style-v19.xml et styles-v21.xml, ajoutez la fenêtreTranslucent attr:

styles-v19.xml, v21:

  true  

Et enfin, sur vos dimens, dimens-v19, dimens-v21, ajoutez les valeurs de la barre d’outils topMargin et la hauteur de statusBarHeight: dimens.xml pour moins que KitKat:

  4dp 0dp 0dp  

La hauteur de la barre d’état est toujours 24dp dimens-v19.xml pour KitKat et au-dessus:

  24dp 24dp  

dimens-v21.xml pour Lolipop, ajoutez simplement l’élévation si nécessaire:

  4dp  

C’est le résultat pour Jellybean KitKat et Lollipop:

entrer la description de l'image ici

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:

  

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

       

Voici à quoi ressemblent vos res / values ​​/ colors.xml :

   #3F51B5 #303F9F #c6d6f0 #757575  

J’avais cette exigence: changer par programmation la couleur de la barre d’état en la maintenant transparente , pour permettre au tiroir de navigation de se dessiner en superposition avec 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 dans la stack tout dépassement avant cette ligne de code, définissez la transparence de la barre d’état sur

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

Je suis capable de gérer les couleurs et la transparence de la barre d’état comme ceci:

  • Android 4: il n’y a pas grand chose à faire, car vous ne pouvez pas gérer les couleurs de la barre d’état à partir de l’API … La seule chose que vous pouvez faire est de définir la barre d’état comme translucide et déplacer un élément coloré de votre interface bar. Pour ce faire, vous devez jouer avec

     android:fitsSystemWindows="false" 

    dans votre mise en page principale. Cela vous permet de dessiner la mise en page sous la barre d’état. Ensuite, vous devez jouer avec un peu de remplissage avec le haut de votre mise en page principale.

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

     true @android:color/transparent 

    Cela permet au tiroir de navigation de chevaucher la barre d’état.

    Ensuite, pour changer la couleur en gardant 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ù tiroirLayout est défini comme ceci

      

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

 @color/black 

Mais ajoutez des tools:targetApi="lollipop" si vous voulez single styles.xml, comme:

 @color/black 

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

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

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

D’abord, appelez la méthode setStatusBarColored dans la méthode onCreate d’Activity (je l’ai mise 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: avant

Après: après

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

La barre d’état ressemblera alors à ceci.

barre d'état

Une solution de plus:

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