7

Ho un'attività che ospita DrawerLayout e NavigationView dalla libreria di supporto. Sto impostando un layout di intestazione per la visualizzazione di navigazione e voglio che l'altezza dell'intestazione di navigazione sia "wrap_content". Quindi quando imposto l'altezza su "wrap_content" il layout dell'intestazione va dietro la barra di stato.Impostazione del riempimento della barra di stato in NavigationView in Android

Il risultato che voglio è che il cassetto di navigazione debba disegnare dietro la barra di stato ma l'intestazione di navigazione deve essere spinta in basso dall'altezza della barra di stato.

Di seguito è riportato lo screenshot di ciò che sto ottenendo. Nota il pulsante "ACCEDI" andando dietro la barra di stato.

screenshot

layout di attività

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/nav_drawer" 
android:fitsSystemWindows="true"> 

<android.support.design.widget.CoordinatorLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"></android.support.v4.view.ViewPager> 
    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    <include layout="@layout/include_toolbar"/> 

     <android.support.design.widget.TabLayout 
      app:theme="@style/ThemeOverlay.AppCompat.Dark" 
      style="@style/MyCustomTabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/tabs" 
      /> 

    </android.support.design.widget.AppBarLayout> 

</android.support.design.widget.CoordinatorLayout> 

<android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    app:headerLayout="@layout/nav_header" 
    app:menu="@menu/menu_navigation" 
    android:fitsSystemWindows="true" 
    android:layout_gravity="start"/> 

</android.support.v4.widget.DrawerLayout> 

navigazione Visualizza Intestazione layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="?attr/colorPrimaryDark" 
      android:padding="16dp" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark" 
      android:orientation="vertical" 
      android:fitsSystemWindows="true" 
      android:gravity="bottom"> 

<TextView 
    android:visibility="gone" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/text_user_name" 
    android:textAppearance="@style/TextAppearance.AppCompat.Body1"/> 

<TextView 
    android:visibility="gone" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/text_email" 
    android:textAppearance="@style/TextAppearance.AppCompat.Body2"/> 

<Button 
    android:id="@+id/button_sign_in" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Sign In"/> 

</LinearLayout> 

Ho cercato attraverso StackOverflow per una soluzione, ma non riusciva a trovarlo. Quindi qualcuno per favore fa un po 'di luce. Grazie in anticipo.

+0

Qualunque fortuna Questo? – swooby

risposta

7
<android.support.design.widget.NavigationView 
android:id="@+id/navigation_view" 
android:layout_width="wrap_content" 
android:layout_height="match_parent" 
app:headerLayout="@layout/nav_header" 
app:menu="@menu/menu_navigation" 
android:fitsSystemWindows="false" 
android:layout_gravity="start"/> 

android: fitsSystemWindows = "false"

e CoordinatorLayout => android: fitsSystemWindows = "false"

+0

Ciao sarebbe bello se tu potessi fornire più spiegazioni sulla tua soluzione. (suggerimento: anche le persone sono più propense ad accettare la soluzione;)) – bobylito

+7

Ciò farà sì che il cassetto venga disegnato sotto la barra di stato, che non è il comportamento desiderato. – SpaceBison

+0

@SpaceBison Questo * è * il comportamento desiderato. Questo è anche il comportamento * standard *. Il punto è, op vuole che il * pulsante * non venga visualizzato sotto la barra di stato. Aggiungendo il riempimento su di esso, per esempio. –

6

Una possibile soluzione è quella di utilizzare dimens.xml:

intestazione per API 19 e seguenti: res/valori /dimens.xml

<resources> 
    .... 

    <dimen name="navigation_header_height">150dp</dimen> 
    <dimen name="navigation_header_top_padding">0dp</dimen> 
</resources> 

intestazione per API 21 e superiore: res/valori-V21 /dimens.xml intestazione

<resources> 
    .... 

    <dimen name="navigation_header_height">174dp</dimen> 
    <dimen name="navigation_header_top_padding">24dp</dimen> 
</resources> 

Esempio: res/la layout /nav_header.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="240dp" 
       android:layout_height="@dimen/navigation_header_height" 
       android:paddingTop="@dimen/navigation_header_top_padding" 
       android:background="@color/primary" 
       android:orientation="vertical"> 

    // Header's views goes here 
</LinearLayout> 
+0

Questa dovrebbe essere la risposta accettata. Su API 21 e versioni successive, il cassetto di navigazione può essere visualizzato sulla barra di stato, pertanto è necessario considerare un ulteriore riempimento superiore nel pulsante Accedi. Ma poiché su API -21 il cassetto di navigazione è sempre mostrato sotto la barra di stato, quella parte superiore non dovrebbe essere aggiunta. – IRPdevelop

+0

Bella soluzione, semplice ed efficace. – Lancelot

+1

Non penso sia una soluzione abbastanza buona. In primo luogo, l'altezza standard della barra di stato è 25dp non 24dp. In secondo luogo, questa soluzione non può coprire tutte le situazioni del dispositivo, alcuni dispositivi possono avere una barra di stato di altezza non standard o addirittura non avere alcuna barra di stato. – Loyea

Problemi correlati