Android导航抽屉实现带下拉子菜单的导航项问题求助
一、修正菜单XML配置
你的原代码错误使用了ActionBar相关属性(actionLayout、showAsAction),这些属性不适用于Navigation Drawer的子菜单场景。Navigation Drawer原生支持通过嵌套<menu>标签实现下拉子菜单,只需调整配置如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:showIn="navigation_view"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_home" android:checkable="true" android:icon="@drawable/ic_outline_home_24" android:title="@string/home" /> <!-- 父项:移除ActionBar相关属性,设置checkable为false(仅作为展开按钮) --> <item android:id="@+id/nav_products" android:checkable="false" android:visible="true" android:icon="@drawable/ic_outline_shopping_bag_24" android:title="@string/products" > <menu> <item android:id="@+id/fire_alam" android:title="@string/fire_alarms" android:checkable="true" /> <item android:id="@+id/fire_fighting" android:checkable="true" android:title="@string/fire_fighting"/> </menu> </item> <item android:id="@+id/nav_serv" android:checkable="true" android:icon="@drawable/ic_outline_room_service_24" android:title="@string/services" /> </group> </menu>
二、处理NavigationView点击事件
在Activity或Fragment中,设置NavigationView的选择监听器,区分父项和子项的点击逻辑:
Kotlin 示例
val navigationView = findViewById<NavigationView>(R.id.nav_view) navigationView.setNavigationItemSelectedListener { menuItem -> when(menuItem.itemId) { R.id.nav_home -> { // 处理首页跳转逻辑 true } R.id.nav_products -> { // 切换子菜单的展开/收起状态 menuItem.isChecked = false menuItem.submenu?.let { subMenu -> subMenu.isVisible = !subMenu.isVisible } true } R.id.fire_alam -> { // 处理火灾报警器页面跳转 true } R.id.fire_fighting -> { // 处理消防设备页面跳转 true } R.id.nav_serv -> { // 处理服务页面跳转 true } else -> false } }
Java 示例
NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.nav_home: // 处理首页跳转逻辑 return true; case R.id.nav_products: // 切换子菜单的展开/收起状态 menuItem.setChecked(false); SubMenu subMenu = menuItem.getSubMenu(); if (subMenu != null) { subMenu.setVisible(!subMenu.isVisible()); } return true; case R.id.fire_alam: // 处理火灾报警器页面跳转 return true; case R.id.fire_fighting: // 处理消防设备页面跳转 return true; case R.id.nav_serv: // 处理服务页面跳转 return true; default: return false; } } });
关键说明
- 父项(nav_products)设置
android:checkable="false",避免它被选中,仅作为展开子菜单的触发按钮。 - 嵌套的
<menu>标签会自动作为子菜单存在,通过代码控制其可见性实现展开/收起效果。 - 若无需手动控制展开逻辑,NavigationView默认会在点击父项时自动展开子菜单,此时只需处理子项的跳转逻辑即可。
内容的提问来源于stack exchange,提问作者Youssef Reda
相关产品推荐
相关产品推荐

