Changer la couleur de la barre d'état avec AppCompat ActionBarActivity

146

Dans l'une de mes activités, j'ai changé la couleur de la barre d'outils en utilisant Palette. Mais sur les appareils 5.0, ActionBarActivityla status barcouleur est la couleur de mon colorPrimaryDarkthème d'activité, j'ai donc 2 couleurs très différentes et cela n'a pas l'air bien.

Je me rends compte que dans la version 5.0, vous pouvez utiliser Window.setStatusBarColor()mais ActionBarActivityne l'a pas.

ma question est donc en 5.0 comment puis-je changer la couleur de la barre d'état avec ActionBarActivity?

tyczj
la source
Avez-vous essayé d'utiliser SystemBarTint lib? github.com/jgilfelt/SystemBarTint
Nikola Despotoski
Copie

Réponses:

420

Je ne suis pas sûr de comprendre le problème.

Si vous souhaitez modifier la couleur de la barre d'état par programme (et à condition que l'appareil dispose d'Android 5.0), vous pouvez utiliser Window.setStatusBarColor(). Cela ne devrait pas faire de différence que l'activité soit dérivée de Activityou ActionBarActivity.

Essayez simplement de faire:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

Je viens de tester cela avec ActionBarActivityet cela fonctionne bien.


Remarque: la définition de l' FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSindicateur par programme n'est pas nécessaire si votre values-v21fichier de styles l'a déjà défini, via:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
matiash
la source
1
ah ok je n'utilisais pasgetWindow()
tyczj
cela planterait lorsque le code LOLLIPOP n'est pas trouvé dans les anciens androïdes. il est préférable d'utiliser> = 21
code511788465541441
12
@ code578841441 En fait, cela ne devrait pas arriver. Les constantes sont insérées lors de la compilation.
matiash
4
@ code578841441: C'est parce que vous compilez avec un ancien SDK. Vous devez toujours vous efforcer de compiler avec le dernier SDK Android, même si vous avez des contraintes de version d'API plus anciennes (c'est minSdkVersion-à- dire et / ou des targetSdkVersionattributs sur l' <uses-sdk ...>élément).
dbm
3
J'ai également dû appeler getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); pour le faire fonctionner
Philipp E.
61

Il existe différentes manières de modifier la couleur de la barre d'état.

1) En utilisant le styles.xml. Vous pouvez utiliser l'attribut android: statusBarColor pour le faire de manière simple mais statique.

Remarque: vous pouvez également utiliser cet attribut avec le thème Matériau.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Vous pouvez le faire dynamiquement en utilisant la méthode setStatusBarColor (int) dans la classe Window. Mais rappelez-vous que cette méthode n'est disponible que pour l'API 21 ou supérieur. Assurez-vous donc de vérifier cela, sinon votre application plantera sûrement dans les appareils inférieurs.

Voici un exemple de travail de cette méthode.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

où primaryDark est la teinte 700 de la couleur primaire que j'utilise dans mon application. Vous pouvez définir cette couleur dans le fichier colors.xml.

Essayez-le et faites-moi savoir si vous avez des questions. J'espère que ça aide.

Aritra Roy
la source
il ressemble à window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); n'est pas nécessaire - mais celui-ci a fonctionné pour moi
bkurzius
Des idées pour lesquelles la version programmatique fonctionnerait mais pas la version de style?
Andrew
Dans mon cas, le style de l'activité avait le flah translucent_status défini, donc sans la commande window.clearFlags cela ne fonctionnait pas. Alors merci pour ça!
BMacedo
Oh wow! Cela devrait être une réponse acceptée, ajoutez clearFlagsrésoudre mon problème
fanjavaid
9

Je ne pense pas que la couleur de la barre d'état ait encore été implémentée dans AppCompat. Voici les attributs disponibles:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(Depuis \ sdk \ extras \ android \ support \ v7 \ appcompat \ res \ values ​​\ attrs.xml )

JstnPwll
la source
1
Il est possible qu'il ne soit jamais implémenté dans AppCompat si les anciennes versions du système d'exploitation ne permettent pas de modifier la barre d'état.
TheIT
2
<attr name = "colorPrimaryDark" format = "color" /> <! - Variante sombre de la couleur de marque principale. Par défaut, il s'agit de la couleur appliquée à la barre d'état (via statusBarColor) et à la barre de navigation (via navigationBarColor). ->
Soheil Setayeshi
3

Essayez ceci, j'ai utilisé ceci et cela fonctionne très bien avec la v21.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>
Manoj Kumar
la source
1

Merci pour les réponses ci-dessus, avec l'aide de celles-ci, après certains travaux de R&D pour l'application xamarin.android MVVMCross, ci-dessous a fonctionné

Indicateur spécifié pour l'activité dans la méthode OnCreate

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

Pour chaque MvxActivity, le thème est mentionné ci-dessous

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

Mon SplashStyle.xml ressemble à ci-dessous

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

Et j'ai V7 appcompact référencé.

Pallavi
la source
1

[Version Kotlin] J'ai créé cette extension qui vérifie également si la couleur souhaitée a suffisamment de contraste pour masquer l'interface utilisateur du système, comme l'icône d'état de la batterie, l'horloge, etc., nous définissons donc l'interface utilisateur du système en blanc ou en noir en fonction de cela.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}
Julián Falcionelli
la source
0

Postuler

    <item name="android:statusBarColor">@color/color_primary_dark</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>

en Theme.AppCompat.Light.DarkActionBarn'a pas fonctionné pour moi. Qu'est-ce que l'astuce est de donner colorPrimaryDarkcomme d'habitude avec android:colorPrimarydans styles.xml

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

et dans le cadre

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

n'a pas eu à définir la couleur de la barre d'état dans le code.

Annu
la source