CoordinatorLayout即使使用windowTranslucentStatus和fitsSystemWindows也不会在状态栏后面绘制

Jos*_*hua 25 android statusbar android-support-library material-design android-coordinatorlayout

我试图在状态栏后面绘制视图,如下所示: 期望的结果

我尝试用推荐的技术产生这种效果,但我明白了:

实际结果

从屏幕截图中可以清楚地看到,我的应用内容都没有被绘制在状态栏后面.

有趣的是,不知何故,Nav Drawer设法在状态栏后面绘制:

在此输入图像描述

我做的东西:

  • 使用支持库部件- ,CoordinatorLayout,,AppBarLayoutToolbarDrawerLayout
  • windowTranslucentStatus设置为true我的应用主题
  • fitsSystemWindows设置为true我的CoordinatorLayout

这是我的应用主题:

<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>
Run Code Online (Sandbox Code Playgroud)

这是我的活动布局:

<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>
Run Code Online (Sandbox Code Playgroud)

我的活动布局中的FrameLayout被替换为此片段布局:

<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>
Run Code Online (Sandbox Code Playgroud)

Bud*_*ius 28

为未来的读者编辑:关于这个主题和评论的问题也有很多很好的信息,请务必仔细阅读.

原答案: 你的主题是错的,这就是原因.不幸的是,在Kitkat或Lollipop中如何激活是有区别的.在我的代码中,我是用Java编写的,但如果你想V21在资源树上使用文件夹,你也可以用XML实现它.参数的名称与Java对应物的名称非常相似.

android:windowTranslucentStatus从您的XML中删除,并在Java中使用:

   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);
   }
Run Code Online (Sandbox Code Playgroud)

那么你可以从你的活动中打电话 setTranslucentStatusBar(getWindow());

编辑:

使状态栏半透明并在其后面绘制(出于某种原因,我无法理解)是Android中的两个单独任务.

我看了很多我的代码,我肯定android:fitsSystemWindows="true"在我的布局上有很多,而不仅仅是CoordinatorLayout.

下面是我布局android:fitsSystemWindows="true"上的所有视图:

  • CoordinatorLayout
  • AppBarLayout
  • CollapsingToolbarLayout
  • ImageView(带背景图片)
  • FrameLayout(带标题的内容)

所以我的建议是测试/尝试填写android:fitsSystemWindows="true"你的XML.

  • 我得到了它的工作!你是对的,我误解了'fitsSystemWindows`.它不会将视图扩展为"适合系统窗口",它实际上要求视图避免像状态栏那样的窗口装饰.我通过从所有东西中删除`fitsSystemWindows`来解决问题.在我的应用主题中将`windowsTranslucentStatus`设置为`true`就足以达到我想要的效果; `fitsSystemWindows`实际上干扰了这一点. (7认同)
  • 您的技术删除了状态栏的深色背景,但它仍然没有让我的 `CoordinatorLayout` 填充状态栏后面的区域。现在它看起来像这样:http://i.imgur.com/koMgcm0.png?1 (2认同)
  • 我的项目也是碎片,这不是原因.我猜你错误地解释了`fitSystemWindows`https://developer.android.com/reference/android/view/View.html#setFitsSystemWindows(boolean).试试看. (2认同)