2013-03-23 76 views
19

當使用FragmentActivity時,它會自動恢復碎片狀態並重新創建所有碎片。自動碎片恢復如何工作

我知道這樣做主要是將狀態保存在onSaveInstanceState中,然後在活動的onCreate中恢復。仔細看看代碼,我發現所有片段都被重新創建(或者只有在retainInstance爲true的情況下才會被附加)並添加到FragmentManager中,但是我不清楚它們以何種方式添加到視圖中,因爲視圖不是自動恢復。

我原來的問題是我得到一些類似於that other question的片段的重複。 我workarrounded在onCreate有:

Fragment f = fm.findFragmentByTag(tagName); 
    if(f==null) { 
     f = createFragment(); 
     fm.beginTransaction().add(R.id.myContainer,f,tagName).commit(); 
    } else { 
    //Nothing it's on the view 
    } 

現在它的工作原理,但我仍然不能完全理解它是如何工作的。

我的疑惑是:

  • 在這一刻,以及如何被碎片附着在查看?我已經試驗過片段的恢復是在FragmentActivityonCreate中完成的。但是如果我在那之後打電話setContentView,片段如何附加到視圖上?
  • 我可以防止片段娛樂而不覆蓋onSaveInstanceState?由於不同的方向佈局和不同數量的片段,我的初衷是重新創建一個標記爲保留的狀態片段,而不會恢復未標記爲保留的其他片段片段。

回答

7

視圖層次結構不會自動恢復。因此,在Fragment.onCreateView()Activity.onCreate()中,您必須恢復所有視圖(從xml或以編程方式)。每個包含片段的ViewGroup必須具有與第一次創建時相同的ID。一旦創建了視圖層次結構,Android將恢復所有片段並將其視圖放在右側ViewGroup,這要歸功於該ID。假設Android記住片段所在的ViewGroup的ID。 這發生在onCreateView()onStart()之間的某處。

我認爲可以保留片段重新創建,但是在保存片段的ViewGroup中,將可見性設置爲GONE。這樣,片段不會出現,您可以稍後以編程方式將其刪除。