59

FragmentActivityとFragmentsを使用しています。

アプリケーションの起動時:

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

すべて問題ありません。FragmentActivityonCreate()は、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を使用してフラグメントを保持していますが、それが理由でしょうか?

4

2 に答える 2

66

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

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

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

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

ここに画像の説明を入力

于 2012-12-30T18:42:29.270 に答える
32

フラグメントは、アクティビティのonCreate(). ただし、重要なのは、それらが基本の Activity クラスの で復元されることonCreate()です。したがって、最初に呼び出すと、フラグメントが復元された後にメソッドsuper.onCreate()の残りのすべてが実行されます。onCreate()

考えられる解決策の1つは、状態を復元するか、呼び出すにフラグメントが必要とするデータを計算することです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 に答える