2013-01-17 82 views
3

我有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?

+0

應該沒問題。你沒有「漏」任何東西(嚴格來說),因爲如果父母被摧毀,你的孩子也被標記爲垃圾。如果您不介意額外的內存使用情況,並且您可以清楚地看到它爲您的應用程序增加了性能優勢,那麼您應該去做。請記住,即使谷歌也這麼做(例如,ViewPager會緩存下一頁和上一頁),並且它們通過提前創建並保留對其的引用來完成此操作。 – kha

回答

相關問題