【问题标题】:Android statusbar icons colorAndroid状态栏图标颜色
【发布时间】:2015-07-16 12:52:06
【问题描述】:

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

还有黑色的图标,可以吗?

谢谢。

编辑:

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

来自:Roman Nurik Google+ post

【问题讨论】:

    标签: android android-5.0-lollipop android-styles android-statusbar


    【解决方案1】:

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

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

    【讨论】:

    • 但它的菜单项图标颜色仍然是白色如何将其菜单项图标颜色更改为黑色?
    【解决方案2】:

    @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 版本。
    • 更正确的是:decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    • 这是最好的解决方案,也适用于小米手机。你是救世主!
    • 请问ShouldChangeStatusBarTintDark是什么??
    • 是否有一个常量值为零,例如 View.SYSTEM_UI_FLAG_DARK_STATUS_BAR
    【解决方案3】:

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

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

    【讨论】:

    • 你的意思是 23 岁。:(
    • 不,我的意思是 v21/Style,如果您对此不了解,请访问此链接。 stackoverflow.com/questions/28465064/creating-styles-v21-xml
    • 即使放在带有 v21 限定符的 styles.xml 中,这也仅适用于运行 api 23 及更高版本的设备。事实上,AS Lint 突出显示了这些项目,并警告说它将在不支持它的 android 版本上被忽略。 tools:targetApi="23" 部分告诉 Lint 禁止显示此警告。
    【解决方案4】:

    自从 Lollipop 之后就没有了。从 Android 5.0 开始,指南说:

    通知图标必须全白。

    即使不是,系统也只会考虑图标的 Alpha 通道,将其渲染为白色

    解决方法

    在 Lollipop 上使用彩色图标的唯一方法是将您的 targetSdkVersion 降低到值 &lt;21,但我认为您最好遵循指南并仅使用白色图标。

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

    【讨论】:

    • 我做了一些谷歌搜索,但我找不到合适的方法,但如果 Android 指南说图标必须是白色的,那就是白色 :) 谢谢!
    • 必须有更好的解决方法。有几个商业应用程序正在使用颜色。这是谷歌的一个非常愚蠢的设计举措。如果有的话,他们又在想什么?
    • 如果您查看 Google 的新闻应用,它们没有白色状态栏图标:play.google.com/store/apps/…
    • &lt;item name="android:windowLightStatusBar"&gt;true&lt;/item&gt; 为我工作。
    • 我想知道为什么 Gmail 应用程序(2019 年 4 月发布)将状态栏设置为白色,将图标/文本设置为深灰色。
    【解决方案5】:

    windowLightStatusBar 设置为true 不适用于小米手机、部分魅族手机、Blackview 手机、WileyFox 等。 我为 Mi 和魅族设备找到了 such hack。这不是这个性能问题的全面解决方案,但也许对某人有用。

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

    【讨论】:

      【解决方案6】:

      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)

      【讨论】:

      • 如何更改较低 API 的顶部代码
      • 如果它不起作用,请从主题样式中删除“android:windowLightStatusBar”
      • 此代码未编译。它说“未解决的参考:getWindowInsetsController”
      【解决方案7】:

      这适用于所有想要更改其应用程序的通知小图标颜色的人可以使用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!")
      

      【讨论】:

        【解决方案8】:

        您可以以编程方式保留所有其他系统 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);
             }
         }
        

        【讨论】:

          【解决方案9】:

          是的,您可以更改它。但在 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) 设置的颜色将用作此通知的背景颜色。”和“对于大多数样式,仅当通知用于前台服务通知时才会应用着色。”似乎无法更改图标的前景色。
          • 这仅适用于前台通知,仅适用于通知项 - 不适用于通知图标。
          猜你喜欢
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多