36

我將我的應用程序的一部分從活動切換到片段,以便我可以使用整齊的ActionBar選項卡。OnCreateView多次調用/使用ActionBar和片段

但是,在完成轉換後,我遇到了一個問題:每當我切換到另一個選項卡時,該Fragment就會重新創建。每當我看到一個標籤時,onCreate和onCreateView都會被調用。

我有4個選項卡,分別是意味着打開這些片段之一:

Fragment ShopFragment = new WebActivity(); 
Fragment SearchFragment = new SearchActivity(context); 
Fragment StoreFragment = new StoreLocatorActivity(context, this); 
Fragment BlogsFragment = new BlogsActivity(context, this); 

這裏是我的聽衆代碼:

class MyTabsListener implements ActionBar.TabListener { 
     public Fragment fragment; 

     public MyTabsListener(Fragment fragment) { 
      this.fragment = fragment; 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      ft.hide(fragment); 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.fragment_container, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {   

     } 

    } 

可能有人請點我在正確的方向?

+0

有誰知道我可以如何處理這個請嗎? –

回答

43

當你調用FragmentTransaction.replace(...),Android將有效地執行FragmentTransaction.remove(...)序列(對於目前加入到容器內的所有片段)和FragmentTransaction.add(...)(爲您提供的片段)。從FragmentManager中刪除片段將導致碎片被銷燬,並且其狀態將不再被管理。最明顯的是,當你重新添加片段時,所有的視圖都將被重置。注意:因爲您正在重複使用同一個Fragment實例,所以Fragment仍然會保留任何實例變量的值。

解決此問題的一種方法是在切換時使用FragmentTransaction.detach(Fragment)FragmentTransaction.attach(Fragment)。這將導致重新創建片段視圖(onDestroyView() & onCreateView()將被調用),但實例狀態包將被保存並在調用之間返回給您,因此可以維護視圖狀態。這是FragmentPagerAdapter在嘗試在碎片之間切換時採用的方法。

或者,您可以允許碎片被銷燬,但獨立維護它們的保存狀態。這將使用更少的內存,但以較慢的切換時間爲代價。注意方法是FragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState),結合添加/刪除。這是FragmentStatePagerAdapter採取的方法。

您可以看看source for FragmentPagerAdaptersource for FragmentStatePagerAdapter的實現提示。

+0

這是一種解決方法。 onCreate和onCreateView仍然被調用並且保存狀態需要很多工作。難道沒有辦法只保留wach片段的已繪製視圖並替換它們嗎?爲什麼重新塗刷它們呢? –

+1

有隱藏選項。 –

+0

嗨,我使用ActionBar選項卡,並使用附加和分離!你可以請一些示例代碼解釋我怎樣才能保存實例狀態時,切換到其他選項卡,然後保持返回標籤時的狀態!謝謝 –

7

有/hide選項只是因爲這些碎片不需要重新繪製/重新創建,onCreate()onCreateView()將不會被重新調用。

+2

在此處找到解決方案:http://stackoverflow.com/a/11003859/435605 –

相關問題