我知道在第一次使用片段时,应使用Fragment
创建FragmentTransaction
并将其添加到管理器中。但稍后可以在配置更改(例如屏幕旋转)后findFragmentById
或findFragmentbyTag
找到它。
但是在屏幕旋转时,我发现了片段onAttach
,onCreate
,onCreateView
,onStart
,{{1}的构造函数和所有回调方法即使从onResume
返回的片段没有明确地调用构造函数,也会再次调用它。
调用构造函数意味着片段对象可以被垃圾收集。然后片段的哪一部分实际存储在配置更改中?如果碎片对象被垃圾收集并重新创建,那么重新计算它的目的是什么?
答案 0 :(得分:2)
片段不会被回收。如果您在屏幕方向后记录Fragment.toString()
,则会得到一个不同的值,这意味着这些片段实例是不同的,从头开始创建。所有生命周期方法都称为 BUT ,您可以通过onSaveInstanceState(Bundle)
保留一些值。
对于您调用setRetainInstance(true)
的片段,情况并非如此。现在唯一重复的生命周期方法是onCreateView
,onViewCreated
,(长暂停),onDestroyView
。实例是相同的,保留了字段变量。
修改强>
在托管活动上调用onCreate之前,Android操作系统会自动销毁并创建片段并设置相同的标记和ID吗?
TL; DR:是的。
FragmentState
类字段变量包含有关始终保留的一个片段的信息(其中包括tag和id)。
当你旋转屏幕FragmentManagerImpl.restoreAllState(...)
被调用时,它会抓取保留的片段或实例化新片段并将它们重新连接到新活动。这是Activity.onCreate(Bundle)
的一部分。
然后片段的哪一部分实际存储在配置更改中?
如上所述的FragmentState
以及您或框架在onSaveInstanceState(Bundle)
中写入的任何内容。如果片段标记为保留,则保存除视图层次结构之外的所有内容。
如果片段对象被垃圾收集并重新创建,那么重新编写它的目的是什么?
如果它从头开始销毁和创建(新实例),它根本不会回收。您可以保留片段实例 - 同一个实例保持屏幕方向更改 - 或保存并恢复实例状态 - 销毁旧片段实例,创建新片段实例并填充旧实例中的一些数据。