2

嘿,我正在使用带有片段的 ViewPager。

我正在尝试在片段不可见时修改片段的 UI(例如删除图像视图中的图像以释放内存),并在再次可见时重新添加图像。

我无法找到正确的方法,因为我不确定如何从 setUserVisibleHint 访问我的片段视图。

我尝试在 onCreateView 期间将视图放入变量中,但由于某些奇怪的原因,我得到了 nullpointerexceptions。

这样做的正确方法是什么?或者无论如何我可以在碎片不在视野中时销毁它们?

4

2 回答 2

6

您可以为 View pager 使用 2 个不同的适配器:

  • FragmentPagerAdapter
  • FragmentStatePagerAdapter

他们都以类似的方式工作。视图寻呼机仅在内存中保存当前视图和相邻视图。当您在第 5 页时 - 将为 4、5、6 个片段分配内存。当您移至第 6 页时:删除 4 并添加 7。

两个适配器之间的主要区别在于FragmentPagerAdapter只破坏片段的视图,并且在您下次返回片段时启动 OnCreateView 方法。 FragmentStatePagerAdapter对内存更友好,但性能较差。它破坏了整个片段,当你回到它时 - 视图寻呼机将调用 OnCreate 和 OnCreateView。

于 2012-08-23T07:12:28.797 回答
0

您不必自己删除视图,每个片段视图都会在不再可见时的onDestroyView()方法中自动销毁Fragment(难怪如果您尝试在不可见时访问视图,则会收到 NullPointerException)。然后onCreateView()当片段返回并可见时,它会在方法内部再次创建。

您可能需要阅读Fragment 生命周期 以获取更多信息

无论如何,如果您仍然想访问片段以对他们的视图做任何您想做的事情,我建议在您的内部实现这种代码(我从这里获取)FragmentPagerAdapter

private Map<Integer, Fragment> mPageFragments = new HashMap<Integer, MyFragment>();

@Override
public Fragment getItem(int index) {
    Fragment myFragment = MyFragment.newInstance();
    mPageFragments.put(index, myFragment);
    return myFragment;
}

@Override
public void destroyItem(View container, int position, Object object) {
    super.destroyItem(container, position, object);
    mPageFragments.remove(position);
}

public MyFragment getFragment(int key) {
    return mPageFragments.get(key);
}

然后,OnPageChangeListener在您的ViewPager(例如)内,您可以使用以下方法取回片段和视图:

MyFragment fragment = adapter.getFragment(position);
if (fragment.getView() != null) {
   // ...
}
于 2012-08-23T06:48:54.720 回答