设置layout_gravity为start时NavigationView不显示的问题排查
问题原因与修复方案
你的布局不符合DrawerLayout的核心规则:它必须包含两个子视图:
- 第一个是占满整个屏幕的主内容区域(比如用
ConstraintLayout、LinearLayout或者Fragment容器) - 第二个才是侧边栏(即你的
NavigationView),通过android:layout_gravity="start"/end标记为抽屉
为什么会出现你遇到的情况?
- 当你只放
NavigationView并设置layout_gravity="start"时,DrawerLayout会把它识别为侧边抽屉,但因为没有主内容视图覆盖在抽屉上方,抽屉默认处于收起状态,自然看不到。 - 移除
layout_gravity属性后,NavigationView就变成了DrawerLayout的普通子View,按照布局规则居中显示,所以你能看到它。
修复后的布局代码示例
<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/idk" tools:openDrawer="start" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- 主内容视图:必须放在第一个位置 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 这里放你的主界面内容,比如Toolbar、页面内容等 --> </LinearLayout> <!-- 侧边抽屉:放在主视图之后 --> <com.google.android.material.navigation.NavigationView android:id="@+id/nav" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header" app:menu="@menu/mainmenu" /> </androidx.drawerlayout.widget.DrawerLayout>
另外,你还需要在代码里添加触发抽屉打开的逻辑(比如点击Toolbar的汉堡按钮),调用DrawerLayout.openDrawer(GravityCompat.START)就能打开侧边栏了。
内容的提问来源于stack exchange,提问作者Pavel Bernshtam
相关产品推荐
相关产品推荐

