【问题标题】:How do I tell my custom FragmentPagerAdapter to stop destroying my fragments?如何告诉我的自定义 FragmentPagerAdapter 停止销毁我的 Fragment?
【发布时间】:2012-11-07 15:53:18
【问题描述】:

我有一个带有 FragmentPagerAdapter 的 ViewPager,而我的应用之前只使用了两个片段(不同类型)而没有问题。

不过,我刚刚添加了第三个片段,现在当我远离它们时,我的适配器/viewpager 似乎正在破坏我的片段。例如,如果我在第 1 页,当我接近第 3 页时,它会被破坏并重新创建。如果我在第 3 页,第 1 页也是如此。

这导致我的应用出现很多问题。这些片段根本不是很重的 RAM,那么我怎样才能阻止这种情况发生呢?

【问题讨论】:

  • 是破坏Fragment还是破坏View?
  • 我不确定。我将如何检查?
  • 您刚才说“它会引起很多问题”。如果 Fragment 正在被销毁,那么它的状态将从内存中擦除并在重新加载时重置为默认值。
  • 如果你使用FragmentPagerAdapter,你的Fragments一旦创建就不会在刷卡时被破坏。只会调用 onPause 和 onStop 方法。可能您正在使用FragmentStatePagerAdapter
  • 当然 onDestroyView 也会在 onStop 之后被调用。

标签: android android-fragments android-viewpager


【解决方案1】:

我相信你正在寻找ViewPager.setOffscreenPageLimit()

在您的情况下,以下内容应将您的片段保存在内存中而不是破坏它们。

ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setOffscreenPageLimit(2);

但是,我怀疑您在销毁时没有正确存储视图状态。您的片段应该正确处理被销毁/重新创建。例如,如果发生方向更改,您的片段也会被销毁并重新创建。如果用户离开您的应用程序并且系统稍后需要内存并破坏您的活动,也可能发生这种情况。它应该能够重新打开并处于与以前相同的状态。如果这确实是您的问题,请考虑将状态保存在 onSaveInstanceState() 中。保存的状态将在onCreate 中呈现给您,您可以在其中将片段的状态初始化为与销毁的相同。

【讨论】:

  • 完美!这将是我的临时解决方案,直到我使我的片段更加独立于网络。
  • onSaveInstanceState() 大多数时候都不会被调用。例如,您在第 1 页,移动到第 5 页:例如,第一个片段通过 onDestroyView(),但不是 onSaveInstanceState()。至少在我的情况下。
【解决方案2】:

只需在 FragmentpagerAdapter 中重写此方法

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
       // TODO Auto-generated method stub
       super.destroyItem(ViewGroup container, int position, Object object);
}

删除super.destroyItem(ViewGroup container, int position, Object object);

来自您的代码

【讨论】:

  • 只要您从不希望您的 Fragment 被销毁(即使 FragmentPagerAdapter 超出范围),这将起作用。这可能是有问题的,但在某些情况下它是完美的。对于这些问题情况,您可以随时自行致电destroyItem(..)
  • 非常感谢您的解决方案 :)
猜你喜欢
  • 2013-01-15
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多