android - 面向 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 上使用时如何设置状态栏背景颜色?
解决方案
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
.
When a drawer is open, an additional scrim covers the entire app behind the drawer, darkening the status bar even further to #FF183405
.
推荐阅读
- origen-sdk - 从修订控制中省略文件或目录?
- file - 在 Julia 中以未知的顺序同时写入或读取多个文件
- bash - 打印 bash 脚本中使用的所有变量
- java - 将 Spring Boot 应用程序部署到 Elastic Beanstalk 时出现 502 Bad Gateway
- python - 横河示波器的 Pyvisa 解码问题
- javascript - Azure JavaScript 函数输出到服务总线队列
- python-3.x - pyAlsaaudio 在 openSUSE 上安装
- .net - discord.net 如何转换为 IEmote
- c++ - Qt moveToThread 仅在第一次工作
- excel-formula - 如何在 Excel 中的多个单元格中广播一个值?