Android DialogFragment使用NavGraph导航报错原因排查
下面是几个可能的原因和对应的解决思路:
导航控制器获取错误
你大概率是误获取了宿主Fragment(FR_Game)的NavController,而非DialogFragment自身的。DialogFragment必须从自己的视图或弹窗窗口获取导航控制器,比如用Navigation.findNavController(requireView())。如果错误使用getActivity()?.findNavController(R.id.nav_host_fragment)或者宿主Fragment的视图来获取NavController,系统就会认为当前页面是FR_Game,自然找不到属于DialogFR_LevelEnd的导航Action。NavGraph中Action的归属错误
检查NavGraph配置,确认action_dialogFR_LevelEnd_to_FR_Menu这个Action是挂在DialogFR_LevelEnd这个Destination节点下,而非误挂到FR_Game下面。如果Action的父节点是FR_Game,从DialogFragment触发导航时,控制器就会找不到对应Action而报错。DialogFragment未通过导航框架启动
确保你的DialogFragment是通过NavGraph启动的,比如调用findNavController().navigate(R.id.DialogFR_LevelEnd),而不是直接用DialogFR_LevelEnd().show(getSupportFragmentManager(), "tag")这种手动弹窗的方式。如果是手动show的,DialogFragment没有和NavController绑定,导航时会默认使用宿主Fragment的上下文,导致识别错误的当前Destination。导航逻辑调用时机过早
要保证导航逻辑是在DialogFragment的onViewCreated方法之后执行的,比如按钮的点击事件要在视图初始化完成后再设置。如果在onCreateDialog里直接设置点击事件,此时DialogFragment的视图还没和导航控制器关联,会导致获取到错误的NavController。
内容的提问来源于stack exchange,提问作者VanessaF

