使用NavController管理Fragment时如何从子Activity-e返回至Fragment-b
结论
该需求完全可以实现,核心逻辑是通过Intent携带跳转标识,通知托管NavController的宿主Activity执行对应导航操作即可。
具体实现方案
步骤1:修改Activity-e的返回逻辑,携带跳转参数
根据你的业务场景判断是否需要跳转到fragment-b,给父Intent新增标识参数:
val parentIntent = NavUtils.getParentActivityIntent(this) parentIntent!!.apply { flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT // isNeedJumpToB为你业务逻辑判断的布尔值,需要跳转到fragment-b时传true,常规返回fragment-a传false即可 putExtra("navigate_to_fragment_b", isNeedJumpToB) } startActivity(parentIntent) finish()
步骤2:在宿主Activity中接收参数,执行导航
因为你设置了FLAG_ACTIVITY_SINGLE_TOP等启动flag,宿主Activity不会重建,会回调onNewIntent方法,在该方法中接收参数调用NavController导航即可:
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent ?: return if (intent.getBooleanExtra("navigate_to_fragment_b", false)) { // 替换为你自己的NavHostFragment id和fragment-b对应的导航id findNavController(R.id.nav_host_fragment).navigate(R.id.fragment_b) // 用完移除参数,避免重复触发导航 intent.removeExtra("navigate_to_fragment_b") } }
兼容优化
如果存在宿主Activity被系统回收重建的场景,可以在onCreate中也添加相同的参数判断逻辑,避免跳转失效:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 原有初始化逻辑... if (intent.getBooleanExtra("navigate_to_fragment_b", false)) { findNavController(R.id.nav_host_fragment).navigate(R.id.fragment_b) intent.removeExtra("navigate_to_fragment_b") } }
注意事项
- 需确保导航图中已经配置了fragment-b的目的地,或者配置了对应全局跳转动作
- 如果需要跳转fragment-b后点击返回键回到fragment-a,可以在调用
navigate时配置popUpTo参数调整回退栈逻辑。
内容的提问来源于stack exchange,提问作者Howard
相关产品推荐
相关产品推荐

