我有FragmentActivity導航模式(的ActionBar)設置爲ActionBar.NAVIGATION_MODE_TABS
。可以繼續引用片段嗎?
這些選項卡允許用戶在兩個片段之間切換,一個是listFragment和一個mapFragment。mapFragment包含一個Google Map。代碼控制兩個片段之間的切換。
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
// When the given tab is selected, show the tab contents in the
// container view.
if(tab==tab_buyer_browse){
if(mListFragment==null){
mListFragment = new ItemListFragment(this,new ItemArrayAdapter(this));
}
Bundle args = new Bundle();
args.putInt(ItemListFragment.ARG_SECTION_NUMBER,
tab.getPosition() + 1);
mListFragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, mListFragment).commit();
}
else if (tab==tab_buyer_location){
if(mapFragment==null){
//every time,on destroy called anyway, and exception raise. it looks like there is no point maintain a reference to mapFragment ?
mapFragment = new ItemMapFragment(this);
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, mapFragment).commit();
}
我維護對這兩個片段的引用。我認爲通過這種方式,我可以避免創建新的碎片,並在用戶每次切換標籤時重新使用舊的碎片。 ListFragment沒有問題,但如果我切換到mapFragment TWICE,則異常提示說該片段已被銷燬。
每當用戶切換選項卡時,我最終都會創建新的mapFragment,並且我可以在切換時體驗到UI遲鈍。
所以我的問題是,維護父FragmentActivity中片段的引用是一個好習慣嗎?
如果沒有,我有什麼辦法控制片段的生命週期,或者至少儘可能地重用它們以避免呆滯的UI?
應該沒問題。你沒有「漏」任何東西(嚴格來說),因爲如果父母被摧毀,你的孩子也被標記爲垃圾。如果您不介意額外的內存使用情況,並且您可以清楚地看到它爲您的應用程序增加了性能優勢,那麼您應該去做。請記住,即使谷歌也這麼做(例如,ViewPager會緩存下一頁和上一頁),並且它們通過提前創建並保留對其的引用來完成此操作。 – kha