Цвет значков панели состояния Android

131

Мне было интересно, можно ли изменить цвет значков строки состояния ( не цвет строки состояния colorPrimaryDark). введите описание изображения здесь Скажем, я хочу, чтобы эта строка состояния была:
<item name="colorPrimaryDark">@android:color/white</item>

а иконки черные, это возможно?

Спасибо.

РЕДАКТИРОВАТЬ:

Новое в предварительной версии M для разработчиков: windowLightStatusBar. Если включить эту опцию в вашей теме, система будет использовать темный передний план, что полезно для более светлых строк состояния. Обратите внимание, что в предварительном просмотре M, похоже, есть ошибка, когда значки уведомлений остаются белыми, а значки состояния системы правильно меняются на полупрозрачный черный.

от: Роман Нурик запись в Google+ введите описание изображения здесь

GuilhE
источник

Ответы:

24

Со времен Lollipop. Начиная с Android 5.0, в руководстве говорится:

Значки уведомлений должны быть полностью белыми.

Даже если это не так, система будет учитывать только альфа-канал вашего значка, делая их белыми.

Временное решение

Единственный способ иметь цветной значок на Lollipop - это понизить его targetSdkVersionдо значений <21, но я думаю, вам лучше следовать инструкциям и использовать только белые значки.

Если вы все же решите, что хотите цветные значки, вы можете использовать метод DrawableCompat.setTint из новой библиотеки поддержки v4.

Куба Спатны
источник
3
Я выполнил поиск в Google и не смог найти подходящий способ, но если в руководстве Android указано, что значки должны быть белыми, то они белые :) Спасибо!
GuilhE
11
Для этого должен быть лучший способ обхода. Несколько коммерческих приложений используют цвета. Это ужасно идиотский дизайнерский ход со стороны Google. О чем они думали снова, если вообще думали?
not2qubit
Если вы посмотрите на новостное приложение Google, у них нет белых значков в строке состояния: play.google.com/store/apps/…
Адам Гурвиц,
6
<item name="android:windowLightStatusBar">true</item>работал у меня.
Адам Гурвиц
Интересно, почему приложение Gmail (выпущенное в 2019-04 году) окрашивает строку состояния в белый цвет, а значки / текст - в темно-серый.
Daniel F
201

Да, можно изменить его на серый (без пользовательских цветов), но это работает только с API 23 и выше, вам нужно только добавить это в свои values-v23 / styles.xml

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

введите описание изображения здесь

eOnOe
источник
2
но цвет значков его пунктов меню по-прежнему белый, как изменить цвет значков пунктов меню на черный?
Mateen Chaudhry
107

@eOnOe ответил, как мы можем изменить оттенок строки состояния через xml. Но мы также можем изменить его динамически в коде:

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
источник
Хорошее решение! Это действительно подходило для моего приложения, потому что мне не нужно было менять версию SDK.
Витор Брага
2
вернее: decorView.setSystemUiVisibility (decorView.getSystemUiVisibility () | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Антон Савенок
Это спасло мне день! Спасибо @ywwynm!
ReGaSLZR 08
Это лучшее решение, также работает на телефонах MI. Ты спаситель!
Numanqmr
что такое ShouldChangeStatusBarTintDark, пожалуйста ??
Ибрамазин
48

если у вас уровень API меньше 23, вы должны использовать его таким образом. это сработало для меня, объявить это в v21 / style .

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
Ritesh
источник
1
Вы имеете в виду 23. :(
meditat
Нет, я имел в виду v21 / Style, если вы не знаете об этом, перейдите по этой ссылке. stackoverflow.com/questions/28465064/creating-styles-v21-xml
Ritesh
Даже если он помещен в файл styles.xml с квалификатором v21, он работает только на устройствах с api 23 и выше. Фактически, AS Lint выделяет эти элементы предупреждением о том, что они будут проигнорированы в версиях Android, которые его не поддерживают. tools:targetApi="23"Часть говорит Lint , чтобы подавить это предупреждение.
Subaru Tashiro
5

Установка windowLightStatusBarдля trueне работает с телефонами Ми, некоторые телефоны Meizu, Blackview телефоны, WileyFox и т.д. Я нашел такой хак для Ми и Meizu устройств. Это не комплексное решение проблемы производительности, но, может быть, кому-то будет полезно.

И я думаю, что лучше было бы сказать вашему покупателю, что окрашивать строку состояния (например) в белый цвет - не лучшая идея. вместо использования разных хаков было бы лучше определить подходящие в colorPrimaryDarkсоответствии с руководящими принципами

Jackky777
источник
-3

Да, вы можете это изменить. но в api 22 и выше, используя NotificationCompat.Builder и 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);
Хади Сейлани
источник
Ты уверен? В документации сказано: «Когда установлено, цвет, установленный с помощью setColor (int), будет использоваться в качестве цвета фона этого уведомления». и «Для большинства стилей окраска будет применяться только в том случае, если уведомление предназначено для уведомления службы переднего плана». Не представляется возможным изменить цвет переднего плана значка.
Доминик
Это только для уведомлений переднего плана и применяется только к элементу уведомления, а не к значку уведомления.
Subaru Tashiro