有时我在谷歌播放报告中获得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的生命周期中缺少什么?
答案 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);
}
}