Android Statusbar图标颜色


131

我想知道是否可以更改状态栏图标的颜色(而不是状态栏的颜色colorPrimaryDark)。 在此处输入图片说明 假设我要使用以下状态栏:
<item name="colorPrimaryDark">@android:color/white</item>

黑色的图标,可以吗?

谢谢。

编辑:

M开发人员预览中的新增功能:windowLightStatusBar。在主题中将其翻转会告诉系统使用深色前景,这对于浅色状态栏很有用。注意,M预览似乎有一个错误,通知图标保持白色,而系统状态图标正确更改为半透明黑色。

来自:Roman Nurik Google+ 帖子 在此处输入图片说明

Answers:


24

自棒棒糖以来没有。从Android 5.0开始,准则如下:

通知图标必须完全为白色。

即使不是,系统也只会考虑您图标的Alpha通道,使它们呈现白色

解决方法

在Lollipop上带有彩色图标的唯一方法是降低您targetSdkVersion的价值观<21,但我认为您最好遵循准则并仅使用白色图标。

但是,如果仍然决定要使用彩色图标,则可以使用新的v4支持库中的DrawableCompat.setTint方法。


3
我做了一些谷歌搜索,但找不到合适的方法,但是如果Android准则说图标必须为白色,则为白色:)谢谢!
GuilhE,2015年

11
为此必须有一个更好的解决方法。几种商业应用程序正在使用颜色。这是Google极其愚蠢的设计举措。如果有的话,他们又在想什么呢?
not2qubit

如果你看一下谷歌的新闻应用程序,他们没有白状态栏图标: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>

在此处输入图片说明


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

不错的解决方案!它真的很适合我的应用程序,因为我不必更改SDK版本。
维托尔·布拉加

2
它是更正确的:decorView.setSystemUiVisibility(decorView.getSystemUiVisibility()| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
安东·萨维诺克

这挽救了我的一天!谢谢@ywwynm!
ReGaSLZR

这是最好的解决方案,也适用于MI电话。你是救世主!
Numanqmr

请问ShouldChangeStatusBarTintDark是什么?
Ibramazin

48

如果您的API等级小于23,则必须使用这种方式。它对我有用,v21 / style下声明了这一点。

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

1
你的意思是23 :(
meditat

不,我的意思是v21 / Style,如果您不了解,请访问此链接。stackoverflow.com/questions/28465064/creating-styles-v21-xml
Ritesh '18年

即使将其放置在带有v21限定符的styles.xml中,它也仅适用于运行api 23及更高版本的设备。实际上,AS Lint会在警告中突出显示这些项目,并指出在不支持该功能的android版本中,它将被忽略。该tools:targetApi="23"零件告诉Lint禁止显示此警告。
斯巴鲁Tashiro

5

设置windowLightStatusBartrue不适用于Mi手机,某些魅族手机,Blackview手机,WileyFox等。我发现Mi和Meizu设备存在此类漏洞。这不是此性能问题的全面解决方案,但可能对某些人有用。

而且我认为,最好告诉您的客户,白色的着色状态栏(例如)不是一个好主意。与其使用其他技巧,不如colorPrimaryDark根据指南定义适当的方法


-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)设置的颜色将用作此通知的背景颜色。” 和“对于大多数样式,仅当通知用于前台服务通知时才应用颜色。” 似乎无法更改图标的前景色。
多米尼克

这仅用于前台通知,仅适用于通知项目-不适用于通知图标。
斯巴鲁Tashiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.