当应用程序处于后台时片段实例消失

Fragment instance dissapear when app is in background

我有一个包含 DrawerLayout 和导航组件的应用程序。

Listener 是使用 NavigationItemSelectedListener 而不是 setupWithNavController 设置的,因为我想处理 Fragment 的实例而不是 recreating/replacing 一遍又一遍

当我在 片段 A 中按回键时,它使应用程序处于“后台模式”(这是正常的),当我 return 返回应用程序并从 FRAGMENT A TO FRAGMENT B 它破坏了 FRAGMENT A 和 VIEWMODEL,现在我无法获得执行 popBackStack() 的该片段的实例。

我注意到,当应用程序进入后台时,navController 的后台堆栈被清理,因此一旦我回到应用程序,我离开的片段 (片段 A) 将在我导航到另一个片段后被销毁,并且我无法取回该实例。

这变得非常困难,因为我只想处理片段的实例,但它只会创建一个新片段。一旦APP在后台,popbackStack就找不到旧的片段,所以我不知道我能做什么。

如果我在离开应用程序并重新进入并导航至 Fragment_B[= 后在导航图中设置从 Fragment_A 到 Fragment_B 的操作38=] 出现错误:action_fragmentA_to_fragmentB cannot be found from the current destination NavGraph

我只是在 片段 A 中有一个自定义的 onBackPressed 来让应用程序继续使用。

fun defaultOnBackPressed() {
    if (findNavController().popBackStack().not()) {
        requireActivity().moveTaskToBack(true)
    } else {
        findNavController().popBackStack()
    }
}

我该怎么办?

自从我尝试解决这个问题以来已经有 2 天了,但我无法解决如此复杂的问题,我认为应该很容易。我尝试了很多解决方案。欢迎索取任何代码。

您需要更改 if 语句。您在检查 if 语句时正在 调用 popBackstack() 函数,它会弹出。您可以将您的声明替换为:

fun defaultOnBackPressed() {
    if (requireActivity().supportFragmentManager.fragments.size() == 1) {
        requireActivity().moveTaskToBack(true)
    } else {
        findNavController().popBackStack()
    }
}

或者

fun defaultOnBackPressed() {
    if (requireActivity().supportFragmentManager.backStackEntryCount == 1) {
        requireActivity().moveTaskToBack(true)
    } else {
        findNavController().popBackStack()
    }
}