Fragment documentation显示了在onCreate(...)
中动态添加片段的活动示例:
if (savedInstanceState == null) {
// During initial setup, plug in the details fragment.
DetailsFragment details = new DetailsFragment();
details.setArguments(getIntent().getExtras());
getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
}
这个几乎对我有意义,除了一个细节。我认为检查savedInstanceState == null
的原因是如果正在重新创建活动,我们可以期望框架为我们重新添加片段。但是,我认为只有片段有标记时框架才会这样做,并且该示例使用不带标记的FragmentTransaction#add(...)
版本。据我了解,如果重新创建此活动,则不会有DetailsFragment
。
我的理解错了吗?如果框架重新添加了片段,那么在活动的生命周期的哪个阶段它可以保证这样做吗?
答案 0 :(得分:0)
我没有使用我的碎片标签,我的工作就好了,我和你一样完全相同的测试。
if (savedInstanceState == null) {
//fragment needs to be created
}
if (savedInstanceState != null) {
//fragment will automatically be there with no code
}
答案 1 :(得分:0)
我认为如果片段有标签,框架只会这样做[重新添加片段]
没有。根据“向活动添加片段”部分中的the documentation:
每个片段都需要一个唯一的标识符,如果重新启动活动,系统可以使用该标识符来恢复片段。
因此,您有3种可能性来处理此问题:使用unique id
,unique tag
或其中没有。是的,前两个要求都没有。添加tag
的目的是捕获片段。如果您想轻松检索并使用它(例如执行事务),这将非常有用。但是,不需要。
当您使用add(int, Fragment)
时,它会在第3个参数调用add(int, Fragment, String)
null tag
。因此,系统将使用容器视图的ID(add()
中的第一个参数)。因此,片段将在没有您提供但由系统正确处理的任何id
或tag
的情况下进行恢复。
注意:在add(int, Fragment, String)
的引用中,您可以看到这样的引用:“片段的可选标记名称,以便稍后使用FragmentManager.findFragmentByTag(String)
检索片段” - 如果它是可选的,如果我们需要它来恢复碎片吗? ;)
活动的生命周期中的哪一点确保已经这样做了?
我不能诚实地回答它,也许某人有正确的答案但是,这就是我的想法。
正如您在"Handling configuration changes"中所看到的,当活动发生方向(或任何特定更改)时,它会直接调用onDestroy()
并onCreate()
。在调用(activity's)onCreate()
时,子片段将在onAttach()
中收到回调。此外,当活动收到其onCreate()
回调时,子片段会自动收到onActivityCreated()
回调。之后,活动中的每个方法都会触发“完全”相同的子方法(onStart()
,onResume()
,onPause()
,onStop()
)。
因此,我认为安全点是onStart()
,因为activity直接触发了片段方法的调用,你确定片段是附加到它的,你可以处理onRestart() -> onStart()
来更新用户界面。