我有一个Activity
具有多个应用程序Fragments
通过使用导航组件进行切换。当我在两个片段之间切换时onCreate()
and onDestroy()
方法似乎有重叠。因此,当片段访问相同的全局对象时,我很难编写初始化和清理片段的代码。
导航自Framgent_A
to Fragment_B
方法的顺序如下:
Fragment_B.onCreate()
Fragment_A.onDestroy()
In Fragment_A.onDestroy()
我反转我所做的操作Fragment_A.onCreate()
。并且在Fragment_B
我预计事情会处于中立状态onCreate()
叫做。然而事实并非如此,因为Fragment_A.onDestroy()
尚未被调用。
Android 上的重叠是否正常,还是我在导航组件中配置了错误?还有其他方法可以实现我想要做的事情吗?我知道我可以把两者结合起来Fragments
并使其工作,但我不希望任何一个片段相互了解。对我来说这似乎很奇怪Framgnet_A
还活着的时候Fragment_B
被创建,当Fragment_B
应该取代Fragment_A
.
任何帮助是极大的赞赏!
Edit:
在调试时浏览源代码后我发现FragmentNavigator.navigate()
FragmentTransaction.setReorderingAllowed() https://developer.android.com/reference/android/support/v4/app/FragmentTransaction#setreorderingallowed被调用,它允许重新排序操作,甚至允许onCreate()
之前要调用的新片段的onDestroy()
之前的。问题仍然存在,如何解决在下一个片段中初始化相同的全局状态之前正确清理一个片段中的全局状态的问题。
The Android Fragment
生命周期并不是真正适合您需求的回调主机。导航控制器将用动画替换这两个片段,因此两者在某种程度上同时可见,最终甚至onPause()
现有片段的调用之后onResume()
的进入者。
解决方案一:使用OnDestinationChangedListener
The onDestinationChanged()
回调在任何生命周期事件之前调用。作为一种非常简单的方法(注意泄漏),您可以执行以下操作:
findNavController().addOnDestinationChangedListener { _, destination, _ ->
if(shouldCleanupFor(destination)) cleanup()
}
解决方案 2:抽象出全局变化
与其让单个导航点改变全局状态,不如用一个单一的事实点来改变全局状态。这可能是独立于导航层次结构的另一个片段。然后像以前一样观察导航:
findNavController(R.id.nav_graph).addOnDestinationChangedListener { _, destination, _ ->
resetAll()
when(distination.id) {
R.id.fragment_a -> prepareForA()
R.id.fragment_b -> prepareForB()
else -> prepareDefault()
}
}
作为一个额外的优势,您还可以幂等地实现状态更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)