有时我在Google Play报表中收到NullPointerExceptions,在我看来,我在其中使用viewpager或它的适配器。这是我的代码:
private PagerAdapter mPagerAdapter;
private ViewPager mPagerView;
private static class PagerAdapter extends FragmentStatePagerAdapter {
HashMap<Integer, PageFragment> mPageReferenceMap;
public PagerAdapter(FragmentManager fm) {
super(fm);
mPageReferenceMap = new HashMap<Integer, PageFragment>();
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
PageFragment fragment = PageFragment.newInstance(position);
mPageReferenceMap.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
mPageReferenceMap.remove(position);
}
public PageFragment getFragment(int key) {
return mPageReferenceMap.get(key);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
在onCreate()中:
mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
mPagerView = (ViewPager) findViewById(R.id.pager);
然后,在这一行,我从一些用户那里获取崩溃报告:
mPagerAdapter.getFragment(mPagerView.getCurrentItem()).whatEverFunctionFromFragment();
我在不同位置(彼此独立)(在对话框的onDismiss函数,ListPopupWindow的onItemClick等)中以这种方式调用片段,而片段中具有不同的功能。
更多信息:完成所有令人遗憾的Heinrisch后,我会收到此错误。当用户恢复活动时,将出现此错误。但是我仍然不知道如何解决它,为什么会发生呢?我应该将
mPageReferenceMap
保存在onSaveInstanceState()中吗?还是在onStop()中?我在“活动和片段”生命周期中缺少什么? 最佳答案
当重现此错误时,您应该发布所获得的stacktrace。
只是猜测,但可能是mPageReferenceMap在恢复时返回null。这样做的原因是FragmentStatePagerAdapter保留片段,并且仅在需要新片段时才调用getItem。但是,FragmentStatePagerAdapter不会保留mPageReferenceMap中的信息。因此,如果适配器在不调用getItem的情况下还原了片段,则片段将存在,但在mPageReferenceMap中将没有引用。