1

時々、Google Play レポートで NullPointerExceptions が発生します。(私が思うに) ビューページャーまたはアダプターを使用しています。これは私のコードです:

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をすべて実行した後、このエラーが発生しました。このエラーは、ユーザーがアクティビティを再開したときに表示されます。しかし、私はまだそれを修正する方法を理解していません.なぜそれが起こっているのですか? mPageReferenceMaponSaveInstanceState() で保存する必要がありますか? またはonStop()で?アクティビティとフラグメントのライフサイクルで何が欠けていますか?

4

2 に答える 2

1

このエラーを再現するときに取得しているスタック トレースを投稿する必要があります。

推測ですが、再開時に null を返すのは mPageReferenceMap かもしれません。この理由は、FragmentStatePagerAdapter がフラグメントを保持しており、新しいフラグメントが必要な場合にのみ getItem を呼び出しているためです。ただし、FragmentStatePagerAdapter は mPageReferenceMap の情報を保持しません。したがって、アダプタが getItem を呼び出さずにフラグメントを復元すると、フラグメントは存在しますが、mPageReferenceMap には参照がありません。

于 2012-12-20T13:00:08.550 に答える
0

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() メソッド内 (アクティビティの再起動時):

    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);
        }
    }
于 2012-12-25T13:33:40.287 に答える