我在导航视图中有一个自定义视图。问题是无论采用哪种组合,fitsSystemWindows 都无法在NavigationView 中工作。并且抽屉中顶部的项目始终位于半透明状态栏后面。
主布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="start">
<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:background="@color/colorPrimaryBottomBar"
android:fitsSystemWindows="true">
<include layout="@layout/navigation_main_drawer" />
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
navigation_main_drawer
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:fillViewport="true"
android:fitsSystemWindows="true"
android:paddingBottom="@dimen/default_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
android:fitsSystemWindows="true"
android:orientation="vertical">
<LinearLayout
...
</LinearLayout>
<View
... />
<LinearLayout
...
</LinearLayout>
<View
... />
<LinearLayout
...
</LinearLayout>
<View
... />
</LinearLayout>
</ScrollView>
</android.support.design.widget.CoordinatorLayout>
所以,如果我理解正确的话,您希望自定义视图获得必要的填充,以便其内容不会被状态栏剪切,对吗?
如果是这种情况那么你需要设置
android:fitsSystemWindows="true"
在你的根DrawerLayout中,然后设置
android:fitsSystemWindows="false"
在您的 NavigationView 组件中。请注意,这是 false,不是 true :)
推理:
Google 设计的新 NavigationView 组件使用“fitsSystemWindows”属性来自定义其内容与状态栏的关系。请注意,这里的“自定义”是关键词,因为该特定组件的硬编码行为是其内容应与状态栏重叠并到达屏幕顶部,而状态栏本身应是透明的,以允许抽屉的内容被看透。这被指定为新 Material Design 的一部分,如 https://material.io/guidelines/patterns/navigation-drawer.html.
所示因此,禁用此行为的唯一方法是告诉 NavigationView not 发出 FitsSystemWindow 属性信号,并且仅在包含所有其他视图的根 DrawerLayout 中设置此属性,这将执行您所期望的操作并填充其所有子视图适当的看法。
请注意,Android 开发人员 Ian Lake 在一篇讨论此特定属性的博客文章中的此评论也证实了这一推理。
附注
我还会删除 navigation_main_drawer XML 中所有子元素中对“fitsSystemWindows”属性的所有提及,以防万一,尽管它可能没有任何效果..
好的,恭喜🥳🥳我找到了这个问题的解决方案!!!
这个解决方案
你的代码
<com.google.android.material.navigation.NavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/bg_left_nav"
android:fitsSystemWindows="true">
// your custom layout
</com.google.android.material.navigation.NavigationView>
但是这是错误的解决方案,因为如果您这样做,fitsSystemWindows 属性将不适用于您的自定义布局。
我必须改变这一点,这是工作,我取得了很好的成果。
<com.google.android.material.navigation.NavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/bg_left_nav"
android:fitsSystemWindows="true"
app:headerLayout="@layout/your_custom_layout" />