Android Navigation跳转报错:IllegalArgumentException找不到对应action/destination
问题核心原因
错误日志已经明确说明:你调用导航跳转时,NavController的当前目的地是jobsFragment,而你使用的action_privSectionFragment_to_privsDetailFragment是仅属于PrivSectionFragment的跳转动作,jobsFragment的导航配置中没有对应id的动作,因此抛出非法参数异常。
排查&解决步骤
1. 先确认页面加载逻辑
你提供的jobsFragment界面截图包含「私营部门」「政府部门」两个Tab,首先确认你切换到私营部门Tab时的逻辑:
- 如果是直接在
jobsFragment内嵌套加载PrivSectionFragment作为子Fragment,没有通过Navigation组件执行跳转动作,那么NavController的当前目的地会一直是jobsFragment,自然找不到对应动作。
这种情况两种解决方式:- 方式一:给jobsFragment新增直达详情页的导航动作,在
my_nav.xml的jobsFragment标签内添加如下配置:
之后适配器跳转时直接调用<action android:id="@+id/action_jobsFragment_to_privsDetailFragment" app:destination="@id/privsDetailFragment" app:enterAnim="@anim/nav_default_enter_anim" app:exitAnim="@anim/nav_default_exit_anim" />JobsFragmentDirections.actionJobsFragmentToPrivsDetailFragment(priv_list[position])即可。 - 方式二:修改Tab切换逻辑,切换到私营部门时通过Navigation组件执行
action_jobsFragment_to_privSectionFragment2跳转,让PrivSectionFragment成为NavController的当前目的地。
- 方式一:给jobsFragment新增直达详情页的导航动作,在
2. 修正导航控制器获取方式
不要在RecyclerView适配器中通过itemView获取NavController,itemView属于父Fragment的视图树时,获取到的NavController会对应父页面。
推荐在PrivSectionFragment层处理跳转逻辑,给适配器设置点击回调:
// PrivSectionFragment 中初始化适配器 privListAdapter = PrivListAdapter(privList) { item -> val direction = PrivSectionFragmentDirections.actionPrivSectionFragmentToPrivsDetailFragment(item) findNavController().navigate(direction) } // 适配器代码中定义点击回调参数 class PrivListAdapter(val list: List<PrivListViewModel>, val onItemClick: (PrivListViewModel) -> Unit) : RecyclerView.Adapter<ViewHolder>() { // onBindViewHolder 中点击事件修改为 PushDownAnim.setPushDownAnimTo(holder.card_view) .setOnClickListener { onItemClick(priv_list[position]) } }
3. 检查Safe Args生成状态
如果修改过导航图后没有重新构建项目,可能出现Safe Args生成的类和实际配置不匹配的问题,执行Clean Project -> Rebuild Project之后再测试。
内容的提问来源于stack exchange,提问作者Abood
相关产品推荐
相关产品推荐

