使导航抽屉在状态栏后面绘制

我正在尝试创build一个Nav Drawer,就像材料规范中的一个(比如新的gmail应用程序)。 请注意导航抽屉的内容如何在状态栏后面绘制:

来自材料规格的示例

使用Chris Banes从这个问题的答案,我能够成功地使我的应用程序中的抽屉导航状态栏后面绘制; 这工作正常。 不工作的是在状态栏后面绘制导航抽屉的内容。 我想让抽屉中的蓝色图像显示在状态栏后面,但是该区域是用状态栏的颜色绘制的,如此屏幕截图所示。

我的应用程序

那么,如何让我的抽屉在状态栏后面的区域绘制? 我已经在下面发布了我的项目的相关部分。

包含导航抽屉的基本布局:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/warning_container" /> <FrameLayout android:id="@+id/navigation_drawer_fragment_container" android:layout_width="300dp" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="start"> <fragment android:id="@+id/navigation_drawer_fragment" android:name="com.thebluealliance.androidclient.fragments.NavigationDrawerFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/fragment_navigation_drawer" /> </FrameLayout> </android.support.v4.widget.DrawerLayout> 

我的活动的主题

 <style name="AppThemeNoActionBar" parent="AppTheme"> <item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> 

在我的活动的onCreate()中,我执行以下操作:

 mDrawerLayout.setStatusBarBackground(R.color.primary_dark); 

对于API 21+

 <style name="AppTheme" parent="android:Theme.Holo.NoActionBar.TranslucentDecor"> ... </style> 

对于API 19+

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowTranslucentStatus">true</item> </style> 

你的布局应该有android:fitsSystemWindows="false" (这是默认的)。


现在,既然你想切换半透明,你可以通过编程来实现:

 Window window = getWindow(); // Enable status bar translucency (requires API 19) window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Disable status bar translucency (requires API 19) window.getAttributes().flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Set a color (requires API 21) window.setStatusBarColor(Color.RED); 

我离开所有的SDK版本检查你:)


SS

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <include layout="@layout/toolbar" /> <!-- Main layout --> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <!-- Nav drawer --> <fragment android:id="@+id/fragment_drawer" android:name="com.example.DrawerFragment" android:layout_width="@dimen/drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" android:fitsSystemWindows="true" /> </android.support.v4.widget.DrawerLayout> 

值/的themes.xml

 <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@color/primary</item> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@color/textColorPrimary</item> </style> <style name="AppTheme" parent="AppTheme.Base"> </style> 

值-V19 /的themes.xml

 <style name="AppTheme" parent="AppTheme.Base"> <!--This makes the status bar transparent in KK and Lollipop--> <!--You do not need values-v21 and if you create them make sure you extend from this one--> <item name="android:windowTranslucentStatus">true</item> </style> 

如果你想改变状态栏的颜色(不同于透明的黑色),你将需要去自定义视图的另一种方法 ,因为mDrawerLayout.setStatusBarBackgroundColor(int)只会被激活,如果这DrawerLayout fitsSystemWindows( android:fitsSystemWindows="true" ),如果你这样做,它不会被绘制在状态栏的后面。

我发现在Android 5.0上做到这一点的最佳方式。 关键是使用ScrimInsetFrameLayout作为导航抽屉的根元素( DrawerLayout的第二个视图)。 这将使内容扩展到填充状态栏后面的空间。 要正确着色embedded,您可以在ScrimInsetFrameLayout上设置以下属性:

 app:insetForeground="#4000" 

另外,请确保在android:fitsSystemWindows="true"布局上有android:fitsSystemWindows="true"

ScrimInsetFrameLayout的源代码可以在这里find: https : //github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout的.java

在您的目录“values-v21”中,添加这些行:

 <style name="AppTheme" parent="BaseTheme"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowSharedElementsUseOverlay">false</item> </style> 

只需在values-v21中将这两个值添加到您的主题风格即可

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> .. <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> 

对于每个人都与半透明的状态栏结合navBar挣扎,但不愿意更改<style name="yourAppTheme" parent= to "android:Theme.Holo.NoActionBar.TranslucentDecor" ,只需在style.xml中添加这些行:

  <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowContentOverlay">@null</item>