Android 状态栏图标颜色

我想知道是否可以改变状态栏的 偶像颜色(没有的状态栏颜色,colorPrimaryDark) enter image description here 假设我想要这个状态栏:
<item name="colorPrimaryDark">@android:color/white</item>

还有黑色的图标,这可能吗?

谢谢。

编辑:

在 M 开发者预览中新增: windowLightStatusBar 在你的主题中告诉系统使用暗色前景,对 颜色较浅的状态栏。请注意,M 预览似乎有一个错误 通知图标保持白色,而系统状态图标 正确地变成半透明的黑色。

来自: Roman Nurik Google + < a href = “ https://plus.Google.com/+ RomanNurik/post/4WBSonAZxt1”rel = “ noReferrer”> post enter image description here

150935 次浏览

从安卓5.0开始,指南说:

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

即使他们不是,系统将只考虑你的图标的 alpha 通道,使他们成为白色

解决办法

在棒棒糖上有一个彩色图标的唯一方法是将你的 targetSdkVersion值降低到 <21值,但是我认为你最好遵循指南,只使用白色图标。

但是,如果您仍然决定要使用彩色图标,则可以使用新版本4支持库中的 SetTint方法。

是的,可以将其更改为灰色(没有自定义颜色) ,但这只能在 API 23及以上版本中使用,您只需将其添加到您的值-v23/styles.xml 中

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

enter image description here

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

如果您的 API 级别小于23,则必须以这种方式使用它。 对我来说,在 V21/style下申报这个是有效的。

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

windowLightStatusBar设置为 true不适用于小米手机,一些魅族手机,黑视手机,威利福克斯等。 我找到了用于 Mi 和 Meizu 设备的 真是无聊。这不是这个性能问题的全面解决方案,但是可能对某些人有用。

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

是的,你可以改变它。但是在 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);

这是为所有那些谁想要改变他们的 应用程序的通知小图标颜色可以使用这个 NotificationCompat.BuildersetColor方法

例如:

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!")

不推荐使用 SystemUiVisiability 标志。改为使用 < strong > 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)

你可以用 保留所有其他系统 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);
}
}

我用两行代码为不同的状态栏颜色

如果状态栏的颜色是白色,那么使用这行代码可以看到状态栏图标:

  pingAct.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  

      

第2行: 如果你使用深色,那么使用这行代码来显示状态栏图标:

 pingAct.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);