假设我有一个包含多个包含位图的片段的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
答案 0 :(得分:0)
是否可以只创建一个片段并在viewpager中为所有页面重用它(从而将内存占用减少到1个片段)?
不在FragmentPagerAdapter
和FragmentStatePagerAdapter
。我怀疑即使使用您自己的自定义PagerAdapter
它也能正常工作。
如果您使用的应用程序具有ViewPager
,则会在滑动时注意到ViewPager
动画,因此您一次可以看到两个页面的部分内容。只用一页就很难了。这就是ViewPager
始终需要至少三页的原因,因此它可以处理任一方向的滑动。
除此之外,我不太明白为什么用户想要浏览ViewPager
中的一系列相同页面。
答案 1 :(得分:0)
你的片段是否复杂?如果它只有一个imageview,您可以实现一个viewpager,它使用简单的布局视图或只是一个图像视图作为基本容器。
如果每个片段具有不同的结构代码,那么片段适配器就更有用了。
答案 2 :(得分:0)
不是100%肯定,但我相信片段会被视图寻呼机破坏并重新创建。您可以在调试器中仔细检查它。如果这是真的,那么片段可以是位图周围的薄包装,并且位图本身可以被缓存而不是片段。缓存位图有多种策略,如http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html所述。