【问题标题】:How to change the background color of android status bar如何更改android状态栏的背景颜色
【发布时间】:2012-02-21 03:09:15
【问题描述】:

我想通过写一个应用来改变状态栏的背景颜色。我的安卓设备是黑色的,我想把它改成其他颜色。我在这里看到了一些与之相关的帖子,但它们都在讲述通知背景。

如果有人知道这件事,请帮助我。

默认状态栏

使用可绘制对象作为状态栏的背景后

【问题讨论】:

    标签: android statusbar


    【解决方案1】:

    在styles.xml 中这样做:

    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light">
            <item name="colorPrimary">@color/color_primary</item>
            <item name="colorPrimaryDark">@color/color_secondary</item>
            <item name="colorAccent">@color/color_accent</item>
             <!---Below is the code for status bar color------>
            <item name="android:statusBarColor">@color/color_primary</item>
        </style>
    </resources>
    

    将此放在您的 values-v21/styles.xml 中,以便在 Lollipop 及更高版本上启用此功能。

    为了以编程方式执行此操作,您可以这样做:

    Window window = activity.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.setStatusBarColor(activity.getResources().getColor(R.color.example_color));
    

    【讨论】:

    • 对不起!如何通过xml使用drawbles。我需要设置一个渐变。 . .
    【解决方案2】:

    抱歉,除非您要制作自定义 ROM,否则这是不可能的,除非您只想为您的应用更改状态栏。

    这需要大量的工作。

    首先,您需要将 Theme.NoTitleBar.Fullscreen 添加到清单中

    <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" 
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            >
    

    那么一旦你完成了你需要创建一个代表状态栏的标准布局,这意味着你必须添加时间,并且还要接收来自其他应用程序的所有通知,我个人不知道如何这样做,但我确信有办法。

    如果你真的想走好运,那么你将面临一个艰难的时期。


    抱歉,除非您知道如何构建自定义 ROM,否则我认为这是不可能的

    【讨论】:

      【解决方案3】:

      这在 Kitkat 及之后是可能的。

      如果你想在应用程序中使用它(就像你问的那样),你可以使用这个库https://github.com/jgilfelt/SystemBarTint

      你只需要写:

      // set a custom tint color for all system bars
      tintManager.setTintColor(Color.parseColor("#99000FF"));   
      // set a custom navigation bar resource
      tintManager.setNavigationBarTintResource(R.drawable.my_tint);
      // set a custom status bar drawable
      tintManager.setStatusBarTintDrawable(MyDrawable);
      

      【讨论】:

        【解决方案4】:

        styles.xml 最近更改为themes.xml,因此这里的大多数答案都已过时。您现在只需将这行代码添加到themes.xml 文件即可将状态栏颜色更改为绿色:

        <item name="android:statusBarColor">@color/black</item>
        

        【讨论】:

          【解决方案5】:

          如果您想更新 Lollipop 上的状态栏颜色而不升级您的 ADT 和 SDK 以及所有相关的东西,您可以使用反射来达到 API 21 (Lollipop) 和更高版本的方法

          在你的活动中:

              if (Build.VERSION.SDK_INT >= 21) {
                  Window window = getWindow();
          
                  // original code, works on Lollipop SDKs
                  // window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                  // window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                  // window.setStatusBarColor(getResources().getColor(YOUR_COLOR));
          
                  try {
                      // to work on old SDKs 
                      int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = 0x80000000;
                      window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                      window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
          
                      Class<?> cls = window.getClass();
                      Method method = cls.getDeclaredMethod("setStatusBarColor",
                              new Class<?>[] { Integer.TYPE });
          
                      method.invoke(window, Res.color(theme.statusColor));
          
                  } catch (Exception e) {
                      // upgrade your SDK and ADT :D
                  }
          
              }
          

          我目前的最低 API 是 15,如果你找不到

          WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
          

          在您的 SDK 中,您可以像我使用的那样从文档中获取它的价值

          WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
          

          希望这有帮助

          【讨论】:

          • 不适用于 17: java.lang.NoSuchMethodException: setStatusBarColor [int]