Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ViewPager片段修改UI_Java_Android_Android Viewpager - Fatal编程技术网

Java ViewPager片段修改UI

Java ViewPager片段修改UI,java,android,android-viewpager,Java,Android,Android Viewpager,嘿,我用的是带片段的可视寻呼机 我试图在片段不可见时修改其UI(例如在ImageView中删除图像以释放内存),并在其再次可见时重新添加图像 我无法找到正确的方法,因为我不确定如何从setUserVisibleHint访问my片段的视图 在onCreateView期间,我尝试将视图放入变量中,但由于一些奇怪的原因,我得到了NullPointerException 这样做的正确方式是什么? 或者,当片段不在视图中时,是否还有其他方法可以销毁它们?您不必自己删除视图,每个片段视图在fragment的

嘿,我用的是带片段的可视寻呼机

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

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

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

这样做的正确方式是什么?
或者,当片段不在视图中时,是否还有其他方法可以销毁它们?

您不必自己删除视图,每个片段视图在
fragment
onDestroyView()方法中,当不再可见时会自动销毁(难怪在不可见时尝试访问视图时会出现NullPointerException).
然后,当片段返回并可见时,在
onCreateView()方法中再次创建它

你可能想看看这本书 更多信息

无论如何,如果您仍然想访问片段来执行任何操作 如果您想了解他们的观点,我建议在您的
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);
}

您可以使用两种不同的适配器来查看寻呼机:

  • FragmentPagerAdapter
  • FragmentStatePagerAdapter
它们都以相似的方式工作。视图寻呼机仅在内存中保留当前视图和相邻视图。当您在第5页时,内存将分配给4,5,6个片段。当你移到第6页时:4被删除,7被添加

这两个适配器之间的主要区别在于,FragmentPagerAdapter只销毁片段的视图,下一次返回到FragmentOnCreateView方法时将启动该方法。
FragmentStatePagerAdapter对内存更友好,但缺点是性能较差。它会破坏整个片段,当您返回到它时,view pager将调用OnCreate和OnCreateView。

Hmm谢谢您提供的信息。现在对我来说更有意义了。我以为ViewPager正在将所有片段加载到内存中…嗯,你说的有道理。但即使在片段可见(未销毁)时调用视图也会返回空指针。我还要检查getView()是否为null。此外,fragment.getView()不返回父视图吗?我不知道为什么在OnPageChangeListener的onPageSelected()中会得到一个空指针,它工作正常。是的,返回的视图是从onCreateView()创建的父视图,您可以从中使用findViewById来获取所有子视图。但实际上,我不明白您为什么要自己管理片段视图的销毁。。
MyFragment fragment = adapter.getFragment(position);
if (fragment.getView() != null) {
   // ...
}