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

6ss1mwsb  于 2023-04-06  发布在  Android
关注(0)|答案(2)|浏览(266)

我正在尝试通过遵循Google's sample todo app来实现MVP体系结构
我遇到的问题是,当我在片段的onResume()中启动演示程序时,我会得到一个NPE。当我改变设备的方向时,就会发生这种情况。
我有一个带有两个静态片段的FragmentPagerAdapter
据我所知,FragmentPagerAdapter是为了在屏幕旋转时保留片段,这意味着片段将保留它们的演示者。然而,在onResume()中,演示者是空的,所以有些事情我不明白。
这是我当前的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;
    }
}
lbsnaicq

lbsnaicq1#

老实说,在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);
    }
}
g52tjvyc

g52tjvyc2#

因此,即使使用FragmentPagerAdapter,片段实际上也会在配置更改(例如,屏幕旋转)后被销毁,因此我最初的假设是错误的。我通过覆盖并在片段的onDestroy方法中添加print语句发现了这一点。
在我的例子中,为了保留演示者,我只需要在片段的onCreate方法中使用setRetainInstance(true)

相关问题