2014-09-30 62 views
1

下面的代碼被簡化了,只顯示了相關的東西。清理動態添加的片段

我有一個佈局XML文件:

<LinearLayout 
    android:id="@+id/top_row" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"/> 

此佈局在在ViewPagerFragment使用FragmentStatePagerAdapter

在我們要動態地添加子片段FragmentonCreateView()膨脹,可以是任何類型的數字。所以我們這樣做:

View view = inflater.inflate(R.layout.the_layout, container, false); 

FragmentManager fragmentManager = getChildFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

for(Fragment f : fragments) { 
    transaction.add(R.id.top_row, frag); 
} 

transaction.commit(); 

完美地工作,所有的片段都很好地排列在一起。

但是,這裏有個問題:每當Activity的onCreate被再次調用,ViewPager被設置爲新的Adapter。所以我希望一切都能夠重建。 因此onCreateView被調用,所以創建一個新的View並將Fragments添加到這個新的LinearLayout

究竟發生了什麼,以前的Fragments似乎仍然存在!新的Fragments被添加到前面添加的Fragments。所以我們說有3 Fragments,之後onCreateView()被稱爲3次,我有9

我認爲正在發生的事情:在Fragments由ID與View相關聯,因此它們將被添加到新的View太。 我想我應該做的:刪除onDestroyView()中的所有Fragments,但這是不允許的(生成'這個不能在onSaveInstanceState()之後完成,在onPause()生成崩潰)。

這是不是應該這樣做?我應該使用FrameLayout s的佈局,並使用FragmentTransaction.replace()這些?

我的ActivityonCreate()之外沒有其他功能。這實例化的適配器,並將其設置在ViewPager

FragmentStatePagerAdapter本身是目前非常簡單,getItem()剛剛返回的具體Fragment

return new MyFragment(); 
+0

根據[Android文檔](https://developer.a ndroid.com/guide/components/fragments.html#Lifecycle),片段不可能比他們的父活動壽命更長。你應該檢查,你的活動是否正確地實現了onCreate()和onStart()。請在此粘貼該代碼。我會說,在onStop()過程中刪除片段,在onStart()過程中添加片段。 – 2014-09-30 09:44:58

+0

將在'transaction.commit()' – Boy 2014-09-30 10:06:41

+0

處拋出'java.lang.IllegalStateException:無法在onSaveInstanceState後執行此操作'如果您沒有在您的活動生命週期中顯示更多代碼,則很難提供任何提示。或者,@Override onSaveInstanceState()並在此方法中設置一個斷點,以查看它何時被調用以及當時的碎片狀態。 – 2014-09-30 10:16:35

回答

4

我覺得我應該做的:刪除所有onDestroyView中的片段()

不這樣做。它不會有任何好處。

不知道你是否知道 - 如果你的Activity重新創建而沒有明確的被調用finish()或者按下後退按鈕 - 這意味着它是restored from previous instance state

在這種情況下,您不應該再次執行該事務,因爲 - 它已經通過super.onCreate()Activity方法自動發生。其實,如果你能在這種情況下執行片段trasaction - 你會導致添加兩次(實例)

你可以知道,如果目前onCreate()從恢復實例狀態的,如果savedInstanceState檢查稱爲相同片段參數是否爲null。

您不檢查savedInstanceState,並且無論如何執行交易。

,如果我是對的,那麼下面的變化應該可以解決重複片段問題:

代替:

FragmentManager fragmentManager = getChildFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

for(Fragment f : fragments) { 
    transaction.add(R.id.top_row, frag); 
} 

transaction.commit(); 

寫:

if (savedInstanceState == null) { 
    FragmentManager fragmentManager = getChildFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 

    for(Fragment f : fragments) { 
     transaction.add(R.id.top_row, frag); 
    } 

    transaction.commit(); 
} 

的更多信息 - http://developer.android.com/guide/components/fragments.html

+0

我沒有時間嘗試這個(項目壓力),但會做得更晚!無論如何,我會給你獎勵獎勵 – Boy 2014-10-09 10:55:08

+0

@boy:謝謝,我看到你接受了答案,但沒有獎勵賞金 – 2014-10-09 11:01:17

+0

啊是的..現在.. ..它..sorry :) – Boy 2014-10-09 11:15:17