Android - 使用 FragmentPagerAdapter 和旋转设备时的 NPE

Android - NPE when using FragmentPagerAdapter and rotating device

我正在尝试通过遵循 Google's sample todo app

来实现 MVP 架构

我遇到的问题是,在 fragmentsonResume() 中启动 presenter 时,我得到了 NPE。当我改变设备的方向时会发生这种情况。

我有一个 FragmentPagerAdapter 和两个静态 fragments

根据我的理解,FragmentPagerAdapter 意味着在屏幕旋转时保留 fragments,这意味着 fragments 将保留其 presenters。但是 presentersonResume() 中为空,所以有些事情我不明白。

感谢任何help/comments。

编辑:

这是我当前的 FragmentPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                FragmentA fragA = FragmentA.newInstance();
                PresenterA presA = new PresenterA(fragA);
                return fragA;
            case 1:
                FragmentB fragB = FragmentB.newInstance();
                PresenterB presB = new PresenterB(fragB);
                return fragB;
        }
        return null;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

老实说,Android中的片段实在是太麻烦了,Android发展了好几年,我至今都对它们感到沮丧。我用这样的东西,在这种情况下会有用:

public class MyAdapter extends FragmentStatePagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int pos) {
        switch(pos) {

            case GlobalAppKeys.FRAGMENT_HOME:
                return HomeFragment.newInstance(pos);
            case GlobalAppKeys.FRAGMENT_NEXT:
                return NextFragment.newInstance(pos);
            default:
                return new Fragment();
        }
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public int getItemPosition(Object object) {
        // refresh all fragments when data set changed
        if (object instanceof HomeFragment){
            HomeFragment hF = (HomeFragment) object;
            if (hF != null) {
                hF.updateThisFragment();
            }
        }

        return super.getItemPosition(object);
    }
}

所以事实证明,即使使用 FragmentPagerAdapter,片段实际上在配置更改后被销毁(例如屏幕旋转),所以我最初的假设是错误的。我通过覆盖并在片段的 onDestroy 方法中添加打印语句发现了这一点。

在我的例子中,为了保留演示者,我只需要在片段的 onCreate 方法中 setRetainInstance(true)