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

Activity中Toolbar溢出菜单点击无响应问题求助

Toolbar菜单项无响应问题解决(结合App Navigation)

问题原因

你的菜单项使用了app:actionLayout="@layout/custom_menu_layout",这个属性会让系统用自定义布局渲染菜单项,此时默认的菜单项点击事件会被自定义布局拦截,导致onOptionsItemSelected方法无法触发。

解决方案

方案1:给自定义布局绑定点击监听

在onCreateOptionsMenu中获取菜单项的自定义布局,为其设置点击事件,同时结合Navigation跳转目标Fragment:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    // 获取目标菜单项
    MenuItem refineItem = menu.findItem(R.id.navigation_refine);
    // 获取自定义布局实例
    View actionView = refineItem.getActionView();
    if (actionView != null) {
        // 设置点击监听
        actionView.setOnClickListener(v -> {
            // 获取NavController并跳转到目标Fragment
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
            navController.navigate(R.id.your_target_fragment_id); // 替换为你要打开的Fragment的id
        });
    }
    return true;
}

方案2:移除自定义布局(若无需自定义样式)

如果你的菜单项不需要自定义布局,直接删除app:actionLayout="@layout/custom_menu_layout",此时onOptionsItemSelected会正常触发,在方法内处理Navigation跳转:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if(item.getItemId() == R.id.navigation_refine){
        // 获取NavController并跳转到目标Fragment
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
        navController.navigate(R.id.your_target_fragment_id);
        return true; // 返回true表示已处理该事件,无需父类继续处理
    }
    return super.onOptionsItemSelected(item);
}

额外检查项

  • 确认mobile_navigation.xml中已添加目标Fragment的节点,且可通过id正常跳转;
  • 确保NavHostFragment的idR.id.nav_host_fragment_activity_main与布局文件中的配置完全一致。

内容的提问来源于stack exchange,提问作者Shivanshu Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:23:28