何时重新添加动态添加的片段?

时间:2016-01-15 21:57:54

标签: android android-fragments

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

我的理解错了吗?如果框架重新添加了片段,那么在活动的生命周期的哪个阶段它可以保证这样做吗?

2 个答案:

答案 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 idunique tag其中没有。是的,前两个要求都没有。添加tag的目的是捕获片段。如果您想轻松检索并使用它(例如执行事务),这将非常有用。但是,不需要

当您使用add(int, Fragment)时,它会在第3个参数调用add(int, Fragment, String) null tag。因此,系统将使用容器视图的ID(add()中的第一个参数)。因此,片段将在没有您提供但由系统正确处理的任何idtag的情况下进行恢复。

注意:在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()来更新用户界面。