Android状态栏图标颜色

Gui*_*lhE 107 android android-styles android-5.0-lollipop android-statusbar

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

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

谢谢.

编辑:

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

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

eOn*_*nOe 172

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

<item name="android:windowLightStatusBar">true</item>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 但是其菜单项图标颜色仍为白色,如何将其菜单项图标颜色更改为黑色? (2认同)

yww*_*ynm 82

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它是更正确的:decorView.setSystemUiVisibility(decorView.getSystemUiVisibility()| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); (2认同)

小智 43

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

<item name="colorPrimaryDark" tools:targetApi="23">@color/colorPrimary</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
Run Code Online (Sandbox Code Playgroud)

  • 即使放置在带有 v21 限定符的 styles.xml 中,也仅适用于运行 api 23 及更高版本的设备。事实上,AS Lint 突出显示了这些项目,并发出警告,表示在不支持它的 Android 版本上它将被忽略。`tools:targetApi="23"` 部分告诉 Lint 抑制此警告。 (5认同)
  • 你的意思是23。:( (2认同)

Kub*_*tny 22

不是自从棒棒糖.从Android 5.0开始,指南说:

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

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

解决方法

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

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

  • 必须有一个更好的解决方法.有几个商业应用程序使用颜色.这是谷歌非常愚蠢的设计举动.如果有的话,他们又在想什么呢? (10认同)
  • `<item name ="android:windowLightStatusBar"> true </ item>`为我工作. (5认同)
  • 我做了一些谷歌搜索,我找不到一个正确的方法,但如果Android指南说,图标必须是白色,白色是:)谢谢! (3认同)

Mar*_*rew 14

SystemUiVisibility标志已弃用。使用WindowInsetsController代替

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

//icon color -> black  
activity.getWindow().getDecorView().getWindowInsetsController().setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
Run Code Online (Sandbox Code Playgroud)

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

//icon color -> white
activity.getWindow().getDecorView().getWindowInsetsController().setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS);
Run Code Online (Sandbox Code Playgroud)

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

  • 如果它不起作用,请从主题样式中删除“android:windowLightStatusBar” (2认同)

Mah*_*oud 7

您可以通过保留所有其他系统 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);
     }
 }
Run Code Online (Sandbox Code Playgroud)


Jac*_*777 5

设置windowLightStatusBartrue不适用于小米手机、部分魅族手机、Blackview 手机、WileyFox 等。我发现小米和魅族设备有这样的破解。这不是这个性能问题的全面解决方案,但也许对某些人有用。

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