gpt4 book ai didi

android - fragment 生命周期在导航上重叠

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:51:42 24 4
gpt4 key购买 nike

我有一个 Activity 应用程序,其中包含多个 Fragments,这些 Fragments 正在使用导航组件进行切换。当我在两个 fragment 之间切换时,它们的 onCreate()onDestroy() 方法似乎重叠。因此,当 fragment 访问相同的全局对象时,我很难为 fragment 编写初始化和清理代码。

Framgent_A 导航到 Fragment_B 的方法顺序如下:

Fragment_B.onCreate()
Fragment_A.onDestroy()

Fragment_A.onDestroy() 中,我反转了在 Fragment_A.onCreate() 中执行的操作。在 Fragment_B 中,我希望在调用 onCreate() 时事物处于中性状态。然而,情况并非如此,因为 Fragment_A.onDestroy() 尚未被调用。

重叠在 Android 上是否正常,还是我的导航组件配置有误?还有另一种方法可以实现我想要做的事情吗?我知道我可以将两个 Fragments 结合起来并使其工作,但我不希望任何一个 Fragment 相互了解。对我来说,当 Fragment_B 创建时 Framgnet_A 仍然存在,当 Fragment_B 应该替换 Fragment_A 时,这似乎很奇怪.

非常感谢任何帮助!


编辑:

在调试时仔细查看源代码后,我发现在 FragmentNavigator.navigate() FragmentTransaction.setReorderingAllowed() 中被调用,它允许重新排序操作,甚至允许在前一个 fragment 的 onDestroy() 之前调用新 fragment 的 onCreate()。问题仍然存在,在初始化下一个 fragment 中的相同全局状态之前,如何解决我在一个 fragment 中正确清理全局状态的问题。

最佳答案

Android Fragment 生命周期并不是真正适合您需求的回调宿主。导航 Controller 将用动画替换这两个 fragment ,因此两者在某种程度上同时可见,最终甚至在 onResume() 之后调用退出 fragment 的 onPause()进入的。

解决方案 1:使用 OnDestinationChangedListener

onDestinationChanged() 回调在任何生命周期事件之前被调用。作为一种非常简化的方法(注意泄漏),您可以执行以下操作:

    findNavController().addOnDestinationChangedListener { _, destination, _ ->
if(shouldCleanupFor(destination)) cleanup()
}

解决方案 2:抽象出全局变化

与其让单个导航点改变全局状态,不如让单个导航点改变全局状态。这可能是独立于导航层次结构的另一个 fragment 。然后像以前一样观察导航:

findNavController(R.id.nav_graph).addOnDestinationChangedListener { _, destination, _ ->
resetAll()
when(distination.id) {
R.id.fragment_a -> prepareForA()
R.id.fragment_b -> prepareForB()
else -> prepareDefault()
}
}

作为一个额外的优势,您还可以幂等地实现状态更改。

关于android - fragment 生命周期在导航上重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51157241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com