如何在Android中的viewpager中重用片段?

时间:2015-07-07 22:55:43

标签: android android-fragments android-viewpager

假设我有一个包含多个包含位图的片段的viewpager。我使用setOffScreenLimit(numberOfPagesInViewPager)来确保片段随时可用(这是我的应用程序的要求)。很明显,我拥有的片段越多,因为片段内的位图和片段保存在内存中,我将使用的内存越多。

现在,假设这些片段都显示相同的内容,因此保留相同的位图。

是否可以只创建一个片段并在viewpager中为所有页面重用它(从而将内存占用减少到1个片段)?

在代码中我正在考虑这样的事情:

public class MyAdapter extends FragmentPagerAdapter {

private MyFragment mFragment;

public MyAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);

    mFragment = MyFragment.newInstance();
}

@Override
public Fragment getItem(int position) {
    // Reuse mFragment for all pages in the viewpager
    return mFragment;
}
} 

然而,这种方法不起作用,因为我遇到了这种类型的错误:

java.lang.IllegalStateException: Can't change tag of fragment MyFragment{4259a4d0 id=0x7f0a0074 android:switcher:2131361908:0}: was android:switcher:2131361908:0 now android:switcher:2131361908:1

3 个答案:

答案 0 :(得分:0)

  

是否可以只创建一个片段并在viewpager中为所有页面重用它(从而将内存占用减少到1个片段)?

不在FragmentPagerAdapterFragmentStatePagerAdapter。我怀疑即使使用您自己的自定义PagerAdapter它也能正常工作。

如果您使用的应用程序具有ViewPager,则会在滑动时注意到ViewPager动画,因此您一次可以看到两个页面的部分内容。只用一页就很难了。这就是ViewPager始终需要至少三页的原因,因此它可以处理任一方向的滑动。

除此之外,我不太明白为什么用户想要浏览ViewPager中的一系列相同页面。

答案 1 :(得分:0)

你的片段是否复杂?如果它只有一个imageview,您可以实现一个viewpager,它使用简单的布局视图或只是一个图像视图作为基本容器。

如果每个片段具有不同的结构代码,那么片段适配器就更有用了。

答案 2 :(得分:0)

不是100%肯定,但我相信片段会被视图寻呼机破坏并重新创建。您可以在调试器中仔细检查它。如果这是真的,那么片段可以是位图周围的薄包装,并且位图本身可以被缓存而不是片段。缓存位图有多种策略,如http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html所述。