7

我有一個活動,它託管來自支持庫的DrawerLayout和NavigationView。我正在爲導航視圖設置標題佈局,我希望導航標題高度爲「wrap_content」。所以當我將高度設置爲「wrap_content」時,頁眉佈局會放在狀態欄的後面。將狀態欄填充設置爲Android中的NavigationView

我想要的結果是導航抽屜應該在狀態欄後面繪製,但導航頭應該按下狀態欄高度。

下面是我所得到的截圖。注意狀態欄後面的「SIGN IN」按鈕。

screenshot

活動佈局

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

導航視野頭佈局

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

我已經通過StackOverflow上尋找一個解決方案,但無法找到它。所以有人請擺脫一些光。提前致謝。

+0

任何運氣上這個? – swooby

回答

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

機器人:fitsSystemWindows = 「假」

和CoordinatorLayout =>機器人:fitsSystemWindows = 「假」

+0

嗨,如果你能提供解決方案的更多解釋,這將是很好的。 (提示:人們也更可能接受您的解決方案;)) – bobylito

+7

這將導致抽屜被繪製在狀態欄的下方,這不是所需的行爲。 – SpaceBison

+0

@SpaceBison這*是所需的行爲。這也是*標準*行爲。問題是,op希望*按鈕*不會顯示在狀態欄的下面。例如,通過在其上添加填充。 –

6

一種可能的解決方案是使用dimens.xml

爲API頭19及以下:res/values /dimens.xml

<resources> 
    .... 

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

部首爲API 21和向上:RES/值-V21 /dimens.xml

<resources> 
    .... 

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

實施例報頭:RES/佈局 /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

這應該是被接受的答案。在API 21及更高版本上,可以在狀態欄上顯示導航抽屜,因此應在Sign In按鈕上考慮額外的頂部填充。但是因爲在API-21上,導航抽屜總是顯示在狀態欄的下面,所以不應該添加頂部填充。 – IRPdevelop

+0

不錯的解決方案,簡單而有效。 – Lancelot

+1

我不認爲這是一個足夠好的解決方案。首先,標準狀態欄高度是25dp而不是24dp。其次,這個解決方案不能覆蓋所有的設備情況,有些設備可能有不標準的高度狀態欄,甚至沒有狀態欄。 – Loyea