首页 > 解决方案 > 面向 API 28 (Android 9) 时,Android 半透明状态栏始终为灰色 fitSystemWindows

问题描述

从 API 21 开始,当样式包含<item name="android:windowTranslucentStatus">true</item>且布局包含android:fitsSystemWindows="true"时,状态栏变为半透明,并且抽屉布局(如导航抽屉)滑到状态栏后面。在以 API 28 为目标之前,状态栏的基本颜色将由colorPrimaryDark或设置android:statusBarColor。现在这些值被忽略了。

这个问题其实是浮出水面的com.android.support:design:27.1.0,但当时我以为是bug,继续使用com.android.support:design:27.0.2。随着对 API 28 的延续,这似乎是一个未记录的设计更改。fitsSystemWindows那么,在 API >= 28 上使用时如何设置状态栏背景颜色?

标签: androidstatusbar

解决方案


It turns out the answer to this question is that the base status bar color is now set by the background of the layout item that is set to fitsSystemWindows. That color is then darkened by the translucent status bar scrim. So, in my case, fitsSystemWindows is specified on a CoordinatorLayout inside of a DrawerLayout. Setting android:background on the CoordinatorLayout allows control of the base status bar color.

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent" >

    <!-- `android:fitsSystemWindows="true"` moves `root_coordinatorlayout` below the system status bar.
     When it is specified, the theme should include `<item name="android:windowTranslucentStatus">true</item>`.
     `android:background` sets the background color of the status bar, which is then overlaid with a scrim. -->
    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/root_coordinatorlayout"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.my.acivity"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:fitsSystemWindows="true"
        android:background="#FF64DD17" >

        <!-- The purpose of the `LinearLayout` is to place the included `main_webview` below `app_bar_layout`. -->
        <LinearLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:orientation="vertical" >

            <!-- The `AppBarLayout` theme has to be defined here because the activity uses a `NoActionBar` theme. -->
            <android.support.design.widget.AppBarLayout
                android:id="@+id/app_bar_layout"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:theme="@style/AppBarLight" >

                <android.support.v7.widget.Toolbar
                    android:id="@+id/app_bar"
                    android:layout_height="wrap_content"
                    android:layout_width="match_parent" />
            </android.support.design.widget.AppBarLayout>

            <!-- Include the main views. -->
            <include layout="@layout/main_views" />
        </LinearLayout>
    </android.support.design.widget.CoordinatorLayout>

    <!-- The left drawer. -->
    <android.support.design.widget.NavigationView
        android:id="@+id/navigationview"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_gravity="start"
        app:headerLayout="@layout/navigation_header"
        app:menu="@menu/webview_navigation_menu"
        app:itemIconTint="?attr/navigationIconTintColor" />

    <!-- Include the right drawer. -->
    <include layout="@layout/right_drawer" />

The scrim takes #FF64DD17 and darkens it to #FF3C850E.

Green status bar

When a drawer is open, an additional scrim covers the entire app behind the drawer, darkening the status bar even further to #FF183405.

Navigation drawer open


推荐阅读