Android NavigationView (материальная поддержка lib) не взаимодействует со строкой состояния должным образом
Я следую примеру здесь, чтобы интегрировать новую библиотеку поддержки материалов NavigationView в мое приложение.
Мой общий макет выглядит следующим образом:
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
. У кого-нибудь есть идеи?
Ответы
Ответ 1
Вздох, я понял свою проблему. Была какая-то странная абстракция, которую мы используем, чтобы добавить ящик для отладки с правой стороны. В результате общая иерархия представлений выглядит так:
<DrawerLayout id="debug">
<LinearLayout id="debug_drawer" />
<DrawerLayout id="nav_drawer" fitsSystemWindows="true">
<NavigationView .... />
</DrawerLayout>
</DrawerLayout>
Итак, я вызывал DrawerLayout.setStatusBarColor
в неправильном ящике и устанавливал fitsSystemWindows
на неправильном ящике. В результате окно никогда не взаимодействует со строкой состояния: (
Ответ 2
Добавьте свои стили для 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
).
Ответ 3
Для каждого, кто борется с этим, ваш файл макета должен быть примерно таким:
<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.