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

我试图在状态栏后面绘制这样的视图: 期望的结果

我试图用推荐的技术来产生这种效果,但我得到这个:

实际结果

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

有趣的是,不知何故,导航抽屉pipe理状态栏后面:

在这里输入图像说明

我做的东西:

  • 使用支持库小部件 – CoordinatorLayoutAppBarLayoutToolbarDrawerLayout
  • 在我的应用主题中, windowTranslucentStatus设置为true
  • 在我的CoordinatorLayout fitsSystemWindows设置为true

这是我的应用程序主题:

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

我的活动布局中的FrameLayout被replace为这个片段布局:

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

Solutions Collecting From Web of "CoordinatorLayout即使使用windowTranslucentStatus和fitsSystemWindows也不会在状态栏后面绘制"

为将来的读者编辑:关于这个主题和评论的问题有很多很好的信息,请务必通读它们。

原来的答案:你的主题是错的,这就是为什么。 不幸的是,如何在Kitkat或棒棒糖中激活有不同之处。 在我的代码中,我使用了Java,但是如果你想使用资源树上的V21文件夹,你也可以用XML来实现它。 参数的名称将与Java相似。

从你的XML和Java中删除android:windowTranslucentStatus使用像这样:

  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); } 

那么你可以从你的activity中调用setTranslucentStatusBar(getWindow());

编辑:

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

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

下面是我的布局与android:fitsSystemWindows="true"对他们的所有视图:

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

所以我的build议是在你的XML上testing/尝试填充android:fitsSystemWindows="true"

这对我来说真是令人困惑,但是我最终还是把它看成是这样的:

 <android.support.v4.widget.SwipeRefreshLayout - **no fitsSystemWindow set** <android.support.design.widget.CoordinatorLayout- android:fitsSystemWindows="true" <android.support.design.widget.AppBarLayout - android:fitsSystemWindows="true" <android.support.design.widget.CollapsingToolbarLayout - android:fitsSystemWindows="true" <RelativeLayout - android:fitsSystemWindows="true" <ImageView - android:fitsSystemWindows="true" 

我还使用了Budius在我的应用中发布的方法来获取透明状态栏的工作方式:

从你的XML和Java中删除android:windowTranslucentStatus使用像这样:

  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); } 

如果我想绘制StatusBar,我使用CoordinatorLayout作为Activity的大部分父视图 (android:fitsSystemWindows =“false”)

如果我想要StatusBar是transmiss和simultanieousy kepping视图从隐藏在StatusBar后面我用作大多数父视图FrameLayout与参数

 <FrameLayout ... android:fitsSystemWindows="true"> </FrameLayout> 

我的styles.xml(v21)看起来像

 <resources> <style name="AppTheme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> <style name="AppTheme.NoStatusBar" parent="AppTheme.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="windowActionBarOverlay">true</item> <item name="android:windowActionBarOverlay">true</item> </style> </resources> 

styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> 

也许这里的关键是要确保你使用AppCompactActivity以及你使用Theme.AppCompact作为你的样式的根。

fitsSystemWindows将填充添加到视图的顶部,因此不会隐藏在状态栏下方。 删除fitsSystemWindows,它会在它后面。

为CoordinatorLayout设置负顶部边距为我工作。