web-dev-qa-db-fra.com

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

Je me demandais s'il était possible de changer la couleur de la barre d'état icones (pas la couleur de la barre d'état, colorPrimaryDark) enter image description here 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.

MODIFIER:

Nouveau dans l'aperçu du développeur M: windowLightStatusBar. Retournant ceci sur dans votre thème indique au système d'utiliser un avant-plan sombre, utile pour 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, alors que les icônes d’état du système changer correctement en noir semi-transparent.

de: Roman Nurik Google+ post enter image description here

85
GuilhE

Pas depuis Lollipop. À partir d'Android 5.0, les instructions sont les suivantes:

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

Même s’ils ne le sont pas, le système ne considère que le canal alpha de votre icône, en les rendant blancs.

Workaround

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

Si toutefois vous décidez néanmoins que vous voulez des icônes colorées, vous pouvez utiliser la méthode DrawableCompat.setTint de la nouvelle bibliothèque de support v4.

23
Kuba Spatny

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 ultérieure, il vous suffit de l'ajouter dans votre fichier values-v23/styles.xml.

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

 enter image description here

138
eOnOe

@eOnOe a expliqué comment nous pouvons changer la teinte de la barre d'état via XML. Mais nous pouvons 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);
    }
}
57
ywwynm

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

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="Android:windowLightStatusBar" tools:targetApi="23">true</item>
32
Ritesh

Régler windowLightStatusBar sur true ne fonctionne pas avec les téléphones Mi, certains Meizu, les téléphones Blackview, WileyFox, etc. J'ai trouvé un tel hack pour les appareils Mi et Meizu. Ce n'est pas une solution complète de ce problème de performance, mais peut-être serait-il utile à quelqu'un.

Et je pense qu’il serait préférable de dire à votre client que la barre d’état à colorier (par exemple) blanche - n’est pas une bonne idée. au lieu d’utiliser différentes méthodes de piratage, il serait préférable de définir colorPrimaryDark approprié conformément aux directives

4
Jackky777

Oui, vous pouvez le changer. mais dans api 22 et supérieur, 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);
0
hadi seylani