Kolor ikon na pasku stanu systemu Android

131

Zastanawiałem się, czy można zmienić kolor ikon paska stanu ( nie kolor paska stanu colorPrimaryDark). wprowadź opis obrazu tutaj Powiedzmy, że chcę ten pasek stanu z:
<item name="colorPrimaryDark">@android:color/white</item>

a ikony w kolorze czarnym, czy to możliwe?

Dzięki.

EDYTOWAĆ:

Nowość w podglądzie dewelopera M: windowLightStatusBar. Włączenie tego w twoim motywie nakazuje systemowi użycie ciemnego pierwszego planu, przydatnego w przypadku jaśniejszych kolorowych pasków stanu. Zauważ, że w podglądzie M wydaje się mieć błąd polegający na tym, że ikony powiadomień pozostają białe, podczas gdy ikony stanu systemu prawidłowo zmieniają się na półprzezroczystą czerń.

z: post Romana Nurika na Google+ wprowadź opis obrazu tutaj

GuilhE
źródło

Odpowiedzi:

24

Nie od Lollipopa. Począwszy od Androida 5.0, wytyczne mówią:

Ikony powiadomień muszą być całkowicie białe.

Nawet jeśli tak nie jest, system weźmie pod uwagę tylko kanał alfa Twojej ikony, renderując je na biało

Obejście problemu

Jedynym sposobem na uzyskanie kolorowej ikony w Lollipop jest obniżenie targetSdkVersionwartości do wartości <21, ale myślę, że lepiej byłoby postępować zgodnie z wytycznymi i używać tylko białych ikon.

Jeśli jednak nadal zdecydujesz, że chcesz mieć kolorowe ikony, możesz użyć metody DrawableCompat.setTint z nowej biblioteki obsługi wersji 4.

Kuba Spatny
źródło
3
Wyszukałem w Google i nie mogłem znaleźć właściwej drogi do tego, ale jeśli wytyczne Androida mówią, że ikony muszą być białe, to jest białe :) Dzięki!
GuilhE
11
Musi być lepsze obejście tego problemu. Kilka komercyjnych aplikacji używa kolorów. To okropnie idiotyczne posunięcie Google. O czym oni myśleli, jeśli w ogóle?
not2qubit
Jeśli spojrzysz na aplikację wiadomości Google, nie mają białych ikon na pasku stanu: play.google.com/store/apps/ ...
Adam Hurwitz,
6
<item name="android:windowLightStatusBar">true</item>pracował dla mnie.
Adam Hurwitz
Zastanawiam się, dlaczego aplikacja Gmail (wydana w 2019-04) koloruje pasek stanu na biało, a ikony / tekst na ciemnoszary.
Daniel F
201

Tak, można to zmienić na szary (brak kolorów niestandardowych), ale działa to tylko od API 23 i wyższych, wystarczy dodać to do swoich values-v23 / styles.xml

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

wprowadź opis obrazu tutaj

eOnOe
źródło
2
ale kolor ikon pozycji menu jest nadal biały. Jak zmienić kolor ikon pozycji menu na czarny?
Mateen Chaudhry
107

@eOnOe odpowiedział, jak możemy zmienić odcień paska stanu za pomocą XML. Ale możemy też dynamicznie zmieniać to w kodzie:

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
źródło
Niezłe rozwiązanie! To było naprawdę odpowiednie dla mojej aplikacji, ponieważ nie musiałem zmieniać wersji SDK.
Vitor Braga
2
jest bardziej poprawne: decorView.setSystemUiVisibility (decorView.getSystemUiVisibility () | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Anton Savenok,
To uratowało mi dzień! Dziękuję @ywwynm!
ReGaSLZR
To najlepsze rozwiązanie, działa również na telefonach MI. Jesteś zbawicielem!
Numanqmr
co to jest ShouldChangeStatusBarTintDark, proszę?
Ibramazin
48

jeśli masz poziom API mniejszy niż 23, musisz go używać w ten sposób. zadziałało dla mnie, zadeklaruj to w stylu v21 / .

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
Ritesh
źródło
1
Masz na myśli 23. :(
medytacja
Nie, miałem na myśli v21 / Style, jeśli o tym nie wiesz, odwiedź ten link. stackoverflow.com/questions/28465064/creating-styles-v21-xml
Ritesh,
Nawet jeśli zostanie umieszczony w pliku styles.xml z kwalifikatorem v21, działa to tylko na urządzeniach z interfejsem API 23 i nowszym. W rzeczywistości AS Lint podkreśla te elementy ostrzeżeniem, że zostaną zignorowane w wersjach Androida, które go nie obsługują. tools:targetApi="23"Część opowiada Lint stłumić to ostrzeżenie.
Subaru Tashiro
5

Ustawianie windowLightStatusBarsię truenie współpracuje z telefonami MI, niektóre telefony Meizu, telefony Blackview, WileyFox itd. Znalazłem taki siekać dla urządzeń Mi i Meizu. Nie jest to kompleksowe rozwiązanie tego problemu z wydajnością, ale może komuś się przyda.

I myślę, że byłoby lepiej powiedzieć klientowi, że kolorowanie paska stanu (na przykład) na biało - nie jest dobrym pomysłem. zamiast używać różnych hacków, lepiej byłoby zdefiniować odpowiednie colorPrimaryDarkzgodnie z wytycznymi

Jackky777
źródło
-3

Tak, możesz to zmienić. ale w api 22 i nowszych przy użyciu NotificationCompat.Builder i 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
źródło
Jesteś pewny? Dokumentacja mówi: „Po ustawieniu kolor ustawiony za pomocą setColor (int) będzie używany jako kolor tła tego powiadomienia”. i „W przypadku większości stylów kolorowanie zostanie zastosowane tylko wtedy, gdy powiadomienie dotyczy powiadomienia o usłudze pierwszego planu”. Wydaje się, że zmiana koloru pierwszego planu ikony nie jest możliwa.
Dominique
Dotyczy to tylko powiadomień na pierwszym planie i dotyczy tylko elementu powiadomienia, a nie ikony powiadomienia.
Subaru Tashiro