即使使用 windowTranslucentStatus 和 fitsSystemWindows CoordinatorLayout 也不会在状态栏后面绘制 [英] CoordinatorLayout not drawing behind status bar even with windowTranslucentStatus and fitsSystemWindows
问题描述
我试图像这样在状态栏后面绘制视图:
I am trying to draw views behind the status bar like this:
我试图用推荐的技术产生这种效果,但我得到了这个:
I tried to produce this effect with the recommended techniques, but I get this:
从屏幕截图中可以清楚地看出,我的应用内容没有被绘制在状态栏后面.
It's clear from the screenshot that none of my app content is being drawn behind the status bar.
有趣的是,不知何故,导航抽屉设法在状态栏后面绘制:
What's interesting is that somehow, the Nav Drawer manages to draw behind the status bar:
我做过的事情:
- 使用支持库小部件 -
CoordinatorLayout
、AppBarLayout
、Toolbar
、DrawerLayout
windowTranslucentStatus
在我的应用主题中设置为true
fitsSystemWindows
在我的CoordinatorLayout
上设置为
true
- Use support library widgets -
CoordinatorLayout
,AppBarLayout
,Toolbar
,DrawerLayout
windowTranslucentStatus
set totrue
in my app themefitsSystemWindows
set totrue
on myCoordinatorLayout
这是我的应用主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
这是我的活动布局:
<android.support.v4.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<FrameLayout android:id="@+id/page_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"/>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
我的activity布局中的FrameLayout被这个fragment布局替换了:
The FrameLayout in my activity layout is replaced with this fragment layout:
<android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="@android:color/holo_blue_bright"
tools:context=".MainActivity">
<TextView android:text="@string/lorem_ipsum"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:elevation="0dp"
android:theme="@style/AppTheme.TransparentAppBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@android:color/transparent"
app:title="@string/hello_blank_fragment"
app:popupTheme="@style/AppTheme.OverflowMenu" />
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
推荐答案
为未来读者有很多关于该主题的好信息,评论中也有问题,请务必阅读通过他们.
edit for future readers: there's a lot of good information on the subject and the issue on the comments too, make sure to read through them.
原始答案:你的主题是错误的,这就是原因.不幸的是,在 Kitkat 或 Lollipop 中如何激活存在差异.在我的代码中,我是用 Java 实现的,但如果您想使用资源树上的 V21
文件夹,也可以用 XML 实现它.参数的名称将与 Java 对应的名称非常相似.
original answer:
Your theme is wrong, that's why.
Unfortunately, there're differences on how to activate in in Kitkat or Lollipop. On my code I did it in Java, but you can also achieve it in XML if you want to play with the V21
folders on your resources tree. The name of the parameters will be very similar to the Java counterparts.
从您的 XML 中删除 android:windowTranslucentStatus
并在 Java 中像这样使用:
Delete the android:windowTranslucentStatus
from your XML and in Java use like that:
public static void setTranslucentStatusBar(Window window) {
if (window == null) return;
int sdkInt = Build.VERSION.SDK_INT;
if (sdkInt >= Build.VERSION_CODES.LOLLIPOP) {
setTranslucentStatusBarLollipop(window);
} else if (sdkInt >= Build.VERSION_CODES.KITKAT) {
setTranslucentStatusBarKiKat(window);
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static void setTranslucentStatusBarLollipop(Window window) {
window.setStatusBarColor(
window.getContext()
.getResources()
.getColor(R.color. / add here your translucent color code /));
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static void setTranslucentStatusBarKiKat(Window window) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
然后你可以从你的活动中调用 setTranslucentStatusBar(getWindow());
then you can call from your activity setTranslucentStatusBar(getWindow());
使状态栏半透明并在其后面绘制(出于某种原因我无法理解)是 Android 中的两个独立任务.
making the status bar translucent and drawing behind it (for some reason I cannot understand) are two separate tasks in Android.
我查看了更多代码,我确信我的布局中有很多 android:fitsSystemWindows="true"
而不仅仅是 CoordinatorLayout
.
I've looked more on my code and I'm for sure have A LOT more android:fitsSystemWindows="true"
on my layout than just the CoordinatorLayout
.
下面是我的布局上所有带有 android:fitsSystemWindows="true"
的视图:
below are all the Views on my layout with android:fitsSystemWindows="true"
on them:
- 协调器布局
- AppBarLayout
- CollapsingToolbarLayout
- ImageView(带有背景图片)
- FrameLayout(带有标题的内容)
所以我的建议是在您的 XML 上测试/尝试填充 android:fitsSystemWindows="true"
.
so my suggestion is to just test/try filling up android:fitsSystemWindows="true"
on your XML.
这篇关于即使使用 windowTranslucentStatus 和 fitsSystemWindows CoordinatorLayout 也不会在状态栏后面绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!