Android NavigationDrawer按状态栏重叠

Sno*_*olf 1 android statusbar navigation-drawer

我已经看到很多关于在导航栏上面设置半透明状态栏的问题,如下所示:

在此输入图像描述

但我想要实现的是拥有一个非半透明的状态栏,并使导航抽屉标题视图与操作栏的高度相同.这适用于前棒棒糖设备(API <21).但是对于API 21+,整个导航抽屉刚刚向上移动并与状态栏重叠,而不是位于状态栏下方.我能想到的唯一工作是手动设置layout_marginTopAPI 21+之后的设备的标题视图.有没有更好的解决方案来解决所有设备?

API <21:

在此输入图像描述

API> 21:

在此输入图像描述

styles.xml(V21):

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

DrawerLayout:

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="false"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

我试图设置fitsSystemWindows为两个truefalse.没有变化.

这是初始化导航抽屉时我的黑客解决方案(这也是@AkashBhave回答):

    LinearLayout navigationHeader = (LinearLayout) navigationView.getHeaderView(0);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        // This is make sure navigation header is below status bar
        // This only required for devices API >= 21
        LinearLayout.LayoutParams layoutParams =
                (LinearLayout.LayoutParams) navigationHeader.getLayoutParams();
        layoutParams.setMargins(0, getStatusBarHeight(), 0, 0);
        navigationHeader.setLayoutParams(layoutParams);
    }
Run Code Online (Sandbox Code Playgroud)

小智 7

添加 -> 在DrawerLayout

android:fitsSystemWindows="true"
Run Code Online (Sandbox Code Playgroud)

并在NavigationView

android:fitsSystemWindows="false"
Run Code Online (Sandbox Code Playgroud)


小智 5

确保不仅fitsSystemWindows设置在您的根元素中,还设置在您的根元素以及任何内容布局中.falseNavigationViewDrawerLayout

我在这个问题上挣扎了一段时间,直到我注意到android:fitsSystemWindows="true"在我的旧根布局元素中设置了一个,然后才将它包裹在内部DrawerLayout.

我删除了所有出现android:fitsSystemWindows的状态栏,并且状态栏也得到了API 21+的尊重.

<android.support.v4.widget.DrawerLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/drawer_layout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >

      <android.support.design.widget.CoordinatorLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.ImprintActivity">

        <android.support.design.widget.AppBarLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:theme="@style/AppTheme.AppBarOverlay">

          <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:theme="@style/AppTheme.Toolbar"
            app:titleTextAppearance="@style/Toolbar.TitleText"
            app:contentInsetStartWithNavigation="0dp"
            app:contentInsetStart="0dp"
            >

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

          </android.support.v7.widget.Toolbar>

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

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

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

      <android.support.design.widget.NavigationView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/navigation_view"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_gravity="start"
        app:headerLayout="@layout/navigation_view_header"
        app:menu="@menu/navigation_view_menu"
        android:background="@color/primary_light"
        />

    </android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)