59

我正在使用 FragmentActivity 和 Fragments。

应用程序启动时:

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

一切正常,FragmentActivity onCreate() 在 Fragment 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() 之前调用 Fragment onCreate()。为什么不一致?

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

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

4

2 回答 2

66

onActivityCreated()在 Fragment 的生命周期中调用之前,您不应指望有效的 Activity 。

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

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

(我喜欢好的图表。)

在此处输入图像描述

于 2012-12-30T18:42:29.270 回答
32

在 Activity 的onCreate(). 但重要的是,它们在基 Activity 类的onCreate(). 因此,如果您super.onCreate()先调用,则您的方法的所有其余部分onCreate()将在您的 Fragments 恢复后执行。

一种可能的解决方案是在调用之前恢复您的状态或计算您的 Fragment 需要的数据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)" );
}
于 2015-05-13T18:45:06.510 回答