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

时间:2015-09-06 21:57:10

标签: android android-support-library android-appcompat androiddesignsupport android-6.0-marshmallow

我在Marshmallow上尝试AppCompat。我希望有一个透明的状态栏,但它会变成白色。我尝试了几种解决方案,但它们对我不起作用(Transparent status bar not working with windowTranslucentNavigation="false"Lollipop : draw behind statusBar with its color set to 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>

enter image description here

26 个答案:

答案 0 :(得分:142)

我在此链接中找到了答案:Status Bar Color not changing with Relative Layout as root element

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

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

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

答案 1 :(得分:93)

(派对有点晚,但可能对某人有帮助)

我遇到了完全相同的问题。不知何故,有些活动是正常的,而我创建的新活动却显示白色状态栏而不是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",此解决方案对我无效。

在Lollipop和Marshmallow上进行测试

答案 2 :(得分:12)

 <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

答案 3 :(得分:9)

在尝试了以上所有方法失败后,我发现明确设置主题修复了问题。

setTheme(R.style.AppTheme);

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

答案 4 :(得分:7)

在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);

答案 5 :(得分:7)

只需将此项目放入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>

答案 6 :(得分:6)

我遇到了同样的问题。我所做的是,在&#34; v21 / styles.xml&#34;文件a更改了值true:

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

为:

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

答案 7 :(得分:4)

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

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

Link to this answer

答案 8 :(得分:4)

只需从样式v21中删除以下标记即可  @android:彩色/透明

这适合我。

答案 9 :(得分:3)

更好的方法

检查您的style.xml文件,其中包含NoActionBar主题。 确保其父级为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>

答案 10 :(得分:3)

您必须在样式上添加此属性才能查看内容

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>

答案 11 :(得分:2)

对我而言,它的工作原理如下:

  1. 设置主题.NoActionBar
  2. 将工具栏包裹在android.support.design.widget.AppBarLayout
  3. android.support.design.widget.CoordinatorLayout设为父布局。
  4. 基本上,这是在colorPrimaryDark中绘制状态栏的第三步,否则如果您使用NoActionBar主题则不会绘制状态栏。 第2步将为您的工具栏提供叠加

答案 12 :(得分:1)

我不确定是否会迟到但我希望它可以帮到某人。 *使用适合布局的透明背景制作假视图,并将coordinatorlayout作为根布局元素。

2016-10-30 17:26:10.429404 PHPProcessor Test[38190:2886757] verifying buffer from read_post: a=123&b=456
2016-10-30 17:26:10.429931 PHPProcessor Test[38190:2886757] resultString:

<pre>
GET: Array
(
)
POST: Array
(
)
SERVER: Array
(
    [SERVER_SOFTWARE] => PHPProcessor Test
    [REQUEST_TIME_FLOAT] => 1477862770.425
    [REQUEST_TIME] => 1477862770
    [argv] => Array
        (
        )

    [argc] => 0
)
ENV: Array
(
    [SHELL] => /bin/bash
    ...
)
</pre>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
...
<title>phpinfo()</title>
...
<body><div class="center">
<table>
<tr class="h"><td>
<a href="http://www.php.net/"><img border="0" src="data:image/png;base64,..." alt="PHP logo" /></a><h1 class="p">PHP Version 5.6.27</h1>
...
</table>
</div></body></html>

答案 13 :(得分:1)

对于样式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>

答案 14 :(得分: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);
        }

答案 15 :(得分:1)

如果您的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>

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

答案 16 :(得分:1)

我已经找到解决方法-

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

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

答案 17 :(得分:0)

onCreate内添加以下内容:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
       getWindow().setStatusBarColor(Color.WHITE);

及以下

 setContentView(R.layout.activity_main);

答案 18 :(得分:0)

将其添加到您的style.xml

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

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

答案 19 :(得分:0)

您想要这个权利吗?

尝试一下。在[值]-[style.xml]

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

您知道,与主题不匹配-父级

祝你好运

答案 20 :(得分: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”项

答案 21 :(得分:0)

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

您必须使用

  • 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"
    >
    ...

好的编码!

答案 22 :(得分:0)

[Output]

展开res - &gt;值 - &gt;项目面板中的样式目录。

打开styles.xml(v21)

从以下任何方式使用

  1. android:windowDrawsSystemBarBackgrounds属性中将 true 更改为 false
  2. @android:color / transparent 更改为android:statusBarColor属性中的 @ color / colorPrimaryDark
  3. 删除android:statusBarColor属性行。

答案 23 :(得分: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 Toolbar invisible on enter until full height AppBarLayout - Layout sometimes invisible once it enters view (even if it's not entered)

答案 24 :(得分:0)

我的猜测是,这是由@color/background_material_light造成的。 {{1}}是否是白色的引用?

答案 25 :(得分:-1)

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

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