有时我在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中将没有引用。

10-07 23:37