【问题标题】:Android - NPE when using FragmentPagerAdapter and rotating deviceAndroid - 使用 FragmentPagerAdapter 和旋转设备时的 NPE
【发布时间】:2018-05-12 19:51:22
【问题描述】:

我正在尝试通过关注Google's sample todo app 来实现MVP 架构

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

我有一个FragmentPagerAdapter 和两个静态fragments

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

感谢任何帮助/cmets。

编辑:

这是我当前的 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;
    }
}

【问题讨论】:

  • 您使用什么模式来实例化片段?当片段被重新创建时,片段的参数可用于恢复初始状态。见developer.android.com/reference/android/app/…
  • @Luis 我添加了更多细节。根据 FragmentPagerAdapter 的文档,状态应该保存在内存中,所以我不需要像你建议的那样显式恢复状态。

标签: android android-fragments android-viewpager mvp android-mvp


【解决方案1】:

老实说,Android 中的 Fragment 实在是太麻烦了,经过几年的 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);
    }
}

【讨论】:

  • 这不起作用,当我旋转屏幕时甚至没有调用 getItemPosition()。
【解决方案2】:

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

就我而言,为了保留演示者,我只需要在片段的 onCreate 方法中使用 setRetainInstance(true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多