导航组件:从片段导航到活动时如何清除返回堆栈?

4
请确保在将问题标记为重复之前阅读完整个问题。
我很清楚导航xml上的popUpto、popUpToInclusive和launchSingleTop属性,但它们在从片段导航到活动时(即使它们仍然出现在导航xml中)根本不起作用。我尝试了几十种不同的解决方案,过去3天一直在寻找答案!
告诉你们,到目前为止,这是唯一实际可行的解决方案:https://dev59.com/RLjna4cB1Zd3GeqP_X6B#59795636 但是解决方案本身非常丑陋,我不想自己实现它。重新启动相同的活动并在执行此操作时接受闪烁的黑屏看起来似乎不是一个选项。
我离一个好的工作解决方案最近的就是基于https://dev59.com/RLjna4cB1Zd3GeqP_X6B#63169732https://dev59.com/RLjna4cB1Zd3GeqP_X6B#63566415,但由于某些原因,将Intent.FLAG_ACTIVITY_CLEAR_TASK与Intent.FLAG_ACTIVITY_NEW_TASK的组合添加到一起会导致要创建/销毁/重新创建多次的目标活动(大约8次)。当在片段之间导航时,很容易实现。只是我提到的xml参数已经完成了工作。这里的问题来自我的头脑:D,从 FRAGMENT ACTIVITY
总结一下问题:我想使用导航组件从 FRAGMENT_Login (例如)完全清除后堆栈并转到 ACTIVITY_home 。有什么办法可以实现这一点吗?
到目前为止,我的代码大致如下: FRAGMENT ORIGIN
   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,则不会出现此问题,但也不会清除后退栈,因此当用户按下activity上的返回按钮时,会回到片段
我可以在原始片段上调用requireActivity().finish(),但这似乎也像是一种hack。我觉得我缺少的只是关于这些标志使用的某些详细信息...
非常感谢任何帮助! <3
1个回答

4

我解决了。以上示例正常运作,唯一的问题是需要删除ACTION相关的POPUPTOPOPUPTOINCLUSIVELAUNCHSINGLETOP属性,即使这些属性的值为“FALSE”也要删除。如果您只是在导航xml的设计中切换它们,它们仍然会存在并被切换为false。请删除它们

谢谢大家。


谢谢您的解决方案。您有没有想法如何在保留登录活动的同时删除 LoginActivity 中的所有片段返回堆栈?即当您返回 LoginActivity 时,它应该再次从 LoginActivity 的主目标开始。 - alierdogan7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接