2011-10-20 32 views
18

使用compat lib v1(由於某些錯誤,不使用v2 | 3);變體this question在方向更改時保存UI - 如果保留片段,onSaveInstanceState不能按預期工作

我有一個片段,其UI具有各種控件,其狀態我想保持方向更改。

家長的活動正在銷燬方向的變化(請不要告訴我有關清單的變化,以避免活動娛樂!!!!)。

該片段調用setRetainInstance(true)

1)現在我的理解是,具有唯一ID的視圖應該保留一些說方向改變的狀態。鑑於此,我期望一個非null包到onCreateView|onActivityCreated但它是空的。

2)在任何情況下,如果我保存onSaveInstanceState狀態(確保我稱之爲超)我仍然得到一個空包在「onCreateView | onActivityCreated`

3)如果我不叫setRetainInstance(true)然後我得到即使我沒有'onSaveInstanceState'方法,也可以使用onCreateView|onActivityCreated中的非null包。

我的問題是,這是否按預期工作,我對生命週期的理解被打破了?無論如何,我猜測對我而言,最好的辦法是保留片段,然後將片段中的控件狀態保持在自己的狀態。

在此先感謝。彼得。

+0

你是否設法解決這個問題?我有完全相同的問題。 – blindstuff

+0

@blindstuff不,還沒有計算出它是一個錯誤還是一個功能,因爲我打電話給'setRetainInstance(true)'。鑑於我確實得到一個非null包,如果說應用程序在低內存條件下被破壞,那麼可能是一個功能。我基本上是通過在'onDestroyView'中保存控件的狀態並在bundle爲空時使用它們來恢復'onCreateView'中的控件。我也同樣確保我在'onSaveInstanceState'中保存狀態。 – PJL

+0

謝謝,我很害怕這個,我試圖在旋轉過程中保留一個AsyncTask,所以我不能採取你一直遵循的思路。我也會發佈一個問題,以試圖在這個問題上得到更多的關注。 – blindstuff

回答

16

如果您使用setRetainInstance(true)那麼當然捆綁爲空。該片段不會被銷燬,但只能從當前活動中分離出來並附加到新活動中。只有當碎片被破壞時,你才能得到一個包含在onSaveInstanceState中保存的值的包。只要刪除setRetainInstance(true)並使用onCreateView()中保存的值來設置您的自定義視圖。

+2

然後我很驚訝,當調用'setRetainInstance(true)'時,我在一個循環中調用了'onSaveInstanceState',並且控件的狀態也丟失了。這是我的理解,具有獨特ID的視圖應該保留一些說方向改變的狀態。 – PJL

+5

無論您是否使用setRetainInstance,都會調用onCreateView()。所以整個視圖將被重新創建。你真的看到哪些控件失去了狀態? setRetainInstance(true)只能用於非常特殊的情況。你想完成什麼?setRetain ..不會保持控件的狀態,但會保持該片段的活躍狀態,以便可以將各種信息保存到您的成員變量中。然後,再次調用onCreateView時,可以使用成員變量中的信息設置各種視圖的狀態。 –

+7

謝謝,我意識到'onCreateView'被調用,無論我是否在管理自己的控件狀態。我也明白,事情基本上按預期工作,但是,我仍然驚訝於'onSaveInstanceState'在輪換時被調用,給我的錯誤印象是'onCreateView'然後將被一個非空的bundle調用。 – PJL

相關問題