下面的代碼被簡化了,只顯示了相關的東西。清理動態添加的片段
我有一個佈局XML文件:
<LinearLayout
android:id="@+id/top_row"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"/>
此佈局在在ViewPager
Fragment
使用FragmentStatePagerAdapter
在我們要動態地添加子片段Fragment
的onCreateView()
膨脹,可以是任何類型的數字。所以我們這樣做:
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()
這些?
我的Activity
除onCreate()
之外沒有其他功能。這實例化的適配器,並將其設置在ViewPager
的FragmentStatePagerAdapter
本身是目前非常簡單,getItem()
剛剛返回的具體Fragment
:
return new MyFragment();
根據[Android文檔](https://developer.a ndroid.com/guide/components/fragments.html#Lifecycle),片段不可能比他們的父活動壽命更長。你應該檢查,你的活動是否正確地實現了onCreate()和onStart()。請在此粘貼該代碼。我會說,在onStop()過程中刪除片段,在onStart()過程中添加片段。 – 2014-09-30 09:44:58
將在'transaction.commit()' – Boy 2014-09-30 10:06:41
處拋出'java.lang.IllegalStateException:無法在onSaveInstanceState後執行此操作'如果您沒有在您的活動生命週期中顯示更多代碼,則很難提供任何提示。或者,@Override onSaveInstanceState()並在此方法中設置一個斷點,以查看它何時被調用以及當時的碎片狀態。 – 2014-09-30 10:16:35