【发布时间】:2021-07-13 00:02:16
【问题描述】:
在将其标记为重复之前,请务必阅读完整的问题。
我非常了解导航 xml 上的 popUpto、popUpToInclusive 和 launchSingleTop 属性。当从 FRAGMENT 导航到 ACTIVITY 时,它们只是 NOT 应用(即使它们仍然出现在导航 xml 中)。我已经尝试了几十种不同的解决方案,过去 3 天我一直在寻找这个问题的答案!
为了让你们知道,这是迄今为止真正有效的唯一解决方案:https://stackoverflow.com/a/59795636/6952763
但是解决方案本身太丑了,我不愿意自己实现。重新启动相同的活动并在为我执行此操作时接受闪烁的黑屏似乎不是一种选择。
我从一个好的工作解决方案中得到的最接近的是https://stackoverflow.com/a/63566415/6952763,它基于https://stackoverflow.com/a/63169732/6952763,但由于某种原因,当在要创建的目标活动上添加Intent.FLAG_ACTIVITY_CLEAR_TASK 和Intent.FLAG_ACTIVITY_NEW_TASK 的组合时/多次销毁/重新创建(大约 8 次)。在 Fragment 之间导航时很容易实现它。只是我上面提到的 xml 参数已经完成了工作。这里的问题是从 FRAGMENT 到 ACTIVITY,这让我很头疼:D
总结问题:我想在使用 Navigation Component 从 FRAGMENT_Login(示例)到 ACTIVITY_home 时完全清除后台堆栈。知道如何实现这一目标吗?
到目前为止,我的代码是这样的:
片段来源
private fun proceedToHome(user: UserEntity?){
if(user != null && user.id != 0L){
val direction = LoginFragmentDirections.actionLoginToMainHostActivity(user.id)
val extras = ActivityNavigator.Extras.Builder()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.build()
val navOptions = NavOptions.Builder()
.setLaunchSingleTop(true)
.build()
findNavController().navigate(direction.actionId, direction.arguments, navOptions, extras)
}
}
活动目的地:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mBinding = ActivityMainHostBinding.inflate(layoutInflater)
setContentView(mBinding.root)
navController = (supportFragmentManager.findFragmentById(R.id.activity_main_host_content) as NavHostFragment).navController
navController.setGraph(R.navigation.main_host_navigation, intent.extras)
mBinding.activityMainHostNavigationView.setupWithNavController(navController)
}
上面的代码导致 Activity 被多次创建/销毁/重新创建,根据我的测试,我认为这是我正在使用的这两个 Intent 标志的组合。如果我只使用Intent.FLAG_ACTIVITY_CLEAR_TASK 或只使用Intent.FLAG_ACTIVITY_NEW_TASK,那么我不会遇到问题,也不会清除后台堆栈,因此当用户按下活动上的后退按钮时,他会返回到 fragment.
我可以在原始片段上调用requireActivity().finish(),但这似乎也是一种黑客行为。我觉得我所缺少的只是关于使用这些标志的一些细节......
任何帮助将不胜感激!
【问题讨论】:
标签: kotlin android-activity android-navigation