Android - NPE при использовании FragmentPagerAdapter и вращающегося устройства - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь реализовать архитектуру MVP, следуя образцу приложения Google todo

У меня проблема в том, что при запуске presenter я получаю NPEв onResume() из fragments.Это происходит, когда я меняю ориентацию устройства.

У меня есть FragmentPagerAdapter с двумя статическими fragments.

Из того, что я понимаю, FragmentPagerAdapter предназначен для сохранения fragments при повороте экрана, что означает, что fragments сохранит свои presenters.Однако presenters равны нулю в 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Получается, что даже при FragmentPagerAdapter фрагмент фактически уничтожается после изменений конфигурации (например, экран поворачивается), поэтому мое первоначальное предположение было неверным. Я выяснил это, переопределив и добавив оператор print в методе onDestroy фрагмента.

В моем случае, чтобы сохранить докладчика, мне просто нужно было setRetainInstance(true) в методе onCreate фрагмента.

0 голосов
/ 13 мая 2018

Если честно, фрагменты в 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);
    }
}
...