如何更改安卓状态栏的背景颜色

22
我希望编写一个应用程序来改变状态栏的背景颜色。我的安卓设备状态栏是黑色的,但我想将它改成其他颜色。我在这里看到了一些相关帖子,但它们都是关于通知背景的。如果有人知道如何实现,请帮助我。
默认状态栏: enter image description here 使用绘图作为状态栏背景后的效果: enter image description here
5个回答

15

在 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使用Drawables。我需要设置一个渐变…… - elyar abad

14

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

这将需要大量工作。

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

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

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

如果你真的想做到这一点,祝你好运,你将面临艰难的挑战。


抱歉,除非你具备构建定制ROM的知识,否则我认为这是不可能的。


12

这可以在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);

3

styles.xml 最近已经更改为 themes.xml,因此这里的大部分答案都已过时。现在你只需在 themes.xml 文件中添加以下代码行就可以将状态栏颜色更改为绿色:

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

1
如果你想在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

希望这有所帮助。

不起作用的问题:java.lang.NoSuchMethodException: setStatusBarColor [int] - djdance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接