17

Sto seguendo l'esempio da here per integrare la nuova libreria di supporto per la progettazione dei materiali NavigationView nella mia app.Android NavigationView (supporto materiale lib) non interagisce correttamente con la barra di stato

mio layout generale si presenta così:

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); 
} 

Tuttavia, continuo a ricevere un grigio barra di stato e il NavigationView non disegna sotto la barra di stato. Penso che la barra di stato grigia sia perché non ho definito un oggetto personalizzato colorPrimaryDark attr nel tema. Tuttavia, supponevo che DrawerLayout.setStatusBarBackground sovrascriva e imposta il colore della barra di stato. Non riesco a trovare molta documentazione sul nuovo NavigationView. Qualcuno ha qualche idea?

+0

Sei sicuro il vostro '' NavigationView' ha Android: fitsSystemWindows = "true" 'troppo – xip

+0

ho provato ad aggiungere l'attr su' Navigat? ionView' ma non ha avuto alcun effetto. La barra di stato rimane grigia e non trasparente. È quasi come se 'android: windowDrawsSystemBarBackgrounds' non stia facendo nulla perché 'DrawerLayout.setStatusBarBackground' non sta cambiando il colore della barra di stato ... – Jin

+0

' DrawerLayout.setStatusBarBackground (color) 'dovrebbe lanciare un' NotFoundException'. Dovresti invece usare 'DrawerLayout.setStatusBarBackgroundColor (color)'. O è solo un errore nella domanda? – xip

risposta

3

Sigh, ho capito il mio problema. C'era una strana astrazione che usiamo per aggiungere un cassetto per il debug sul lato destro. Di conseguenza, la gerarchia complessiva vista si presenta come questo

<DrawerLayout id="debug"> 

    <LinearLayout id="debug_drawer" /> 

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

     <NavigationView .... /> 

    </DrawerLayout> 

</DrawerLayout> 

Così mi stava chiamando DrawerLayout.setStatusBarColor sul cassetto sbagliata e l'impostazione fitsSystemWindows sul cassetto sbagliato. Di conseguenza, la finestra non interagisce con la barra di stato :(

7

Aggiungi la tua stili di API 21+ nei valori-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> 

In activity.xml, provare a impostare android:fitsSystemWindows="true" sul NavigationView (in aggiunta al DrawerLayout).

+1

So che è uno stile pessimo, ma non importa perché sulle versioni precedenti alla 21 i nomi degli attributi non riconosciuti saranno semplicemente ignorati, quindi spostare gli stili su -v21 non cambia nulla :( – Jin

4

Per ognuno alle prese con questo, il file di layout dovrebbe essere qualcosa di simile:

<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> 

Bisogna includere

android:fitsSystemWindows="true" 
.

nel DrawerLayout e nel NavigationView