2012-11-24 59 views
6

無論何時向用戶顯示片段,我都需要執行一些代碼。Android碎片:生命週期方法*總是*在顯示碎片時調用?

通過API查看我可以看到的最接近的鉤子方法是onResume。但是,通過我的代碼進行調試,似乎onResume是而不是,當用戶選擇後退按鈕以返回到先前顯示的片段時調用。

只是爲了澄清我看到的行爲:

我有一個「父」的活動,其配置選項卡中的動作條...和2個片段F1和F2。

用戶選擇一個選項卡並將F1加載到活動中。在按下按鈕時,用戶可以導航到F2。這不是一個單獨的選項卡... F2被換入佈局。

添加日誌語句,我可以看到,當用戶選擇在F2的後退按鈕時,會發生以下情況....

1)的onPause()被調用上F2。 2)將F1加載到活動中...但F1上的onResume()爲不叫

此時日誌中沒有錯誤。

任何想法我在做什麼錯在這裏?

在此先感謝,

尼爾。

+0

你應該總是發佈你的相關代碼,以便我們看到發生了什麼。你是否將每個片段添加到後端堆棧? – Sam

+0

謝謝薩姆。在編輯我的問題並添加代碼時,我注意到我的錯誤出現在我的片段切換代碼中。我已經添加了一個答案解釋。乾杯。 – Neil

回答

9

好吧,看來這一次是飛行員的錯誤。我原來的代碼在活動中切換片段是...

public void switchFragment(Fragment newFragment, String tag) { 
    getSupportFragmentManager() 
      .beginTransaction() 
      .add(android.R.id.content, newFragment) 
      .addToBackStack(tag) 
      .commit(); 
} 

在上面的代碼中調用add()實際上應該是replace()。似乎不會用後退按鈕行爲替換活動混亂中的片段。

必須誠實並承認我不是100%確定爲什麼發生這種情況。但是,在進行更改之後,一旦調用後退按鈕,就會在目標片段上調用onResume()方法。

+4

,所以你低估了我的答案,因爲你搞砸了?多好啊...... –

+20

我沒有downvote所需的聲望。我實際上已經贊成你,純粹是因爲拼寫錯誤'RTFM'的喜劇價值。 – Neil

+6

玩好孩子。 – Sandy

1

這個有點奇怪的問題,因爲任何現有的類方法保證當這個特定的方法被設計爲被調用的事件發生並且滿足所有條件時被調用。選擇適合你想要完成的任務。見文檔here

enter image description here

+6

這有些奇怪的答案,因爲在你急於變聰明的時候,你顯然從來沒有讀過我的問題。我做了'RTFM'(我想這就是你的意思),'手動'沒有幫助我。正如我所解釋的那樣,沒有生命週期方法,我可以看到當片段返回時通過按下後退按鈕可以保證這種方法被調用。 – Neil

+1

包含在我的答案中的圖表元素不清楚嗎? –

+6

所有的圖都很清晰,因爲它是Android javadoc的一部分 - 但它並不回答我的問題。 – Neil