Подтвердить что ты не робот

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. У кого-нибудь есть идеи?

4b9b3361

Ответ 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.