2011-11-24 110 views
7

下面是導致問題的情景:在交易中替換碎片時的碎片堆棧錯誤?

  1. 我開始一個胡亞蓉與將保持呈現一個片段的ViewGroup。
  2. 我通過在保存到堆棧的事務中調用.replace()將片段A加載到此ViewGroup中。
  3. 我將Fragment B加載到Viewgroup中,替換Fragment A.再次保存事務。
  4. 我旋轉設備兩次。
  5. 在第二次輪換時,Fragment A(此時不可見)將拋出一個NullPointer異常。

這個異常是由Fragment A引發的,因爲我在其onSaveInstanceState()方法中保存了Views(EditTexts例如)的一些值。看起來,在第二次輪換時,系統並沒有實例化這些視圖,所以當我詢問它們的值時,我得到一個NullPointer異常。這可以以某種方式避免嗎?或者正在使用.replace操作保存到堆棧中的片段傳輸未被修改?

回答

3

我有這個,但不能完全記得我所做的修正,但總體來說(對大腦轉儲和道歉)具體我做到以下幾點:在onCreate

  1. 呼叫setRetainInstance(true)以避免片段娛樂

  2. 將編輯控件等狀態保存在onSaveInstanceState中,以便在活動被終止時使用,並且您使用非空的包進行恢復(您不應該在方向上獲得非空包用1改變。)

  3. 保持成員變量的編輯控制值(該片段是不會重新創建)確保他們得到了onDestroyView從編輯控件更新,然後用它們在onCreateView

  4. 必須還原編輯控制值一個標誌,我在onCreateView中設置爲true,在onDestroyView中爲false,並確保在視圖不在時不觸摸UI控件。

BTW使用replace同時增加交易到後面堆棧是完全確定。

希望在那裏有東西有幫助。彼得。

+3

我注意到你接受了這個答案......最終有用的是什麼? –