在导航抽屉中着色Android状态栏

在这个应用程序,我正在build设,我已经添加了一个导航抽屉片段到我的活动。 我使用5.0,所以我已经能够设置primaryColor和primaryColorDark获得正确的颜色。 我已经决定尝试将我的导航抽屉的样式与5.0中Google Now的抽屉非常相似,导航抽屉具有自己的状态栏背景。 (不能发布图片,没有足够的信誉>。>)

我已经在这里跟着这个问题的build议,这已经有所帮助了。 当我把它拉出来的时候,我已经实现了在状态栏下绘制我的Nav Drawer。 唯一的麻烦是,我不知道如何设置我的抽屉里显示的状态栏的颜色。 目前,它只是显示白色。

这里是我的风格和代码的相关位:

活动布局:

<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" tools:context=".Main" android:fitsSystemWindows="true"> <!-- main content --> ... <!-- Drawer fragment --> <fragment android:id="@+id/navigation_drawer" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" android:theme="@style/DrawerTheme" android:fitsSystemWindows="true" android:choiceMode="singleChoice" android:name="com.myname.appname.NavigationDrawerFragment" tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.DrawerLayout> 

片段布局:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/navDrawerFragment" android:theme="@style/DrawerTheme" android:background="@color/WindowBackground" tools:context=".NavigationDrawerFragment" android:fitsSystemWindows="true"> <!-- content here --> </RelativeLayout> 

根据上面的链接,为活动设置状态栏的颜色(此部分正常工作):

 public void onCreate(Bundled savedInstanceState) { super.onCreate(savedInstanceState); // .... drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.START); drawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); // .... } 

最后,我关联的活动样式,以及我已经“尝试”分配给片段的样式。

 <style name="StatusBarActivityTheme" parent="MyAppTheme"> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> <style name="DrawerTheme" parent="MyAppTheme"> <item name="android:statusBarColor">#000000</item> <item name="android:colorPrimaryDark">#000000</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> 

提前感谢您的帮助,您可以发送我的方式! 我怀疑我的问题与Google Now的主屏幕有一个透明的状态栏有关,并且只在导航抽屉中着色,但任何相反的消息都会很棒!

随着你的设置,导航抽屉只是一个视图绘制它的背景(你已经定义为android:background="@color/WindowBackground" )在状态栏下面(通过你的StatusBarActivityTheme设置为透明的颜色)。 系统只看到活动主题设置状态栏的颜色; 将android:statusBarColor分配给子项没有任何作用。

简单的解决scheme是将您的导航抽屉碎片布局的android:background更改为您所需的颜色 。 如果您希望图片下方的部分保持为白色,则可以使用android:background="@color/WindowBackground"或其他颜色在抽屉布局中添加空白视图。


如果您希望导览器中的内容扩展到状态栏的下方,则需要更多的工作。 开始偏移的原因是因为您将android:fitsSystemWindows属性设置为true,而该属性又调用视图的默认fitSystemWindows() 。 正如文档解释,此方法采用插入(即在我们的情况下的状态栏的高度),并将其作为视图的填充(在您的情况下,这成为您的导航抽屉片段的RelativeLayout的顶部填充)。

避免这种填充的一种方法是覆盖视图的fitSystemWindows()方法。 我指导你到Google的开源的IO Schedule应用程序 – 具体地说,他们使用ScrimInsetsScrollView作为其导航抽屉中的根元素。 这个修改后的ScrollView应用一个你select的颜色(通过自定义app:insetForeground设置app:insetForeground属性)的稀松布,并消耗插入,即没有更多的填充!

ScrimInsetsScrollView可以作为一个模型来为任何View子代编写自己的版本,真的 – 看到几乎相同的ScrimInsetsFrameLayout