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
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!
La transitionName
pour l'arrière-plan de la vue sera Android:status:background
.
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
En savoir plus sur le thème Matériau sur le site officiel des développeurs Android
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>
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:
<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));
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:
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>
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>
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">
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));
}
}
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;
}
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.
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));
}
}
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>
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);
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));
}
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>
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>