Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我从片段A转到B,然后从片段B回到A时,如何避免重新创建片段A_Java_Android_Android Fragments_Fragment_Android Fragmentactivity - Fatal编程技术网

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

Java 当我从片段A转到B,然后从片段B回到A时,如何避免重新创建片段A,java,android,android-fragments,fragment,android-fragmentactivity,Java,Android,Android Fragments,Fragment,Android Fragmentactivity,当我从片段B返回到片段A时,我希望避免重新创建片段 单击流:A->B 后退按钮:B->A (在本例中,将重新创建片段A,以了解如何保存片段A的状态。)假设您从类别片段转到子类别片段。当事务像这样发生时,您必须将当前片段添加到后堆栈中- val fragmentManager: FragmentManager? = fragmentManager val fragmentTransaction: FragmentTransaction? = fragmentManager?.beginTr

当我从片段B返回到片段A时,我希望避免重新创建片段

单击流:
A->B

后退按钮:
B->A


(在本例中,将重新创建片段A,以了解如何保存片段A的状态。)

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

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中,但我认为您会理解解决方法。

不清楚为什么需要在内存中保留一个不再可见的片段实例;可能重新创建它的成本很高,所以您希望保存它

在大多数情况下,这是一种代码味道(但因为我不知道您的原因,也没有看过您的代码,所以我会毫不怀疑地告诉您):)

假设您对此有充分的理由,Android提供了一种保留机制:

直接来自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) {
/**
*控制是否跨活动保留片段实例
*重新创建(例如从配置更改)。如果设置了,则为片段
*重新创建活动时,生命周期将略有不同:
*
    *
  • {@link#onDestroy()}将不会被调用(但仍然是{@link#onDetach()}) *将是,因为片段正在从其当前活动中分离)。 *
  • {@link#onCreate(Bundle)}将不会被调用,因为片段 *没有被重新创建。 *
  • {@link#onAttach(Activity)}和{@link#onActivityCreated(Bundle)}将 *还是叫。 *
*/ 公共void setRetainInstance(布尔保留){
请记住这样做的含义,因为现在您的生命周期不同了,期待正常生命周期的所有副作用(以及保留片段对内存的影响)也不同了

可选地,考虑将片段的状态从它分离成VIEW模型、存储库或其他。™, 让片段简单地被告知它的状态,这样它就可以以“快速”和“高效”的方式被正确地重新创建。(我引用这些是因为快速/高效在旁观者的眼里,因为它仍然受Android规则的约束…)


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

您是否遵循任何体系结构组件?或使用fragment transaction fragment transaction。但在这种情况下,该片段仍将被销毁,不是吗?所有的backbackback添加都将保存事务,以便可以反向执行(例如,当您回击时)但与保留碎片的实例无关……我是否遗漏了什么?是的,在这种情况下,碎片也会被销毁。是的,你是对的,事实上,提问者真正想要的是什么并不清楚。我刚刚对最常见的情况给出了一个概括的答案。让我们看看其他人对此有何评论。此外,他可以阅读这篇文章-