0

對於有ID的View,調用super.onSaveInstanceState(outState);時會自動保存。如何確定活動重新創建時的片段恢復?

對於Fragment將其添加到Activity,它將在重新創建Activity(例如屏幕旋轉)時重新創建的情況是什麼,以及它不會有什麼情況?要確定什麼?什麼是規則?

到目前爲止,我已經嘗試過以下情況。但是,試錯誤並不意味着任何規則或解決方案。

例時Fragment s的重新存儲:

  1. 正常情況下:FragmentTransaction.add()到帶有ID的佈局。
  2. 片段沒有UI:FragmentTransaction.add()標籤的只

例時Fragment s爲NOT重新存儲:

  1. super.onSaveInstanceState(outState);被跳過。
  2. 在沒有匹配ID的UI中恢復Fragment

什麼是一般規則?我在文檔中錯過了什麼?

在此先感謝。


編輯:

據我瞭解,和實驗,所有動態(編程)添加Fragment s的在他們Activity調用super.onSaveInstanceState(outState)保存。

  • 所有動態(編程)加入Fragment小號包括
    • Fragment s的僅一個標籤(無UI),附
    • Fragment s到一個View(與UI),
    • Fragment s與均爲一個UI和一個標籤。
    • (是否有任何其他類型?)

關於恢復與UI一個Fragment到與沒有匹配的ID,確實重新創建Fragment的佈局。它只是不能在視覺上在佈局所示,用下面的警告消息:

04-08 11:41:22.445: W/PhoneWindow(9853): Previously focused view reported id 2131165226 during save, but can't be found during restore. 

一旦我們回到與其匹配的ID的用戶界面中,它將被正確地恢復。


我是仍然期待一些可靠的參考和你的意見!

+0

隨着[源代碼](https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app),所有的問題都可以解決: ) – midnite 2013-06-06 02:01:37

回答

1

我有同樣的問題,你可以在這裏看到:After screen rotation, findFragmentById() returns a fragment, even if there's no such ID inside the layout

http://developer.android.com/training/basics/fragments/communicating.html引號這個Android的開發者文檔:

當配置變化導致託管這些 片段活動重新啓動時,其新實例可能會使用不同的佈局,其中 不包含與先前佈局相同的片段。在這個 的情況下,所有先前的片段仍將被實例化並且在新實例中運行 。但是,與視圖層次結構中的標記關聯的任何不再 的 都不會創建它們的內容視圖,並將從isInLayout()返回false。 (這裏的代碼也顯示瞭如何確定一個片段在容器中放入 在與容器 佈局不再運行,並避免在這種情況下創建其視圖層次)。

這意味着,我們必須檢查屏幕方向而不是相信空指針檢查。

相關問題