Android导航框架中Toolbar溢出菜单视图返回Null的解决求助
问题根源
溢出菜单(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
相关产品推荐
相关产品推荐

