【问题标题】:After the rotate, onCreate() Fragment is called before onCreate() FragmentActivity旋转后,onCreate() Fragment 在 onCreate() FragmentActivity 之前被调用
【发布时间】:2012-12-15 03:09:02
【问题描述】:

我正在使用 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,可能是这个原因?

【问题讨论】:

  • 那么,您的解决方案是什么?
  • @levi 用 onActivityCreated() Fragment 方法中的数据填充视图。或者重新考虑您的架构,在大多数情况下,您不必从主机活动中获取数据。如果您有带有动态数据的 ListView/RecyclerView,请使用 Loaders。那是我的最终解决方案,因为我在每个片段中都有 List。您还可以使用消息总线库(EventBus、Otto、...)来获得更简洁的架构。

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


【解决方案1】:

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

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

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

(我喜欢好的图表。)

【讨论】:

  • 由于错误,在 onActivityCreated() 中初始化 Loders 是安全的,而不是更早。 code.google.com/p/android/issues/detail?id=183783
  • 哇。我从来不知道该片段是通过contextonAttach() 与活动实例一起传递的,而活动的onCreate() 可能尚未被调用或完成!帮助我了解了我的应用中的几个奇怪问题。
【解决方案2】:

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

然后一种可能的解决方案是恢复您的状态或计算您的 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)" );
}

【讨论】:

  • 我非常感谢您的回答。整整两天都在寻找这样一个问题的答案
  • 值得一提的是,您可以在开发者设置中开启“Don't Keep Activities”,无需更改配置即可触发此行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2017-08-20
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多