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

Android导航框架中Toolbar溢出菜单视图返回Null的解决求助

解决Android Navigation中Toolbar溢出菜单导航失败的问题

问题根源

溢出菜单(showAsAction=never)的菜单项是动态生成在PopupWindow中的,并不属于Toolbar的子视图层级,所以通过binding.myToolbar.findViewById()或getActivity().findViewById()根本找不到对应的视图,自然无法通过这种方式获取NavController。

正确解决方案

直接使用Fragment自身关联的NavController即可,无需依赖菜单项视图,有两种常用实现方式:

方式一:通过onOptionsItemSelected处理

在你的Fragment中重写该方法,针对溢出菜单项直接导航:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.your_overflow_menu_id -> {
            // 构造跳转参数
            val args = YourArgsType() // 替换成你的参数实体
            val action = FragmentADirections.actionFragmentAToFragmentB(args)
            // 直接用Fragment的NavController导航
            findNavController().navigate(action)
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

方式二:在onCreateOptionsMenu中设置点击监听器

如果需要更灵活的监听时机,也可以在菜单创建时直接给溢出菜单项绑定点击逻辑:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.your_toolbar_menu, menu)
    // 找到溢出菜单项
    val overflowMenuItem = menu.findItem(R.id.your_overflow_menu_id)
    overflowMenuItem.setOnMenuItemClickListener {
        val args = YourArgsType()
        val action = FragmentADirections.actionFragmentAToFragmentB(args)
        findNavController().navigate(action)
        true
    }
}

补充说明

你之前用的Navigation.createNavigateOnClickListener()也可以直接用在溢出菜单项上,适合不需要自定义参数的场景:

overflowMenuItem.setOnMenuItemClickListener(
    Navigation.createNavigateOnClickListener(R.id.action_fragmentA_to_fragmentB)
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:48:46