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