47

我正在使用FragmentActivity和Fragments。旋轉之後,onCreate()片段在onCreate()之前調用片段活動

應用程序啓動時:

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

一切都OK,FragmentActivity的onCreate()片段的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() 

片段的onCreate()被FragmentActivity的onCreate之前稱爲()。爲什麼它不一致?

在FragmentActivity onCreate()我生成一些數據,片段onCreate()獲取。由於這種奇怪的行爲,我不得不將我的代碼從片段onCreate()移動到片段onCreateView(),以確保我的數據是以前生成的。

我正在使用FragmentStatePagerAdapter來保存碎片,也許這是原因?

+0

那麼,你是什麼r解決方案? – levi

+0

@levi用onActivityCreated()片段的方法填充數據。或者重新考慮你的架構,在大多數情況下,你不必從主機活動中獲取數據。如果您有帶動態數據的ListView/RecyclerView,請使用Loaders。這是我的最終解決方案,因爲我在每個片段中都有List。您還可以使用消息總線庫(EventBus,Otto,...)擁有更清潔的架構。 – AppiDevo

回答

56

在片段生命週期中調用onActivityCreated()之前,您不應該依賴有效活動。

當片段的活動已創建並且此片段的視圖層次被實例化時調用。一旦這些部分到位,它就可以用來進行最終的初始化,例如檢索視圖或恢復狀態。

重建順序不是線性的確切原因,我不能告訴你。允許每個組成部分按照自己的步調重新開始,而不是強制執行嚴格的命令可能更有效。例如,我更喜歡我的LoaderManager儘可能早地開始,我們擔心它的內容後面的佈局。

(我愛的好圖)

enter image description here

+0

甜美的圖表,真的很清楚,並把重點放在首位。 –

+0

不錯的關係圖,也是一個不錯的例子 – AshuKingSharma

+0

由於錯誤而不是早期,在onActivityCreated()中初始化Loders是安全的。 https://code.google.com/p/android/issues/detail?id=183783 – AppiDevo

25

的片段如在活動期間的onCreate()恢復。但重要的是,它們在基本Activity類的onCreate()中恢復。因此,如果您首先調用super.onCreate(),則在碎片恢復後,您的所有其餘的onCreate()方法都會執行。

那麼一個可能的解決方案是恢復狀態或計算是什麼都數據的片段的需要你叫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)"); 
} 
+3

我不能非常感謝你的答案。正在搜索整整兩天,爲這樣一個問題的答案 – user3213851

+3

你是一個英雄.... – Joakim

+1

Thankssss!在我看來,這應該是被接受的答案 – feresr

相關問題