web-dev-qa-db-ja.com

回転後、onCreate()FragmentActivityの前にonCreate()Fragmentが呼び出されます

私は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を保持していますが、それが理由かもしれません。

55
AppiDevo

フラグメントのライフサイクルで onActivityCreated() を呼び出すまで、有効なアクティビティを当てにしないでください。

フラグメントのアクティビティが作成され、このフラグメントのビュー階層がインスタンス化されたときに呼び出されます。ビューの取得や状態の復元など、これらの要素が配置されたら、最終的な初期化を行うために使用できます。

再構築の順序が線形でない正確な理由は、私にはわかりません。厳密な順序を強制するよりも、各コンポーネントが独自のペースで再起動できるようにする方がおそらく効率的です。たとえば、私はLoaderManagerをできるだけ早く開始することを好み、そのコンテンツのレイアウトlaterについて心配します。

(私は良い図が大好きです。)

enter image description here

63
Sam

フラグメントは、アクティビティの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)" );
}
30
Adam