【问题标题】:How to reuse fragments in a viewpager in Android?如何在 Android 的 viewpager 中重用片段?
【发布时间】:2015-07-07 22:55:43
【问题描述】:

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

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

是否可以只创建一个片段并在视图页面中为所有页面重用它(从而将内存占用减少到 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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

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

    不适用于FragmentPagerAdapterFragmentStatePagerAdapter。而且我怀疑即使使用您自己的自定义 PagerAdapter 也能正常工作。

    如果您使用具有ViewPager 的应用程序,您会注意到ViewPager 在滑动时会产生动画,因此您会同时看到两个页面的一部分。只有一页,这将是困难的。这就是为什么ViewPager 始终需要至少三页,因此它可以处理任一方向的滑动。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多