导航组件:从片段导航到 ACTIVITY 时如何清除返回堆栈?
Navigation Component: How to clear back stack WHEN NAVIGATING FROM FRAGMENT TO ACTIVITY?
请确保在将问题标记为重复之前阅读完整问题。
我很清楚导航上的 popUpto、popUpToInclusive 和 launchSingleTop 属性 xml。当从 FRAGMENT 导航到 ACTIVITY 时,它们只是 NOT 应用(即使它们仍然出现在导航中 xml)。我已经尝试了几十种不同的解决方案,并且在过去 3 天里我一直在寻找这个问题的答案!
让你们知道,这是目前 唯一 有效的解决方案:
但是解决方案本身太丑了,我不愿意自己实现。为我重新启动相同的 activity 并接受闪烁的黑屏似乎不是一个选择。
我从一个好的工作解决方案中得到的最接近的是 which is based on 但由于某种原因,当在目标 [=80= 上添加 Intent.FLAG_ACTIVITY_CLEAR_TASK
和 Intent.FLAG_ACTIVITY_NEW_TASK
的组合时] 是 created/destroyed/recreated 多次(大约 8 次)。在片段之间导航时很容易实现它。只是我上面提到的 xml 参数已经完成了工作。这里的问题是从 FRAGMENT 到 ACTIVITY 这让我很头疼 :D
总结问题:从FRAGMENT_Login(示例)到ACTIVITY_home[=时,我想完全清除后台堆栈59=] 使用 导航组件 。知道如何实现吗?
到目前为止,我的代码是这样的:
片段来源
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)
}
}
ACTIVITY 目的地:
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 多次成为 created/destroyed/recreated,根据我的测试,我认为这是我正在使用的这 2 个 Intent 标志的组合。如果我只使用 Intent.FLAG_ACTIVITY_CLEAR_TASK
或只使用 Intent.FLAG_ACTIVITY_NEW_TASK
那么我没有得到这个问题但也没有清除 backstack 所以当用户按下 activity 上的后退按钮时他被带回片段.
我可以只在原始片段上调用 requireActivity().finish()
但这似乎也是一种 hack。我觉得我所缺少的只是关于使用这些标志的一些细节......
任何帮助将不胜感激! <3
我成功了。上面的示例正常工作,唯一的问题是 REMOVE POPUPTO、POPUPTOINCLUSIVE 和LAUNCHSINGLETOP 来自与此 Fragment-Activity 转换相关的 ACTION 属性 即使这些属性的值为“FALSE” 。如果您只是使用导航设计 xml 将它们关闭,它们仍将存在并切换为 false。 删除它们。
谢谢大家
请确保在将问题标记为重复之前阅读完整问题。
我很清楚导航上的 popUpto、popUpToInclusive 和 launchSingleTop 属性 xml。当从 FRAGMENT 导航到 ACTIVITY 时,它们只是 NOT 应用(即使它们仍然出现在导航中 xml)。我已经尝试了几十种不同的解决方案,并且在过去 3 天里我一直在寻找这个问题的答案!
让你们知道,这是目前 唯一 有效的解决方案:
但是解决方案本身太丑了,我不愿意自己实现。为我重新启动相同的 activity 并接受闪烁的黑屏似乎不是一个选择。
我从一个好的工作解决方案中得到的最接近的是 Intent.FLAG_ACTIVITY_CLEAR_TASK
和 Intent.FLAG_ACTIVITY_NEW_TASK
的组合时] 是 created/destroyed/recreated 多次(大约 8 次)。在片段之间导航时很容易实现它。只是我上面提到的 xml 参数已经完成了工作。这里的问题是从 FRAGMENT 到 ACTIVITY 这让我很头疼 :D
总结问题:从FRAGMENT_Login(示例)到ACTIVITY_home[=时,我想完全清除后台堆栈59=] 使用 导航组件 。知道如何实现吗?
到目前为止,我的代码是这样的:
片段来源
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)
}
}
ACTIVITY 目的地:
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 多次成为 created/destroyed/recreated,根据我的测试,我认为这是我正在使用的这 2 个 Intent 标志的组合。如果我只使用 Intent.FLAG_ACTIVITY_CLEAR_TASK
或只使用 Intent.FLAG_ACTIVITY_NEW_TASK
那么我没有得到这个问题但也没有清除 backstack 所以当用户按下 activity 上的后退按钮时他被带回片段.
我可以只在原始片段上调用 requireActivity().finish()
但这似乎也是一种 hack。我觉得我所缺少的只是关于使用这些标志的一些细节......
任何帮助将不胜感激! <3
我成功了。上面的示例正常工作,唯一的问题是 REMOVE POPUPTO、POPUPTOINCLUSIVE 和LAUNCHSINGLETOP 来自与此 Fragment-Activity 转换相关的 ACTION 属性 即使这些属性的值为“FALSE” 。如果您只是使用导航设计 xml 将它们关闭,它们仍将存在并切换为 false。 删除它们。
谢谢大家