Android Navigation Component多路径导航如何无需传参移除回退栈中X、Y页面
实现方案
方案1:XML静态配置(优先推荐)
无需额外代码和传参,直接在导航图XML中统一配置跳转规则即可:
- 所有跳转到Y的action统一添加配置:
app:popUpTo="@id/X" app:popUpToInclusive="true"
该配置会在从X跳转Y时直接将X移出回退栈,此时回退栈仅保留进入X前的页面+Y
- 所有Y跳转到R的action统一添加配置:
app:popUpTo="@id/Y" app:popUpToInclusive="true"
该配置会在从Y跳转R时直接将Y移出回退栈,最终回退栈仅保留进入X前的页面,按返回键会直接回到B/C/A,完全符合需求。
方案2:代码动态适配(适用于复杂跳转场景)
如果存在更灵活的跳转逻辑,可在Y跳转R时动态读取回退栈信息自动适配弹出规则,无需硬编码B/C的ID:
// Y页面跳转R时执行 val navController = findNavController() // 定位回退栈中X的位置 val xStackEntry = navController.backQueue.firstOrNull { it.destination.id == R.id.X } val popTargetId = xStackEntry?.let { xEntry -> val xIndex = navController.backQueue.indexOf(xEntry) // 取X前一个栈元素的ID作为弹出目标 if (xIndex > 0) navController.backQueue[xIndex - 1].destination.id else R.id.A } ?: R.id.A // 构建导航选项 val navOptions = NavOptions.Builder() .setPopUpTo(popTargetId, inclusive = false) .build() navController.navigate(R.id.action_Y_to_R, null, navOptions)
该方案会自动识别X之前的上游页面,自动调整回退栈弹出范围,不需要跨页面传递任何参数。
内容的提问来源于stack exchange,提问作者kkkkk
相关产品推荐
相关产品推荐

