17

Я следую примеру от here, чтобы интегрировать новую библиотеку поддержки дизайна материалов в NavigationView в мое приложение.Android NavigationView (материальная поддержка lib) не взаимодействует со строкой состояния должным образом

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

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

+0

вы уверены, что ваш '' NavigationView' имеет андроид: fitsSystemWindows = «истинный» 'слишком – xip

+0

я попытался добавить Аттрибут на' Navigat? ionView', но это не имело никакого эффекта. Строка состояния остается серым и непрозрачным. Это почти так, как будто 'android: windowDrawsSystemBarBackgrounds' ничего не делает, потому что' DrawerLayout.setStatusBarBackground' не меняет цвет строки состояния ... – Jin

+0

'DrawerLayout.setStatusBarBackBackground (color)' должен вызывать 'NotFoundException'. Вместо этого вы должны использовать 'DrawerLayout.setStatusBarBackgroundColor (color)'. Или это просто ошибка в вопросе? – xip

ответ

3

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

<DrawerLayout id="debug"> 

    <LinearLayout id="debug_drawer" /> 

    <DrawerLayout id="nav_drawer" fitsSystemWindows="true"> 

     <NavigationView .... /> 

    </DrawerLayout> 

</DrawerLayout> 

Так я звоню DrawerLayout.setStatusBarColor на неправильном ящик и установка fitsSystemWindows на неправильном ящике. В результате окно никогда не взаимодействует с строке состояния :(

7

Добавьте стили для 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).

+1

Я знаю, что это плохой стиль, но это не имеет значения, потому что в версиях до 21 версии непризнанные имена атрибутов будут просто проигнорированы. Поэтому перемещение стилей в -v21 ничего не меняет :( – Jin

4

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

<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

Смежные вопросы