Android 状态栏图标颜色
Android statusbar icons color
我想知道是否可以更改状态栏 图标 颜色(不是 状态栏颜色,colorPrimaryDark
)
假设我想要这个状态栏:
<item name="colorPrimaryDark">@android:color/white</item>
还有黑色的图标,可以吗?
谢谢。
编辑:
New in the M developer preview: windowLightStatusBar. Flipping this on
in your theme tells the system to use a dark foreground, useful for
lighter colored status bars. Note the M preview seems to have a bug
where notification icons remain white, while system status icons
correctly change to semitransparent black.
来自:罗曼努里克 Google+ post
自从 Lollipop 之后就没有了。从 Android 5.0 开始,指南说:
Notification icons must be entirely white.
即使不是,系统也只会考虑您图标的 Alpha 通道,将它们渲染为白色
解决方法
在 Lollipop 上使用彩色图标的唯一方法是将 targetSdkVersion
降低到值 <21
,但我认为您最好遵循指南并仅使用白色图标。
如果您仍然决定想要彩色图标,您可以使用新的 v4 支持库中的 DrawableCompat.setTint 方法。
是的,可以将其更改为灰色(无自定义颜色),但这仅适用于 API 23 及更高版本,您只需将其添加到 values-v23/styles.xml
<item name="android:windowLightStatusBar">true</item>
@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
不适用于小米手机、部分魅族手机、Blackview 手机、WileyFox 等。
我发现 such hack 适用于 Mi 和 Meizu 设备。这不是此性能问题的全面解决方案,但也许对某些人有用。
而且我认为,最好告诉您的客户将状态栏着色(例如)白色 - 不是一个好主意。与其使用不同的 hack,不如根据指南
定义适当的 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.Builder
的 setColor
方法
示例:
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!")
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);
您可以以编程方式完成,保留所有其他系统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);
}
}
我想知道是否可以更改状态栏 图标 颜色(不是 状态栏颜色,colorPrimaryDark
)
<item name="colorPrimaryDark">@android:color/white</item>
还有黑色的图标,可以吗?
谢谢。
编辑:
New in the M developer preview: windowLightStatusBar. Flipping this on in your theme tells the system to use a dark foreground, useful for lighter colored status bars. Note the M preview seems to have a bug where notification icons remain white, while system status icons correctly change to semitransparent black.
来自:罗曼努里克 Google+ post
自从 Lollipop 之后就没有了。从 Android 5.0 开始,指南说:
Notification icons must be entirely white.
即使不是,系统也只会考虑您图标的 Alpha 通道,将它们渲染为白色
解决方法
在 Lollipop 上使用彩色图标的唯一方法是将 targetSdkVersion
降低到值 <21
,但我认为您最好遵循指南并仅使用白色图标。
如果您仍然决定想要彩色图标,您可以使用新的 v4 支持库中的 DrawableCompat.setTint 方法。
是的,可以将其更改为灰色(无自定义颜色),但这仅适用于 API 23 及更高版本,您只需将其添加到 values-v23/styles.xml
<item name="android:windowLightStatusBar">true</item>
@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
不适用于小米手机、部分魅族手机、Blackview 手机、WileyFox 等。
我发现 such hack 适用于 Mi 和 Meizu 设备。这不是此性能问题的全面解决方案,但也许对某些人有用。
而且我认为,最好告诉您的客户将状态栏着色(例如)白色 - 不是一个好主意。与其使用不同的 hack,不如根据指南
定义适当的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.Builder
setColor
方法
示例:
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!")
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);
您可以以编程方式完成,保留所有其他系统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);
}
}