У меня есть Activity1, которая содержит несколько фрагментов через ViewPager.У каждого фрагмента есть Ведущий.По какой-то причине, когда я поворачиваю экран, фрагмент воссоздается и теряет связь с докладчиком.
Я делаю следующее
- открыть действие 1 (содержит viewPager с фрагментом)
- открыть действие 2
- повернуть экран
- Нажать кнопку возврата
Видимо фрагмент воссоздан, и я получаю следующую ошибку
Причина: 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, чтобы фрагменты не теряли отношения?
спасибо, извинитедля моего английского