在旋转之后,在onCreate()FragmentActivity之前调用onCreate()Fragment

时间:2012-12-30 18:36:36

标签: android android-fragments oncreate android-fragmentactivity android-support-library

我正在使用FragmentActivity和Fragments。

申请开始时:

FragmentActivity onCreate() <------
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onAttach()
Fragment onCreate() <------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
Fragment onResume()

一切正常,在Fragment onCreate()之前调用FragmentActivity onCreate()。 当我旋转时:

Fragment onPause()
FragmentActivity onPause()
Fragment onStop()
FragmentActivity onStop()
Fragment onDestroyView()
Fragment onDestroy()
Fragment onDetach()
FragmentActivity onDestroy()
---
Fragment onAttach()
Fragment onCreate() <----------
FragmentActivity onCreate() <---------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onResume()

在FragmentActivity onCreate()之前调用片段onCreate()。为什么它不一致?

在FragmentActivity onCreate()中,我生成一些Fragment onCreate()得到的数据。由于这种奇怪的行为,我不得不将我的代码从Fragment onCreate()移到Fragment onCreateView(),以确保我的数据之前已经生成过。

我正在使用FragmentStatePagerAdapter来保存碎片,也许这就是原因?

2 个答案:

答案 0 :(得分:63)

在片段生命周期中onActivityCreated()调用之前,您不应指望有效的活动。

  

在创建片段的活动并且实例化此片段的视图层次结构时调用。一旦这些部分就位,它可用于进行最终初始化,例如检索视图或恢复状态。

重建顺序不是线性的确切原因,我不能告诉你。允许每个组件按自己的进度重新启动而不是强制执行严格的订单可能更有效。例如,我更喜欢我的LoaderManager尽早启动,我们会担心它的内容以后的布局

(我喜欢一张好的图表。)

enter image description here

答案 1 :(得分:29)

片段在活动onCreate()期间恢复。但重要的是,它们将在基本Activity类的onCreate()中恢复。因此,如果您先调用super.onCreate(),那么onCreate()方法的所有其余部分都将在您的片段恢复后执行。

然后,一种可能的解决方案是恢复您的状态或计算您的片段所需的数据 BEFORE 您拨打super.onCreate()

生命周期如下:

ACTIVITY onCreate (pre-super)
FRAGMENT onAttach
ACTIVITY onCreate (post-super)

所以做这样的事情:

@Override
public void onCreate( final Bundle savedInstanceState )
{
    Log.d( TAG, "ACTIVITY onCreate (pre-super)" );
    // Do your processing here
    super.onCreate( savedInstanceState ); // Fragments will be restored here
    Log.d( TAG, "ACTIVITY onCreate (post-super)" );
}