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

Android Navigation组件问题:Fragment导航提示View未设置NavController

解决Android Navigation组件“View does not have a NavController set.”错误

问题分析

底部导航功能正常,但RecyclerView点击跳转时触发该错误,核心原因是在Adapter回调中获取NavController的方式不正确:传递的view可能不属于NavHostFragment的视图层级,或者未正确关联到当前Fragment的导航控制器。

解决方案

方案1:在Fragment中提前获取NavController并传递给回调

在Workout Fragment的onViewCreated方法中先获取NavController,再传入Adapter的点击回调:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    // 提前获取当前Fragment的NavController
    val navController = findNavController()
    
    val adapter = ExerciseAdapter(data) {
        // 直接使用已获取的NavController进行导航
        navController.navigate(R.id.action_workoutsFragment_to_workoutDetails)
    }
    
    // 绑定RecyclerView的adapter...
}

方案2:通过Adapter的itemView直接查找NavController

修改Adapter的回调参数,传入点击的itemView,再通过它查找NavController:

  1. 调整Adapter的回调定义:
class ExerciseAdapter(
    private val data: List<YourDataType>,
    private val onItemClick: (View) -> Unit
) : RecyclerView.Adapter<ExerciseAdapter.ViewHolder>() {
    
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        init {
            itemView.setOnClickListener {
                // 传入点击的itemView
                onItemClick(it)
            }
        }
    }
    
    // 其他Adapter方法...
}
  1. 在Fragment中初始化Adapter时,通过itemView获取NavController:
val adapter = ExerciseAdapter(data) { itemView ->
    Navigation.findNavController(itemView).navigate(R.id.action_workoutsFragment_to_workoutDetails)
}

方案3:通过NavHostFragment的ID直接获取

如果上述方法仍无效,可以直接通过Activity中的NavHostFragment ID获取导航控制器:

val adapter = ExerciseAdapter(data) {
    val navHostFragment = requireActivity().supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
    navHostFragment.navController.navigate(R.id.action_workoutsFragment_to_workoutDetails)
}

额外检查项

  • 确认导航图nav_graph.xml中,action_workoutsFragment_to_workoutDetails的起点是workoutsFragment,终点是workoutDetails,且未配置错误的导航路径。
  • 确保Workout Fragment的视图是在onCreateView中正确返回的,且RecyclerView属于该Fragment的布局层级内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:23:11