Couleur des icônes de la barre d'état Android

131

Je me demandais s'il était possible de changer la couleur des icônes de la barre d'état ( pas la couleur de la barre d'état colorPrimaryDark) entrez la description de l'image ici Disons que je veux cette barre d'état avec:
<item name="colorPrimaryDark">@android:color/white</item>

et les icônes en noir, est-ce possible?

Merci.

ÉDITER:

Nouveau dans l'aperçu du développeur M: windowLightStatusBar. Activer ceci dans votre thème indique au système d'utiliser un premier plan sombre, utile pour les barres d'état de couleur plus claire. Notez que l'aperçu M semble avoir un bogue où les icônes de notification restent blanches, tandis que les icônes d'état du système passent correctement en noir semi-transparent.

de: Roman Nurik Google+ post entrez la description de l'image ici

GuilhE
la source

Réponses:

24

Pas depuis Lollipop. À partir d'Android 5.0, les directives disent:

Les icônes de notification doivent être entièrement blanches.

Même s'ils ne le sont pas, le système ne prendra en compte que le canal alpha de votre icône, les rendant blancs

solution de contournement

La seule façon d'avoir une icône colorée sur Lollipop est de réduire votre targetSdkVersionvaleur à des valeurs <21, mais je pense que vous feriez mieux de suivre les directives et d'utiliser uniquement des icônes blanches.

Si vous décidez quand même de vouloir des icônes colorées, vous pouvez utiliser la méthode DrawableCompat.setTint de la nouvelle bibliothèque de support v4.

Kuba Spatny
la source
3
J'ai fait une recherche sur Google et je n'ai pas trouvé de moyen approprié, mais si les directives Android indiquent que les icônes doivent être blanches, elles le sont :) Merci!
GuilhE
11
Il doit y avoir une meilleure solution de contournement pour cela. Plusieurs applications commerciales utilisent des couleurs. Il s'agit d'un mouvement de conception horriblement idiot de Google. À quoi pensaient-ils encore, voire pas du tout?
not2qubit
Si vous regardez l'application d'actualités de Google, elle n'a pas d'icônes de barre d'état blanches: play.google.com/store/apps/…
Adam Hurwitz
6
<item name="android:windowLightStatusBar">true</item>travaillé pour moi.
Adam Hurwitz
Je me demande pourquoi l'application Gmail (sortie en 2019-04) colore la barre d'état en blanc et les icônes / texte en gris foncé.
Daniel F
201

Oui, il est possible de le changer en gris (pas de couleurs personnalisées) mais cela ne fonctionne qu'à partir de l'API 23 et au-dessus, il vous suffit de l'ajouter dans votre values-v23 / styles.xml

<item name="android:windowLightStatusBar">true</item>

entrez la description de l'image ici

eOnOe
la source
2
mais la couleur des icônes des éléments de menu est toujours blanche. Comment changer la couleur des icônes des éléments de menu en noir?
Mateen Chaudhry
107

@eOnOe a répondu comment nous pouvons changer la teinte de la barre d'état via XML. Mais on peut aussi le changer dynamiquement dans le code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    View decor = getWindow().getDecorView();
    if (shouldChangeStatusBarTintToDark) {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    } else {
        // We want to change tint color to white again.
        // You can also record the flags in advance so that you can turn UI back completely if
        // you have set other flags before, such as translucent or full screen.
        decor.setSystemUiVisibility(0);
    }
}
ywwynm
la source
Belle solution! C'était vraiment adapté à mon application car je n'avais pas besoin de changer la version du SDK.
Vitor Braga
2
c'est plus correct: decorView.setSystemUiVisibility (decorView.getSystemUiVisibility () | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Anton Savenok
Cela m'a sauvé la journée! Merci @ywwynm!
ReGaSLZR
C'est la meilleure solution, fonctionne également sur les téléphones MI. Tu es un sauveur!
Numanqmr
Qu'est-ce que ShouldChangeStatusBarTintDark s'il vous plaît ??
Ibramazin le
48

si vous avez un niveau d'API inférieur à 23, vous devez l'utiliser de cette façon. cela a fonctionné pour moi déclarer cela sous v21 / style .

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
Ritesh
la source
1
Vous voulez dire 23. :(
meditat
Non, je voulais dire v21 / Style si vous ne savez pas à ce sujet, veuillez visiter ce lien. stackoverflow.com/questions/28465064/creating-styles-v21-xml
Ritesh
Même s'il est placé dans un styles.xml avec un qualificatif v21, cela ne fonctionne que sur les appareils exécutant l'API 23 et plus. En fait, AS Lint met en évidence ces éléments avec un avertissement indiquant qu'il sera ignoré sur les versions Android qui ne le prennent pas en charge. La tools:targetApi="23"pièce indique à Lint de supprimer cet avertissement.
Subaru Tashiro
5

Réglage windowLightStatusBarde truene pas fonctionne avec les téléphones Mi, certains téléphones Meizu, téléphones Blackview, WileyFox etc. J'ai trouvé cette astuce pour les appareils Mi et Meizu. Ce n'est pas une solution globale à ce problème de performance, mais peut-être que cela serait utile à quelqu'un.

Et je pense qu'il serait préférable de dire à votre client que la coloration de la barre d'état (par exemple) en blanc - n'est pas une bonne idée. au lieu d'utiliser différents hacks, il serait préférable de définir comme approprié colorPrimaryDarkselon les directives

Jackky777
la source
-3

Oui, vous pouvez le changer. mais dans l'API 22 et au-dessus, en utilisant NotificationCompat.Builder et setColorized (true):

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, context.getPackageName())
                .setContentTitle(title)
                .setContentText(message)
                .setSmallIcon(icon, level)
                .setLargeIcon(largeIcon)
                .setContentIntent(intent)
                .setColorized(true)
                .setDefaults(0)
                .setCategory(Notification.CATEGORY_SERVICE)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setPriority(NotificationCompat.PRIORITY_HIGH);
hadi seylani
la source
Êtes-vous sûr? La documentation indique que "Lorsqu'il est défini, la couleur définie avec setColor (int) sera utilisée comme couleur d'arrière-plan de cette notification." et "Pour la plupart des styles, la coloration ne sera appliquée que si la notification concerne une notification de service de premier plan." Il ne semble pas possible de changer la couleur de premier plan de l'icône.
Dominique
Ceci est pour les notifications de premier plan uniquement et s'applique uniquement à l'élément de notification - pas à l'icône de notification.
Subaru Tashiro