簡體   English   中英

重新啟動活動時未重新創建Android片段

[英]Android Fragments not being recreated on Activity Restart

我有一個活動,其中包含幾個嵌套的片段。 我在處理方向更改時遇到了很多麻煩。 當活動嘗試重新創建自身時,這會導致應用程序崩潰,這是不正確的。 如果我嘗試在方向更改期間調試代碼,則應用程序將崩潰,並且在logcat中沒有任何消息。

我的問題似乎是運行時試圖在我不希望的活動中重新創建片段。 這些片段都沒有setRetainInstance(true),因此不應保留它們。

我已將日志記錄添加到“活動”和“片段”的onCreate和onDestroy方法中。 當應用首次運行時,我得到以下輸出:

Activity onCreate
Fragment1 onCreate
Fragment1 onCreateViewStart
Fragment1 onCreateViewEnd
Fragment2 onCreate
Fragment2 onCreateViewStart
Fragment2 onCreateViewEnd

然后,我旋轉設備並獲得以下信息:

Fragment1 onDestroy
Fragment2 onDestroy
Activity onDestroy
Fragment1 onCreate
Fragment2 onCreate
Activity onCreate
Fragment1 onCreateViewStart
Fragment1 onCreateViewEnd
Fragment2 onCreateViewStart
Fragment2 onCreateViewEnd
Fragment2 onDestroy
Fragment2 onCreate

在上述最后一條消息之后,應用程序崩潰並顯示以下異常消息:

E/FragmentManager(32258): No view found for id 0x7f0a0047 (com.appName:id/fragmentHolder) for fragment Fragment2{6529b910 #6 id=0x7f0a0047 16002}

為什么我的片段會自動重新創建? 我可以采取什么措施來強制重新加載活動,就像方向更改時第一次啟動該應用一樣? 這不是生命周期最初應該如何運作嗎?

如果需要,我可以添加任何代碼。

  • FragmentManager負責管理片段並將其添加到活動的視圖層次結構中。

  • FragmentManager處理兩件事:

    • 片段列表。
    • 返回堆棧的片段事務。
  • 添加刪除附加分離替換片段列表中的片段,請使用“ Fragment Transactions

  • 當您使用findFragmentById()findFragmentByTag()向FragmentManager詢問片段時,如果該片段已在列表中,則FragmentManager將返回它。 然后就可以使用它了。

知道。 如果在方向更改發生時有片段添加到FragmentManager的列表中,那么這些片段將自動重新創建,以便重新創建視圖層次結構,就像在方向更改之前一樣。 如果您不希望重新創建片段,請使用片段事務將其從列表中刪除。

您知道如何在后台運行應用程序然后重新打開它嗎? Activity實例仍然在那里,其中Bundle savedInstanceState填充了數據。 這意味着操作系統正在從序列化狀態而不是從頭開始創建應用程序。

savedInstanceState不為null的情況下,您需要做的是使用FragmentManagerfindFragmentByTag

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM