【问题标题】:How to get the Status Bar background color to show colorPrimaryDark如何获取状态栏背景颜色以显示 colorPrimaryDark
【发布时间】:2018-09-09 12:54:28
【问题描述】:

我有一个用于根据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>

styles.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" />

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

【问题讨论】:

  • 向我们展示你的 style.xml

标签: android android-layout android-linearlayout android-coordinatorlayout android-notification-bar


【解决方案1】:

在发布 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 会起作用。谢谢!

【讨论】:

  • CoordinatorLayout 在系统窗口的顶部插入时绘制状态栏背景。默认情况下,它使用colorPrimaryDark 作为可绘制对象。
  • 不知道我是怎么想出来的!谢谢你的澄清!
【解决方案2】:

在设置内容视图之前在 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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我试过这个,但由于某种原因,android:fitsSystemWindows="true" 在应用于 LinearLayout 时的效果与应用于 CoordinateLayout 时的效果不同。好建议!谢谢!
    • @Shiva,这不是正确答案,设置android:fitsSystemWindows="true"只会让LinearLayout添加一些paddingTop,不会让LinearLayout在状态栏上绘制颜色。
    【解决方案4】:

    在您的主题中添加&lt;item name="android:navigationBarColor"&gt;?attr/colorPrimaryDark&lt;/item&gt; 或以编程方式调用window.setNavigationBarColor(@ColorInt int color)。但是请注意,navigationBarColor 是从 Android Lollipop(API 21) 开始引入的,这意味着当 API navigationBarColor。

    【讨论】:

      【解决方案5】:

      如果您在尝试了所有这些之后仍然无法通过。只需使缓存无效并重新启动项目。这肯定行得通。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 2015-06-01
        相关资源
        最近更新 更多