Android Navigation组件问题:Fragment导航提示View未设置NavController
问题分析
底部导航功能正常,但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:
- 调整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方法... }
- 在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
相关产品推荐
相关产品推荐

