2016-11-08 57 views
3

按照docs何時可以安全地提交FragmentTransaction?

片段事務才能創建/前一個 活動保存其狀態提交。如果嘗試後 Activity.onSaveInstanceState()(和之前的以下 Activity.onStart或Activity.onResume()提交事務,你會得到一個錯誤。

我可以理解,第一部分在Activity.onSaveInstanceState(), 之後無法提交碎片事務,因爲如果活動需要恢復,提交後的狀態可能會丟失。

但我不理解爲什麼我們不能提交在Activity.onStart或Activity.onResume()之前的片段事務?Oncreate()也在Activity.onStart或Activity.onResume()之前。是否意味着我們甚至不能在onc中提交它reate()?

回答

3

這裏的關鍵是,你不能在通話後提交事務,以onSaveInstanceState()和之前的以下onStart()onResume()

由於沒有狀態,您可以在初始的onCreate()和後續的onStart()onResume()上提交事務處理。但是,如果Activity正在恢復其狀態(即先前調用了onSaveInstanceState(),並且Activity正在使用該狀態重新創建自己,則無法執行Fragment事務,這是因爲如果您在Activity之前提交了Fragment事務恢復以前的Fragment狀態,最終會出現一種情況,即您不清楚自己身處何種狀態。保存的狀態優先於您通過提交Fragment事務創建的新狀態,還是應該優先於新事務保存的狀態?

檢查此場景的最簡單方法是檢查savedInstanceState軟件包是否傳遞給onCreate()和其他生命週期方法爲null。如果爲null,則重新沒有保存狀態,您可以安全地執行您的交易。如果它不爲空,那麼就有可能保存的狀態。

+0

我不明白爲什麼有中無的onCreate狀態()? saveInstanceState包傳遞給onCreate()時,狀態還沒有恢復?我們可以在onCreate()或onRestoreInstanceState中返回狀態。 – user3591494

+0

該狀態尚未在'onCreate()'中恢復,因爲剛剛創建了Activity。例如,你甚至還沒有創建/設置內容視圖,所以沒有任何地方可以保存視圖。如果您願意,您可以在'onCreate()'中恢復*您的應用程序狀態,但這並不意味着所有其他組件都完成恢復其狀態。 –

+0

這是否意味着當oncreate()完成時setContentView()仍在運行,它會繼續運行,直到onResume()開始運行? – user3591494

1

它是安全的任何時間onSaveInstanceState()之前,onPause()/onResume()之前這基本上意味着,如果你的活動曾經去過onPause(),那麼它只有onResume()後是安全的。

例如,在onActivityResult(),你還沒有真正去後onResume(),在onActivityResult()所以打開一個對話框可能會崩潰。

0

可能要記住一個致力於交易可能已經執行來承擔。
這是處理:

getSupportFragmentManager().executePendingTransactions(); 
相關問題