如何将状态栏背景颜色设置为colorPrimaryDark?

13

我有一个布局,以前可以根据colorPrimaryDark更新状态栏的背景颜色。

当布局的根布局是CoordinatorLayout时,这个功能很好用,但当我把它切换到LinearLayout时,状态栏的背景不再更新。

下面粘贴了布局的源代码和截图。还列出了一个正常工作的布局示例。

谢谢!

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".churches.ChurchesActivity">

    <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>
    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <FrameLayout
            android:id="@+id/contentFrame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.design.widget.CoordinatorLayout>

</LinearLayout>

样式.xml

<resources>

<!-- 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>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

样式-v21.xml

<resources>

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

状态栏不是colorPrimaryDark

状态栏不是colorPrimaryDark

状态栏是colorPrimaryDark

状态栏是colorPrimaryDark


展示你的style.xml。 - Niko Adrianus Yuwono
5个回答

18

当发布 styles-v21.xml 时,我发现 android:statusBarColor 被设置为透明:

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

将 android:statusBarColor 更改为 colorPrimaryDark 可以解决此问题。非常感谢!

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

不确定为什么在从CoordinatorLayout切换到LinearLayout后,statusBarColor变得重要起来。谢谢!


1
当CoordinatorLayout从系统窗口获得顶部插图时,它会绘制状态栏背景。默认情况下,它使用colorPrimaryDark作为可绘制对象进行绘制。 - Karakuri
不知道我该怎么解决这个问题!感谢您的澄清! - dazza5000

3
在设置内容视图之前,在Activity中尝试这个方法。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        getWindow().setStatusBarColor(getFactorColor(getResources().getColor(R.color.action_bar_color), 0.4f));
}

getFactorColor方法的位置

public static int getFactorColor(int color, float factor) {
    float[] hsv = new float[3];
    Color.colorToHSV(color, hsv);
    hsv[2] *= factor;
    color = Color.HSVToColor(hsv);
    return color;
}

0
尝试为您的线性布局添加android:fitsSystemWindows="true"属性并查看。

我尝试过这个,但是由于某些原因,当应用于LinearLayout时,android:fitsSystemWindows="true"没有像应用于CoordinateLayout时那样产生相同的效果。好建议!谢谢! - dazza5000
@Shiva,这不是正确的答案,设置android:fitsSystemWindows="true"只会使LinearLayout添加一些paddingTop,它不会使LinearLayout在状态栏上绘制颜色。 - neevek

0
在您的主题中添加<item name="android:navigationBarColor">?attr/colorPrimaryDark</item>或通过编程调用window.setNavigationBarColor(@ColorInt int color)。但请注意,navigationBarColor是自Android Lollipop(API 21)引入的,这意味着当API < 21时不支持navigationBarColor

-1

如果您在尝试了所有这些方法后仍然无法解决问题,那么只需清除缓存并重新启动项目即可,这肯定会起作用。


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