В моем приложении активность фрагмента содержит два фрагмента: фрагмент A и фрагмент B. Фрагмент B - это пейджер представления, содержащий 3 фрагмента.
В моей деятельности, чтобы предотвратить повторное создание фрагмента при изменении конфигурации:
if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainTabFragment(), MAIN_TAB_FRAGMENT).commit();
}
Код для фрагмента B:
public class MainTabFragment extends Fragment {
private PagerSlidingTabStrip mSlidingTabLayout;
private LfPagerAdapter adapter;
private ViewPager mViewPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
this.adapter = new LfPagerAdapter(getChildFragmentManager());
this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(adapter);
this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
this.mSlidingTabLayout.setViewPager(this.mViewPager);
}
}
Код адаптера:
public class LfPagerAdapter extends FragmentPagerAdapter {
private static final int NUM_ITEMS = 3;
private FragmentManager fragmentManager;
public LfPagerAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
Log.d("TEST","TEST");
switch (position) {
case 1:
return FragmentC.newInstance();
case 2:
return FragmentD.newInstance();
default:
return FragmentE.newInstance();
}
}
}
Моя проблема в том, что я не могу сохранить состояние пейджера представления и его дочерние фрагменты при изменении ориентации.
Очевидно, это вызывается при каждом повороте:
this.adapter = new LfPagerAdapter(getChildFragmentManager());
что приведет к воссозданию всего пейджера, верно? В результате
getItem(int position)
будет вызываться при каждом ротации, и фрагмент будет создан с нуля и потеряет свое состояние:
return FragmentC.newInstance();
Я попытался решить это с помощью
if(this.adapter == null)
this.adapter = new LfPagerAdapter(getChildFragmentManager());
в onViewCreated
, но результатом было то, что при вращении фрагменты внутри пейджера, где удалены.
Любые идеи о том, как правильно сохранить состояние внутри пейджера?