当我从片段A到B,然后从片段B回到A时,如何避免重新创建片段A



当我从片段B返回片段A时,我想避免重新创建片段。

点击流:A->B

后退按钮:B->A

(在这种情况下,片段A被重新创建如何保存片段A的状态。(

不清楚为什么需要在不再可见的片段的内存中保留实例;大概重建它很贵,所以你想保存它。

在大多数情况下,这是一种代码气味(但因为我不知道你的原因,也没有看到你的代码,我会给你怀疑的好处(:(

假设你有一个合理的理由,Android为Fragments提供了一种可以保留的机制:

直接来自Android的片段来源:

/**
* Control whether a fragment instance is retained across Activity
* re-creation (such as from a configuration change). If set, the fragment
* lifecycle will be slightly different when an activity is recreated:
* <ul>
* <li> {@link #onDestroy()} will not be called (but {@link #onDetach()} still
* will be, because the fragment is being detached from its current activity).
* <li> {@link #onCreate(Bundle)} will not be called since the fragment
* is not being re-created.
* <li> {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} <b>will</b>
* still be called.
* </ul>
*/
public void setRetainInstance(boolean retain) {

请记住这样做的含义,因为现在你的生命周期不同了,期待正常生命周期的所有副作用也不同了(以及保留片段对内存的影响(。

或者,考虑将片段的状态从中分离到ViewModel、Repository或Beyond™,并且让片段简单地被告知它的状态,这样它就可以在";快速";以及";高效的";方式(我引用这些是因为快速/高效在旁观者眼中,而且它仍然受安卓规则的约束…(。

现在,我还没有看到你如何"导航";以及你如何";返回";,所以你必须自己测试一下。最终,如果碎片管理器想要销毁你的碎片,这可能是因为它找不到保留它的理由(你可以保留一个硬引用,并处理所有浪费的内存……这就是为什么我建议你把"状态"放在Fragment之外,因为如果片段在onCreate中不包含2000行代码,创建一个片段并没有那么昂贵…(:(

假设您正在从一个类别片段转到另一个子类别片段。当事务像这样发生时,您必须将当前片段添加到后堆栈中-

val fragmentManager: FragmentManager? = fragmentManager
val fragmentTransaction: FragmentTransaction? = fragmentManager?.beginTransaction()
val fragment = SubCategoryFragment()
fragment.arguments = bundle
fragmentTransaction?.replace(R.id.container_fragment, fragment)
fragmentTransaction?.addToBackStack("category")
fragmentTransaction?.commit()

这里,行fragmentTransaction?.addToBackStack("category")将当前片段添加到后堆栈。

最后,你想从子类别回到类别片段,像下面这样做,

fragmentManager?.popBackStack()

它将回忆起以前的片段。

这段代码在kotlin中,但我认为您会理解变通方法。

最新更新