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

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.


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


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);
    }
}

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>

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


-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);

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.