状态栏变为白色,并且在其后面不显示内容


96

我正在棉花糖上试用AppCompat。我想有一个透明的状态栏,但是它变成白色。我尝试了几种解决方案,但它们对我不起作用(透明状态栏不适用于windowTranslucentNavigation =“ false”Lollipop:在statusBar后面绘制,其颜色设置为transparent)。这是相关的代码。

我的styles.xml

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

活动

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

分段

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

在此处输入图片说明


您能解决这个问题吗?我有相同的问题。在我的一项具有白色状态栏的活动中
kirtan403

1
@ kirtan403我通过将Activity布局从FrameLayout更改为RelativeLayout来解决我的问题。请看我的回答。
pt2121

我的相对是唯一仍然获得白色状态栏。我在这里发布了问题:stackoverflow.com/q/33890066/1820644
kirtan403

经过一天的努力,我找到了适合我的解决方案。答案是:stackoverflow.com/a/33892569/1820644
kirtan403

我将android:windowTranslucentStatus状态更改为false及其工作状态
Kiran Benny Joseph

Answers:


167

我在此链接中找到了答案:状态栏颜色未更改,相对布局作为根元素

所以事实证明我们需要删除

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

在styles.xml(v21)中。它对我来说很好。


是的,这是解决方案。因为android:fitsSystemWindows在使标签栏可滚动时会引起问题。找到了相同的答案,但您之前已发布了它。还要提一下,我认为这是默认覆盖。
Jobbert

这应标记为已接受的解决方案。这个问题在我的整个应用程序中蔓延,仅通过注释该行,此解决方案就将其固定在各处。救了我这么头痛!
BMB

我正在使用CoordinatorLayout,所以对我们来说,作为根的其他答案对我也不起作用(按照建议使用fitsSystemWindows = true也不起作用)。这个答案对我有用。
布鲁斯

如果我要求状态栏颜色是透明的怎么办?
nullmn

1
@nullmn,则需要将“活动”背景更改为其他内容。
Phoenix Wang

96

(聚会晚了一点,但可能会对某人有所帮助)

我有同样的问题。不知何故,一些活动是正常的,而我创建的新活动却显示白色状态栏而不是colorPrimaryDark价值。

在尝试了一些技巧之后,我注意到所有正常工作的活动都将其CoordinatorLayout用作布局的根,而对于其他活动,我则将其替换为常规布局,因为我不需要所提供的功能(动画等)CoordinatorLayout

因此,解决方案是制作CoordinatorLayout根布局,然后在其中添加以前的布局根。这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

请注意,没有android:fitsSystemWindows="true"此解决方案对我不起作用。

经过棒棒糖和棉花糖测试


3
该解决方案也对我有用。但是..为什么会发生呢?当根为DrawerLayout或CoordinatorLayout时,会显示正确的StatusBar颜色
user3316561 2016年

3
加入时,这只是为我工作android:fitsSystemWindows="true"CoordinatorLayoutAndroid中8
弗朗哥

2
@Franco我认为这是解决方案中最相关的部分。我之所以这样说,是因为我CoordinatorLayout在遇到同样的问题时遇到了这个问题,而对我来说解决这个问题的具体属性是android:fitsSystemWindows="true"
Wilhelm

android:fitsSystemWindows="true"没有为我工作。解决我的问题的方法是使用不在AppTheme.NoActionBar活动中的主题CoordinatorLayout。我不知道为什么能解决这个问题。
bmdelacruz

CoordinatorLayoutandroid:fitsSystemWindows="true"两者都不为我工作。
Alif Hasnain

17
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

只需替换它,statusBarColor应该是您期望的颜色,而不是TRANSPARENT



11

在您的style.xml中添加它

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

这在你的onCreate();中

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

1
谢谢,但是这不起作用。状态栏看起来相同。
pt2121'9

请为这个问题提供帮助...这里是同样的问题....直到现在,所有解决方案都
无法解决

@SaeedJassani我找到了对我有用的解决方案。如果您有相同的问题,请查看我的问题和答案:stackoverflow.com/a/33892569/1820644
kirtan403

9

在尝试上述所有方法失败后,我发现显式设置主题可以解决此问题。

setTheme(R.style.AppTheme);

这必须在您的活动中的super.OnCreate()之前。


1
我可以确认这可以解决棉花糖上的错误活动
dare0021 '16

爱你的男人,像魅力一样工作,尽管我仍然不知道为什么:@
Adeel Ahmad

在super.OnCreate()之前是关键
Karthik Rk

9

只需将此项放在您的v21 \ styles.xml中:

真正

它看起来应该像这样:

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>


1
它使用false最后2个项目中的值为我工作。很奇怪,但是谢谢。
JCarlosR

它仅适用于最后两行,但内容在状态栏后面,padding / margin或fitsSystemWindows无济于事。在运行牛轧糖的OP 5上进行了测试
安东·马科夫,

9

我遇到了同样的问题。我所做的是在“ v21 / styles.xml”文件中将值更改为true:

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

至:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>

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

您将在values / styles / styles.xml(v21)中看到该行代码。删除它可以解决问题

链接到这个答案


5

我通过将Activity布局从FrameLayout更改为RelativeLayout来解决了我的问题。谢谢大家的帮助!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/transparent">

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

尝试使用层级查看器ViewInspector。这些工具可能会为您提供帮助。


5

只需从样式v21 @android:color / transparent中删除以下标记

这对我有用。


@android:color / transparent不是“标签”。它可能是样式属性的值,但不是“标签”。如果OP多次定义了该值怎么办?他应该删除哪一个?您的答案太笼统了。
受保护的会员

是的,我也是这样。.谢谢,Shindre!:)和@protectedmember您的意见-操作系统没有性别。
ZeroDivider

3

更好的方法

检查您的NoActionBar主题所在的style.xml文件。确保其父项为Theme.AppCompat.NoActionBar,并通过添加配色方案对其进行自定义。最后,根据需要在清单中设置主题。

以下是我的styles.xml文件(ActionBar + NoActionBar)的示例。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

2

对我来说,它通过执行以下操作起作用:

  1. 设定主题 .NoActionBar
  2. 将工具栏包裹在 android.support.design.widget.AppBarLayout
  3. android.support.design.widget.CoordinatorLayout作为家长的布局。

本质上,这是在状态栏中绘制状态栏的第三步,colorPrimaryDark否则,如果使用NoActionBar主题,则不会绘制状态栏。第二步将使您的工具栏覆盖


2

对于样式v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

对于样式v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

2

[输出]

从项目面板中展开res-> values-> styles目录。

打开styles.xml(v21)

从以下途径使用任何一个

  1. 在属性中将true更改为falseandroid:windowDrawsSystemBarBackgrounds
  2. 在属性中将@android:color / transparent更改为@ color / colorPrimaryDarkandroid:statusBarColor
  3. 删除android:statusBarColor属性线。

2

如果您的v21 / styles.xml包含

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

然后, 删除注释行下方或更改状态栏的颜色,

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

它的工作正常。希望这会有所帮助。谢谢。


2

我已经找到了解决方案-

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

将其添加到您的样式中,将适用于api 21或更高版本。


1

我不确定是否晚了,但希望对您有所帮助。*使用适合布局的透明背景制作假视图,并制作coordinatorlayout作为您的根布局元素。

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT


1

这对我有用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }

1
嗨,欢迎来到StackOverflow!您可以编辑答案以详细说明为什么该答案有效吗?您的代码的简短解释大有帮助!
Gigazelle

0

我的猜测是这是由您造成的android:windowBackground。是@color/background_material_light指白色吗?


不。绝对不是白色,但还是要谢谢!(您可以在上面看到白色图标。)
pt2121 2015年

我看错了你的问题。尝试替换<item name="android:statusBarColor">@android:color/transparent</item><item name="android:statusBarColor">@null</item>
汉斯派德,2015年

为了确保我理解正确,您是否要在状态栏后面显示图像?
汉斯派德,2015年

0

检查此工具栏是否变白-在滚动到屏幕之外后未绘制AppBar

https://code.google.com/p/android/issues/detail?id=178037#c19

我正在使用库23.0.0。而且错误仍然发生。

解决方法是添加几乎不占用空间且不可见的View。请参阅下面的结构。

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Stackoverflow.com上的“此问题”也涉及到此错误: 输入后,CoordinatorLayout工具栏不可见,直到全高 为止AppBarLayout-进入视图后,布局有时不可见(即使未输入)


这不是同一个错误。以我为例,活动结束后立即显示为白色,而不是在屏幕外滚动显示后为白色。总之还是谢谢你
pt2121

0

如果您使用的是RelativeLayout / CoordinatorLayout,这是对我有用的解决方案:

你必须用

  • 协调器布局
  • AppBarLayout

Rember使用CoordinatorLayout而不是RelativeLayout(性能更好,可以与AppBarLayout完美配合)

这就是片段的开始方式

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

好的编码!


0
 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

在样式中添加“ windowTranslucentStatus”项


0

在您的style.xml中添加它

<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

注意:API级别21以下不支持状态栏着色。


-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

在下面的java文件中添加这2行


1
欢迎使用堆栈溢出。您能否详细说明您的代码如何工作以及如何帮助解决OP问题?请参考如何写一个好的答案来改善答案
Tom M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.