Android Kotlin 使用NavHostFragment时如何获取上一个Fragment名称
判断Fragment跳转来源的实现方案
方案1:读取导航回退栈(你的原始思路)
实现代码
val navController = findNavController() // 回退栈至少包含2个条目时才存在上一级页面 if (navController.backQueue.size >= 2) { // 取倒数第二个条目即为上一个导航目的地 val prevDest = navController.backQueue[navController.backQueue.size - 2].destination // 两种判断方式:通过目的地ID / 标签 when (prevDest.id) { R.id.fragment_home -> { /* 从首页跳转来 */ } R.id.fragment_mine -> { /* 从个人页跳转来 */ } } // 如需获取类名可以取prevDest.label(需要在导航图中配置每个fragment的label) }
可靠性问题
- 仅适配单回退栈场景,如果你使用了底部导航多回退栈、嵌套导航等逻辑,回退栈的顺序可能不符合预期
- 强依赖导航图的ID配置,ID修改后代码需要同步修改,维护成本高
- 跨模块导航场景下,无法直接拿到其他模块的目的地ID常量,耦合度高
方案2:导航传参(官方推荐最优方案)
这个方案完全解耦,适配所有导航场景,推荐优先使用。
步骤1:在导航图中为当前Fragment配置来源参数
<fragment android:id="@+id/target_fragment" android:name="com.xxx.TargetFragment"> <!-- 定义来源参数,类型可按需选String/Int,建议搭配枚举使用 --> <argument android:name="page_source" app:argType="string" android:defaultValue="" /> </fragment>
步骤2:跳转时携带来源参数
推荐搭配Safe Args插件实现类型安全传参,示例如下:
// 从FragmentA跳转的场景 val action = FragmentADirections.actionFragmentAToTargetFragment(pageSource = "FragmentA") findNavController().navigate(action) // 不使用Safe Args的写法 val bundle = Bundle().apply { putString("page_source", "FragmentA") } findNavController().navigate(R.id.action_to_target_fragment, bundle)
步骤3:当前Fragment读取参数判断来源
// Safe Args 取值 val args: TargetFragmentArgs by navArgs() val source = args.pageSource // 普通取值 val source = arguments?.getString("page_source") ?: "" // 后续按来源处理对应逻辑
方案优势
- 不依赖回退栈结构,多栈导航、弹窗跳转、嵌套导航等所有场景都适用
- 逻辑清晰易维护,新增来源仅需传递对应标识即可
- 搭配Safe Args可实现类型安全,避免参数拼写、类型不匹配等问题
内容的提问来源于stack exchange,提问作者onesector
相关产品推荐
相关产品推荐

