当前位置: 首页 > 知识库问答 >
问题:

了解片段的setRetainInstance(布尔)

乐正心水
2023-03-14

从文档开始:

public void setRetainInstance(布尔保留)

控制片段实例是否在activity重新创建过程中保留(例如从配置更改)。这只能与不在后堆栈中的碎片一起使用。如果设置,则在重新创建activity时,片段生命周期将略有不同:

  • 将不调用onDestroy()(但仍将调用onDetach(),因为该片段正在与其当前activity分离)。
  • 由于未重新创建片段,因此不会调用onCreate(Bundle)。
  • 仍将调用OnAttach(activity)和onActivityCreated(Bundle)。

我有些问题:

>

  • 片断是否也保留它的视图,还是在配置更改时重新创建它?“保留”到底是什么意思?

    当用户离开activity时,碎片会被销毁吗?

    为什么它对后面堆栈上的碎片不起作用?

    在哪些用例中使用这种方法是有意义的?

  • 共有1个答案

    朱自明
    2023-03-14

    首先,看看我关于保留片段的帖子。也许会有帮助。

    现在回答大家的问题:

    片断是否也保留其 视图 状态,还是在配置更改时重新创建它--什么是“保留”?

    是的,片段的状态将在整个配置更改过程中保留。具体地说,“保留”意味着片段不会在配置更改时被销毁。也就是说,片段将被保留,即使配置更改导致底层activity被破坏。

    当用户离开activity时,碎片会被销毁吗?

    就像activitys一样,片段s在内存资源不足时可能会被系统破坏。当您离开activity时,是否让片段在配置更改过程中保留其实例状态,对系统是否会破坏片段没有影响。如果您保留activity(即通过按home按钮),片段可能会被销毁,也可能不会被销毁。如果您通过按下后退按钮离开activity(因此调用finish()并有效地销毁activity),则所有activity附加的片段也将被销毁。

    为什么它对后面堆栈上的碎片不起作用?

    不支持它可能有多种原因,但对我来说最明显的原因是activity持有对FragmentManager的引用,而FragmentManager管理背栈。也就是说,无论您是否选择保留片段activity(因此FragmentManager的后座堆栈)都将在配置更改时被销毁。另一个可能不起作用的原因是,如果允许保留的片段和非保留的片段同时存在于同一个backstack上,事情可能会变得棘手。

    在哪些用例中使用这种方法是有意义的?

    保留的片段对于跨activity实例传播状态信息(特别是线程管理)非常有用。例如,片段可以充当threadasynctask实例的宿主,管理其操作。有关更多信息,请参阅我关于此主题的博客文章。

    通常,我将类似于使用onConfigurationChangedactivity...不要仅仅因为你懒得正确地实现/处理一个方向改变,就把它当作一个绷带。只有在需要的时候才用。

     类似资料:
    • 我使用的是支持片段,在片段中我设置了setRetainInstance(true)。我了解到,如果我们在片段中设置了setRetainInstance(true),那么在配置更改时不会调用片段的onCreate()和onDestroy()。但当我在samsung note3中更改字体样式时,仍然会重新创建活动,并调用fragment的onCreate()。这是配置更改吗?如果是,为什么片段实例被初

    • 在我的应用程序中,我使用了一个活动和两个片段。该应用程序使用带有容器的布局,因此片段是通过事务添加的。第一个片段包含列表视图,另一个片段包含列表视图项的详细视图。两个片段都使用setRetainInstance(true)。片段是通过替换事务添加的,并设置了addToBackStack(null)。列表片段包含一个实例变量,其中包含列表的一些信息。现在我正在切换到详细并按回,实例变量为null。我

    • 我已经使用Android ADT几个星期了,我曾经通过转到:文件来创建新活动 当我选择“新建空白活动”并单击“下一步”时,会显示一个我必须填写的新表格,标题为“片段布局名称”。为什么这突然出现,有谁知道为什么我被迫创建一个片段布局,因为我甚至不想使用它。我还记得我的一个朋友说他大约一周前更新了他的SDK,他说他有同样的问题。我是否应该在XML文档加载后删除其中的片段,或者有没有一种方法可以禁用它,

    • 我正在基于模板进行查看,但在某些区域我想输入片段。 模板:base。html 查看:列表。html 片段:片段/init.html 对于头部碎片,它可以正常工作。但在页脚中,但在页脚中,将显示模板的代码。 输出: 我希望你能帮助我。提前感谢。 使现代化 基础html 列表html init.html 输出: 我设法在页脚中包含代码片段,但我的目标是替换它。 解决方案:

    • 考虑下面的代码片段 在代码片段1中,方法m1()在抛出声明中有SQLExctive,但它实际上抛出了类型为的引用变量。我在这里期待编译器出错,因为

    • 主要活动: } 片段类 错误:java.lang.runtimeException:无法启动活动ComponentInfo{com.darkweb.android.chroma2018/com.darkweb.android.chroma2018.mainactivity}:Android.view.filflateException:二进制XML文件行#0:错误inflating类在Androi