Android - MVP - Фрагменты, Presenter и ViewPager - PullRequest
0 голосов
/ 06 июня 2018

У меня есть Activity1, которая содержит несколько фрагментов через ViewPager.У каждого фрагмента есть Ведущий.По какой-то причине, когда я поворачиваю экран, фрагмент воссоздается и теряет связь с докладчиком.

Я делаю следующее

  1. открыть действие 1 (содержит viewPager с фрагментом)
  2. открыть действие 2
  3. повернуть экран
  4. Нажать кнопку возврата

Видимо фрагмент воссоздан, и я получаю следующую ошибку

Причина: java.lang.NullPointerException: попытка вызвать метод интерфейса 'void .... Presenter1.subscribe ()' для ссылки на пустой объект в .... Fragment1.onResume (Fragment1.java:72)

My Activity1 содержит 2 представления (layout и layout-normal-land) Код действия1 выглядит следующим образом

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    final ViewPager viewPager = (ViewPager) findViewById(R.id.htab_viewpager);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.htab_tabs);
    ...
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);

кодкласс ViewPagerAdapter имеет следующий вид:

private  class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<String> mFragmentTitleList = Arrays.asList("Fragment1", "Fragment2");

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        if (position == 0){
            Fragment1 fragment = Fragment1.newInstance();
            new Presenter1(fragment);
            return fragment;

        }else if (position == 1){                
            Fragment2 fragment = Fragment2.newInstance();
            new Presenter2(fragment);
            return fragment;

        }
        return null;
    }

     @Override
    public int getCount() {
        return mFragmentTitleList.size();
    }



    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

Код каждого фрагмента:

public class Fragment1 extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retain this fragment across configuration changes.
        setRetainInstance(true);
    }

    @Override
    public void onResume() {
        super.onResume();
        mPresenter.subscribe();
    }

    @Override
    public void onPause() {
        super.onPause();
        mPresenter.unsubscribe();
    }


   @Override
   public void setPresenter(@NonNull Presenter1 presenter) {
        mPresenter = checkNotNull(presenter);
    }

    ....

}

Код каждого докладчика

public class Presenter1 {

    private final Fragment1 view;

    public PerfilAlumnoCalificacionesPresenter(Fragment1 view ....) {
        ....
        this.view = view
        this.view.setPresenter(this);
    }

    ....

}

Как я могупочини это?Я не понимаю, почему фрагмент воссоздается, если он содержит setRetainInstance (true)

Каков наилучший способ инициализации Presenter, чтобы фрагменты не теряли отношения?

спасибо, извинитедля моего английского

...