android viewpager适配器和NullPointerException

时间:2012-12-15 23:49:16

标签: android nullpointerexception android-viewpager

有时我在谷歌播放报告中获得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之后,我遇到了这个错误。用户恢复活动时会出现此错误。但我仍然不明白如何解决它,为什么会发生?我应该在onSaveInstanceState()中保存mPageReferenceMap吗?或者在onStop()?我在Activity和Fragments的生命周期中缺少什么?

2 个答案:

答案 0 :(得分:1)

您应该在复制此错误时发布您获得的堆栈跟踪。

只是猜测,但可能是mPageReferenceMap在恢复时返回null。这样做的原因是FragmentStatePagerAdapter正在保留片段,并且只在需要新片段时才调用getItem。但是,FragmentStatePagerAdapter不会保留mPageReferenceMap中的信息。因此,如果适配器在不调用getItem的情况下恢复片段,则您的片段将存在,但mPageReferenceMap中将没有引用。

答案 1 :(得分:0)

当app停止并重新启动时,解决方案是存储mPageReferenceMap。我发现存储片段引用的最佳方法是FragmentManager的putFragment()getFragment()方法。

这是我的代码:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    FragmentManager fm = getSupportFragmentManager();
    for(int i=0;i<mPagerAdapter.getCount();i++)
        fm.putFragment(savedInstanceState,"fragment"+Integer.toString(i),mPagerAdapter.getFragment(i));
}

并在onCreate()方法中(当Activity重新启动时):

    mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
    if (savedInstanceState != null){
        FragmentManager fm = getSupportFragmentManager();
        for(int i=0;i<mPagerAdapter.getCount();i++){
            PageFragment pf = (PageFragment)fm.getFragment(savedInstanceState,"fragment"+Integer.toString(i));
            if(pf!=null)
                mPagerAdapter.putFragment(i,pf);
        }
    }