2012-04-04 95 views
0

我使用的是ViewPager有4頁,和我在尋找一種有效的方式來代替片段之間/開關每一頁。在ViewPager替換片段使用FragmentPagerAdapter

這是我試圖創建交互模式:

  1. 用戶按下目前持有碎片A
  2. 片段A被換出一些新的B片段在頁面上的一個按鈕
  3. 用戶確實在B片段一些工作,並隨後按下時,他/她完成
  4. 片段B被移除的按鈕,並且由片段A(原片段)
取代

我發現了一種方法來做到這一點,但它似乎有重大缺陷。該解決方案涉及除去原片段,然後重寫getItemPosition(基本上是在此描述related question法):

//An array to keep track of the currently visible fragment in each page 
private final Fragment[] activeFragments= new Fragment[4]; 

public void openFragmentB(ViewPager pager, int position) { 

    startUpdate(pager); 

    //Remove the original fragment 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.remove(activeFragments[position]); 
    transaction.commit(); 

    //Create a new tile search fragment to replace the original fragment 
    activeFragments[position] = FragmentB.newInstance(); 
    pageStates[position] = PageState.STATE_B; 

    finishUpdate(pager); 
    notifyDataSetChanged(); 
} 

@Override 
public int getItemPosition(Object object) { 

    //If the main fragment is not active, return POSITION_NONE 
    if(object instanceof FragmentA) { 
     FragmentA a = (FragmentA) object; 
     if(pageStates[a.getPosition()] != PageState.STATE_A) { 
      return POSITION_NONE; 
     } 
    } 

    //If the secondary fragment is not active, return POSITION_NONE 
    if(object instanceof FragmentB) { 
     FragmentB b = (FragmentB) object; 
     if(pageStates[b.getPosition()] != PageState.STATE_B) { 
      return POSITION_NONE; 
     } 
    } 

    return POSITION_UNCHANGED; 
} 

這種方法有效,但具有不期望的副作用。刪除片段並將其置於POSITION_NONE位置會導致片段被破壞。所以當用戶完成使用FragmentB時,我需要創建一個FragmentA的新實例,而不是重用原始片段。尋呼機中的主要片段(本例中爲FragmentA)將包含相對較大的數據庫支持列表,因此我希望儘可能避免重新創建它們。

基本上我只是想繼續引用我的4個主要碎片和交換他們進出的網頁,而無需每次都重新創建它們。有任何想法嗎?

+0

'Fragments'也'Views',你可以用'Fragments'你需要換,就用'setVisibility()'來刪除和添加他們創造一個佈局。 – adneal 2012-04-04 06:29:05

回答

1

避免重新創建碎片的一種簡單方法是將它們作爲成員變量保存在您的活動中。無論如何,我都會配合onRetainCustomNonConfigurationInstance()來執行此操作,以便在配置更改(主要是屏幕旋轉)期間保留我的片段。由於onRetainCustomNonConfigurationInstance只返回一個對象,因此我將片段保留在'retainer'對象中。

在你的情況,而不是調用Fragment.newInstance()所有的時間,只是檢查,看是否包含在固定物體的片段是創建一個新的前空。如果它不是null,則只需重新使用先前的實例。這種檢查應該發生在ViewPager適配器的getItem(int)方法中。

實際上,這樣做基本上意味着您正在處理是否在調用getItem時回收碎片,並覆蓋getItemPosition(Object)方法以在相關Segmentation時始終返回POSITION_NONE。

1

FragmentPagerAdapter提供了一個名爲getItemId覆寫投放方法,這將幫助你在這裏。

如果您分配您的收藏在一個獨特的長期價值,以每個片段,並返回,在這種方法中,它會迫使ViewPager當它注意到了ID已更改爲重新加載頁面。

比從未更好的遲到,我希望這有助於有人在那裏!