私はFragmentActivityとFragmentsを使用しています。
アプリケーションが起動すると:
FragmentActivity onCreate() <------
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onAttach()
Fragment onCreate() <------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
Fragment onResume()
すべてがOKで、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()
Fragment onCreate()は、FragmentActivity onCreate()の前に呼び出されます。なぜ矛盾しているのですか?
FragmentActivity onCreate()で、Fragment onCreate()が取得するいくつかのデータを生成します。その奇妙な動作のため、コードがFragment onCreate()からFragment onCreateView()に移動して、データが以前に生成されたことを確認する必要がありました。
FragmentStatePagerAdapterを使用してFragmentsを保持していますが、それが理由かもしれません。
フラグメントのライフサイクルで onActivityCreated()
を呼び出すまで、有効なアクティビティを当てにしないでください。
フラグメントのアクティビティが作成され、このフラグメントのビュー階層がインスタンス化されたときに呼び出されます。ビューの取得や状態の復元など、これらの要素が配置されたら、最終的な初期化を行うために使用できます。
再構築の順序が線形でない正確な理由は、私にはわかりません。厳密な順序を強制するよりも、各コンポーネントが独自のペースで再起動できるようにする方がおそらく効率的です。たとえば、私はLoaderManagerをできるだけ早く開始することを好み、そのコンテンツのレイアウトlaterについて心配します。
(私は良い図が大好きです。)
フラグメントは、アクティビティのonCreate()
中に復元されます。重要なことですが、それらは基本ActivityクラスのonCreate()
に復元されます。したがって、最初にsuper.onCreate()
を呼び出すと、フラグメントが復元された後、onCreate()
メソッドの残りすべてが実行されます。
可能な解決策の1つは、状態を復元するか、フラグメントが必要とするデータを計算することです[〜#〜] 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)" );
}