You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android导航抽屉实现带下拉子菜单的导航项问题求助

Android Navigation Drawer 实现点击父项展开子菜单

一、修正菜单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:18:33