2011-11-27 38 views
5

我注意到娛樂,使用一個FragmentPagerAdapter是不相鄰於當前一個都具有自己的看法破壞(並且調用其onPause()onStop()方法,奇怪onSaveInstanceState(Bundle)沒有被碎片時稱爲),並且onCreateView正被再次調用這些碎片。我的問題是我在這些碎片上運行了一些Timer,重新創建它們是不可行的,因爲這些定時器應該觸發並更新相關的碎片UI。對於大屏幕,我使用HorizontalScrollViewLinearLayout,它的工作完美無瑕。FragmentPagerAdapter - 避免的片段的觀點

在我的活動相關的代碼:

private class MyPagerAdapter extends FragmentPagerAdapter implements TitleProvider { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return mAddNewScenesFragment; 
     } else if (position == 1) { 
      return mGlobalEventsFragment; 
     } else { 
      return mSceneFragments.get(position - 2); 
     } 
    } 

    @Override 
    public int getCount() { 
     return mSceneFragments.size() + 2; 
    } 

    @Override 
    public String getTitle(int position) { 
     if (position == 0) { 
      return "New scene"; 
     } else if (position == 1) { 
      return mGlobalEventsFragment.getTitle(); 
     } else { 
      return mSceneFragments.get(position - 2).getTitle(); 
     } 
    } 
} 

的片段上的活動的onCreate方法創建和其他人可以被添加到列表中運行,但即使沒有添加新的,第三個片段被銷燬當我滾動到第一個。

有沒有辦法避免它們的破壞,或者我應該忘記ViewPager並在小屏幕上使用HorizontalScrollView?我選擇使用它,因爲我認爲「固定」行爲確實有助於可用性。

回答

16

下面的方法應防止碎片破壞:

mViewPager.setOffscreenPageLimit(no_of_fragments_to_be_kept_offscreen); 
+4

它不是mFragmentPagerAdapter.setOffscreenPageLimit()。它是mViewPager.setOffscreenPageLimit(numberOfFragments)。我很驚訝這麼多錯誤。 –

+0

你是對的@raychenon。我已經更新了我的答案。 – Saimon

+0

是的,這解決了我的問題..謝謝@Saimon – bebosh

0

您應該FragmentStatePagerAdapter而不是FragmentPagerAdapter延伸。 方法onCreate(Bundle savedInstanceState)不應該再次被調用。

0

您需要設置頁面傳輸的限制以避免視圖破壞。

your_pager_obj.setOffscreenPageLimit(no_of_fragments_on_each_side_of_the_current_fragment); 
6

而不是黑客FragmentPagerAdapter,只需使用ViewPager

int limit = myPagerAdapter.getCount(); 
// Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. 
viewpager.setOffscreenPageLimit(limit);