Android NavigationView (материальная поддержка lib) не взаимодействует со строкой состояния должным образом

Я следую примеру отсюда, чтобы интегрировать навигационную панель новой библиотеки Material Design Support в мое приложение.

Мой общий макет выглядит следующим образом:

activity.xml

<android.support.v4.widget.DrawerLayout android:fitsSystemWindows="true"> <!-- main content --> <android.support.design.widget.NavigationView .. /> </android.support.v4.widget.DrawerLayout> 

themes.xml

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

MyActivity.java

 onCreate(..) { .. // This color can be different depending on some conditions. DrawerLayout.setStatusBarBackground(color); } 

Тем не менее, я продолжаю получать серые строки состояния, и NavigationView не рисует под строкой состояния. Я думаю, что серый индикатор состояния – это потому, что я не определял пользовательский colorPrimaryDark attr в теме. Однако я бы предположил, что DrawerLayout.setStatusBarBackground переопределит и установит цвет строки состояния. Я не могу найти много документации по новому NavigationView . У кого-нибудь есть идеи?

Solutions Collecting From Web of "Android NavigationView (материальная поддержка lib) не взаимодействует со строкой состояния должным образом"

Добавьте свои стили для API 21+ в значения-v21 / themes.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> </style> </resources> 

В activity.xml попробуйте установить android:fitsSystemWindows="true" в вашем NavigationView DrawerLayout (в дополнение к DrawerLayout ).

Для каждого, кто борется с этим, ваш файл макета должен быть примерно таким:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" 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_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/drawer_header" app:menu="@menu/menu_drawer"/> </android.support.v4.widget.DrawerLayout> 

Вы должны включить

 android:fitsSystemWindows="true" 

В DrawerLayout и в NavigationView.

Вздох, я понял свою проблему. Была какая-то странная абстракция, которую мы используем для добавления ящика для отладки с правой стороны. В результате общая иерархия представлений на самом деле выглядит так:

 <DrawerLayout id="debug"> <LinearLayout id="debug_drawer" /> <DrawerLayout id="nav_drawer" fitsSystemWindows="true"> <NavigationView .... /> </DrawerLayout> </DrawerLayout> 

Поэтому я вызывал DrawerLayout.setStatusBarColor на неправильном ящике и устанавливал fitsSystemWindows на неправильном ящике. В результате окно никогда не взаимодействует со строкой состояния 🙁