159

我想知道是否可以更改状态栏图标颜色(不是状态栏颜色colorPrimaryDark在此处输入图像描述 假设我想要这个状态栏:
<item name="colorPrimaryDark">@android:color/white</item>

和黑色的图标,有可能吗?

谢谢。

编辑:

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

来自:Roman Nurik Google+帖子 在此处输入图像描述

4

9 回答 9

236

是的,可以将其更改为灰色(无自定义颜色),但这仅适用于 API 23 及更高版本,您只需将其添加到您的 values-v23/styles.xml

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

在此处输入图像描述

于 2015-11-24T13:23:42.060 回答
122

@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);
    }
}
于 2016-06-08T06:06:36.180 回答
51

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

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
于 2016-12-30T04:45:01.827 回答
29

不是因为棒棒糖。从 Android 5.0 开始,指南说:

通知图标必须全白。

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

解决方法

在 Lollipop 上使用彩色图标的唯一方法是降低您的targetSdkVersionto values <21,但我认为您最好遵循指南并仅使用白色图标。

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

于 2015-05-06T11:52:40.370 回答
5

设置windowLightStatusBartrue不适用于 Mi 手机、某些 Meizu 手机、Blackview 手机、WileyFox 等。我发现Mi 和 Meizu 设备有这样的 hack。这不是这个性能问题的全面解决方案,但也许它对某人有用。

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

于 2018-01-22T09:40:57.400 回答
4

SystemUiVisibility标志已弃用。改用WindowInsetsController _

下面的代码将图标的颜色设置为黑色(用于灯光状态栏)

//icon color -> black  
activity.getWindow().getDecorView().getWindowInsetsController().setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);

并且下面的代码将其清除(即将图标颜色变为白色以显示深色状态栏):

//icon color -> white
activity.getWindow().getDecorView().getWindowInsetsController().setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS);

链接到文档: https://developer.android.com/reference/android/view/WindowInsetsController#setSystemBarsAppearance(int,%20int)

于 2021-03-23T19:44:13.580 回答
0

这适用于所有想要更改其应用程序的通知小图标颜色的人可以使用这种setColor方法NotificationCompat.Builder

例子:

val builder = NotificationCompat.Builder(this, "whatever_channel_id")
        **.setSmallIcon(R.drawable.ic_notification) //set icon for notification**
        .setColor(ContextCompat.getColor(this, R.color.pink))
        .setContentTitle("Notification Title")
        .setContentText("Notification Message!")
于 2021-03-04T15:51:37.803 回答
0

您可以通过保留所有其他系统 UI 可见性标志以编程方式完成此操作。

public static void changeStatusBarContrastStyle(Window window, Boolean lightIcons) {
     View decorView = window.getDecorView();
     if (lightIcons) {
         // Draw light icons on a dark background color
         decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
     } else {
         // Draw dark icons on a light background color
         decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
     }
 }
于 2021-10-08T06:27:55.743 回答
-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);
于 2018-11-16T13:55:58.070 回答