状态栏颜色没有显示 - 5.0棒棒糖 Android Studio: (AppCompat-v7:r21)

41
我正在使用 AppCompat-v7:21.0.0 支持库来开发 Android 5.0 Lollipop 的应用,但是我发现在 values/styles.xml 文件中通过设置 colorPrimaryDark 来改变状态栏颜色后,在 XML 布局预览和模拟器中都显示为黑色。
请问出了什么问题吗?我是否漏掉了什么步骤?谢谢。
编辑:我知道在 Lollipop 版本之前无法更改状态栏颜色。我的 XML 布局预览和模拟器都设置为 API 级别 21(即 5.0 Lollipop)。但是,状态栏仍然不是我在 colorPrimaryDark 中设置的颜色。我尝试在 styles.xml 中设置 statusBarColor,但没有效果。它仍然是黑色的。
另外,我看到类似问题的回答中有人建议将 minSdkVersion 设置为 21。我尝试过了,但并没有起作用。而且我希望我的应用可以在 API 级别 15 及以上的设备上运行。

4
我也遇到了5.0模拟器的同样问题,状态栏颜色无法改变,但是相同的代码在真实设备上运行正常。 - Patrick Jackson
1
这里也有同样的问题。在 Android 5.0 的模拟器上无法工作。但在 L-developer preview 上可以工作。很遗憾。 - greywolf82
@MattWilliams89 这个问题是出现在你的设备上还是模拟器上?在 Android Studio 的模拟器和 layout.xml 中,状态栏不会显示为彩色。然而,在设备上,根据 Patrick 在上面的评论中所说,它应该可以正常工作。如果在设备上也无法正常工作,请查看我标记的下面的答案,看看是否可以解决你的问题... :) - Adifyr
我正在寻找colorPrimaryDark颜色,如果您在模拟器中使用Galaxy Nexus设备(或xhdpi或xxhdp?),则会将状态栏着色。不幸的是,它也会将工具栏着色。 - Dan Brough
我有同样的问题。在设备上,状态栏颜色按预期正确显示,但是当我在模拟器上尝试时,它不起作用。我尝试了5.0.2和5.1的模拟器。如果有人找到解决方案,请分享。提前致谢。 - Abhijit Kurane
显示剩余2条评论
11个回答

36

这个对我起作用:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().setStatusBarColor(getResources().getColor(R.color.some_color));
    }

36
请阅读以下内容:为使此生效,窗口必须绘制系统栏背景。
android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

但是

android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS

不得设置(来源

如果您不知道如何添加该标志:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

1
很抱歉,它不起作用。谢谢你的提示。可能是我的模拟器的问题吗? - Adifyr
1
请在真机上测试。它可以在我的Nexus 7上运行,但在模拟器上无法运行。所有系统栏半透明特性在模拟器上也无法工作。 - Wayne
5
嘿,这里有一个小问题,是否有一种通过 XML 添加此标志的方法? - Adifyr
3
<item name="android:windowDrawsSystemBarBackgrounds">true</item> - deviant
1
@ADeveloper,找不到与给定名称匹配的资源:attr 'windowDrawSystemBarBackgrounds'。使用appcompat v22运行。这个有变化吗? - lostintranslation
显示剩余6条评论

12

你将目标SDK版本设置为21了吗?当我将目标SDK版本保留在19时,我也遇到了同样的问题。最低SDK版本可以设置得更低。

当然,你需要继承正确的主题并确保你的Activity使用它。


1
是的。我已经尝试了所有的方法。结果问题是模拟器和布局预览无法绘制状态栏颜色。相同的代码据说可以在运行lollipop的真实设备上工作。 - Adifyr
在预览中它不起作用,但在Lollipop模拟器中它可以工作。如果您在模拟器中打开电话拨号应用程序,例如,您应该会看到蓝色状态栏。 - BladeCoder

7

在我的Nexus7 5.1.1上测试

在style.xml v21/v22中设置无效

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/holo_red_dark</item>

但是
设置在活动中。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(getResources().getColor(android.R.color.holo_red_dark));
}

这对我来说是有效的。


6
可以确认这件事。情况非常混乱...我对此感到厌烦。 - sebastian
1
可以确认Nexus 5X运行6.0.1版本和MX5运行5.0.1版本。 - chefish
1
同样的事情,它让我发疯了,花了几天时间去对抗它。 - Mikhail
getColor已经被弃用,请问有什么替代方法吗?请更新您的答案。 - Vikas Bansal

7

请检查您是否在 values-v21 文件夹下编辑了 styles.xml 。如果您将SDK版本设置为21,则它将不会在 values 文件夹中寻找 styles.xml(但实际上应该这样做)。

enter image description here


问题的确切所在。 - Visores

3

在Android 5.0以下版本中,无法通过设置colorPrimaryDark来更改状态栏的颜色。请参见此文章

在旧版平台上,AppCompat尽可能地模拟颜色主题。目前,这仅限于对操作栏和某些小部件进行着色。


我知道。但是,我的模拟器和XML布局编辑器预览都在运行API级别21,但它仍然无法正常工作,这就是我的困境所在。 - Adifyr
嗨@patrick,我是Android的新手。如果使用AppCompat库无法更改状态栏颜色。那么所有谷歌应用程序都在使用其他方法来更改其应用程序中的状态栏颜色吗?我正在使用Kitkat,我可以看到他们的应用程序更改了状态栏颜色。期待您的意见... - Raju
@javaman 确定我们都在谈论状态栏吗?屏幕顶部带有时钟和电池的那个栏? - Patrick Jackson

1
在我的情况下,values-v21/styles.xml 包含以下行,它使用 colorPrimaryDark 覆盖了在 values/style.xml 中定义的状态栏颜色:
<item name="android:statusBarColor">@android:color/transparent</item>

删除这个对我有用。


0

这对我有用。 从样式中删除状态栏颜色。 添加标志,然后像这样放置所需的颜色。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(getResources().getColor(R.color.your_color));
}

0
v22-appcompat 中,Android 现在已经在 Android Studio 预览中添加了状态栏颜色的渲染!
终于到了这个时候... 无论如何,请确保您的 appcompat 库已更新到最新版本,即 v22.0.+。
干杯!

0
在我的情况下,罪魁祸首是 jfeinstein10/SlidingMenu 库。 我用 Android 导航抽屉 替换了该库,现在状态栏颜色正确显示。

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