2012-12-18 66 views
14

我有一個關於DialogFragment的問題。我試圖做一個對話框,在設備旋轉後保持它的狀態。這個對話框有很多引用,比如適配器和其他較重的對象,我需要在循環時保留這些對象,如果可能的話,不必創建每個引用Parcelable或Serializable,以便我使用onSaveInstanceState保存和恢復它們原始活動被重新創建。設備旋轉後不顯示帶有setRetainInstanceState(true)的DialogFragment

我注意到在DialogFragment上有一個名爲setRetainInstance(boolean)的方法,它允許您在重新創建活動時保留對話框片段實例。但是,當我旋轉設備時,對話框不再顯示。我知道我可以從活動的FragmentManager中獲得它,但是我找不到讓它再次可見的方法。對此有何建議?

感謝, 米哈伊

+1

也許這可以幫助:http://stackoverflow.com/questions/8235080/fragments-dialogfragment-and-screen-rotation –

+0

我在這裏看到一個更大的概念問題。在android文檔中爲setFragmentInstance寫道:「控制片段實例是否在Activity重新創建時保留(例如從配置更改中),這隻能用於**片段不在後端堆棧**中。設置,當活動重新創建時,片段生命週期將略有不同「。這是因爲對話框片段在後臺? – Swapnil

回答

21

有你需要做的幾件事情:

  1. 使用實例工廠方法來啓動一個DialogFragment情況是這樣的:通過把

    public static MyDialogFragment newInstance(MyModel model) { 
        MyDialogFragment myDialogFragment = new MyDialogFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("MODEL", model); 
        myDialogFragment .setArguments(bundle); 
        return myDialogFragment; 
    } 
    
  2. 在onCreate中設置setRetainInstance(true),在原始活動重新創建後,在片段中聲明的所有引用都將保留

    @Override 
    public void onCreate(Bundle icicle) { 
        this.setCancelable(true); 
        setRetainInstance(true); 
        super.onCreate(icicle); 
    
    } 
    
  3. 避免使用

    (MyModel) getArguments().getSerializable("MODEL") 
    
+0

感謝您的答案@ ricky888,但由於我創建了一個對話框片段實例並在對話框片段的構造函數中傳遞了東西,比如列表適配器和其他重要數據,所以我想避免序列化,並且我正在考慮使用set retain實例狀態,以便旋轉時不會重新創建對話框片段。所以,我認爲通過使用set retain實例狀態,我將擁有與旋轉之前相同的對話框片段 - 這意味着對話框片段在旋轉時不會與活動及其片段重新創建。是這樣嗎? – r1k0

+0

setRetainInstance - 控制是否在重新創建Activity(例如從配置更改)中保留片段實例。所以答案是肯定的。您將通過簡單地將它們放在捆綁包中,就像我上面提到的一樣,保留所有東西的同一個實例。 – ricky888

+0

事實上,正確的答案會涉及到序列化,所以我們重新設計了片段以減少數據密集度,以便能夠在配置更改時保持其狀態,如@ ricky888 – r1k0

0

對話片段做這個

@Override 
public void onDestroyView() { 
    if (getDialog() != null && getRetainInstance()) 
     getDialog().setDismissMessage(null); 
    super.onDestroyView(); 

}

  • 讓你的對象上旋轉消失應該被保留只要將自動爲您做到以下幾點:

    1. 如果您在呼叫的onSaveInstanceState活動(),請確保調用父類的功能!!!!。就我而言,這是關鍵。還要確保你在片段中做同樣的事情。
    2. 如果您使用setRetainInstance,則需要手動存儲值。否則,在大多數情況下,您應該無需擔心。如果你做了一些更復雜的事情,你可能需要setRetainInstance(true),但否則忽略它。
    3. 有些人抱怨支持庫中存在一個錯誤,當它不應該發送解僱消息時。最新的支持庫似乎已經解決了這個問題,所以你不需要擔心這一點。
  • +2

    關於#2,我認爲您的意思是「如果你沒有在句子的開頭使用setRetainInstance ...「,否則你必須存儲和恢復值。 –

    相關問題