В моем приложении активность фрагмента содержит два фрагмента: фрагмент 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
, но в результате при ротации фрагменты внутри пейджера удалялись.
Любые идеи, как правильно сохранить состояние внутри пейджера?
Fragment
автоматически управляются и восстанавливаютсяFragmentManager
, а реализацииPagerAdapter
предназначены для сохранения постоянной ссылки на них.getItem()
будет вызываться только один раз для инициализации каждой страницы. - person corsair992   schedule 10.12.2014Fragments
уже сохранены. что именно ты хочешь исполнить? Вы можете описать немного больше? - person Mehul Joisar   schedule 10.12.2014