Фрагменты ViewPager исчезают при изменении поворота экрана

Я работаю над андроидным приложением, которое содержит ViewPager с Fragment , например:

MainActivity ( MainActivityFragment ( screenSlideViewPager ( Fragment s))), что означает:

Activity содержит Fragment содержит ViewPager содержит Fragment s

Теперь моя проблема в том, что при повороте устройства или изменении поворота экрана все фрагменты в ViewPager исчезают.

Любые идеи для решения этой проблемы?

ИЗМЕНИТЬ 1

MainActivity.java:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentByTag(TAG) == null) { final FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.add(android.R.id.content, new MainActivityFragment(), TAG); ft.commit(); } } 

MainActivityFragment.java:

 public class MainActivityFragment extends Fragment { private ViewPager mPager = null; private PagerAdapter mPageAdapter = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View reVal = inflater.inflate(R.layout.activity_main, container, false); mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent); mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager()); mPager.setAdapter(mPageAdapter); return reVal; } private MainGridViewFragment mainGridFragment; private AlphabetGridViewFragment alphabetGridFragment; private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public android.app.Fragment getItem(int position) { switch (position) { case 1: mainGridFragment = new MainGridViewFragment(); return mainGridFragment; case 0: alphabetGridFragment = new AlphabetGridViewFragment(); return alphabetGridFragment; default: return null; } } @Override public int getCount() { return 2; } } } 

EDIT 2 Активность после вращения экрана

Очевидно, что MainActivity и MainActivityFragment загружены, а доказательство – ActionBar , также обратите внимание, что ViewPager загружен, потому что вы все еще можете перемещаться между страницами (синий свет означает, что пейджер достиг последней страницы), но вы не можете увидеть его содержимое ,

Solutions Collecting From Web of "Фрагменты ViewPager исчезают при изменении поворота экрана"

Похоже, ваша основная деятельность – использование getSupportFragmentManager (), в то время как ваш фрагмент использует getFragmentManager ().

Не уверен, что это достойно ответа, но мой рейтинг слишком низок, чтобы ответить любым другим способом. 🙂

Edit: Я считаю, что вам также может понадобиться расширить FragmentActivity с помощью библиотеки поддержки.

См. https://stackoverflow.com/a/10609839/2640693

Изменить 2:

 public class MainActivityFragment extends FragmentActivity { private ViewPager mPager = null; private PagerAdapter mPageAdapter = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View reVal = inflater.inflate(R.layout.activity_main, container, false); mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent); mPageAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager()); mPager.setAdapter(mPageAdapter); return reVal; } private MainGridViewFragment mainGridFragment; private AlphabetGridViewFragment alphabetGridFragment; private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 1: mainGridFragment = new MainGridViewFragment(); return (Fragment)mainGridFragment; case 0: alphabetGridFragment = new AlphabetGridViewFragment(); return (Fragment)alphabetGridFragment; default: return null; } } @Override public int getCount() { return 2; } } } 

Для тех, у кого есть проблемы с этим, вы можете попробовать следующее:

 private void InitializeUI(){ mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_exame2); InitializeUI(); } 

Я провел 2 дня вокруг этой проблемы, это единственное, что сработало для меня, помните, чтобы добавить android: configChanges = "screenSize | orientation" к вашей активности в манифесте

Я попробовал много решений, но добился успеха в любом. Наконец, я исправил, как показано ниже:

  • Используйте getActivity (). GetSupportFragmentManager (), а не getChildFragmentManager ()

  • Переопределите метод getItemId (int position) в классе ViewPagerAdapter, как показано ниже:

     @Override public long getItemId(int position) { return System.currentTimeMillis(); } 

Для меня это работает как шарм, пожалуйста, также прокомментируйте здесь свое мнение.

Избегайте создания viewpager снова. Поместите код onCreateView в onCreate (). И сделайте ваш фрагмент использовать onRetainInstance (true). Следовательно, это не должно воссоздавать фрагмент и снова, потому что представление находится в onCreate (), оно не будет вызываться снова.

Проверьте в onCreateView (), существует ли представление, если да, то удалите его. Отрывки:

 //creates the view private View createView(Bundle savedInstanceState) { View view = getActivity().getLayoutInflater().inflate(your_layout, null, false); //viewpager return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //retains fragment instance across Activity re-creation setRetainInstance(true); viewRoot = createView(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (viewRoot != null && viewRoot.getParent() != null) { ViewGroup parent = (ViewGroup) viewRoot.getParent(); parent.removeView(viewRoot); Log.i("Test", "**************view.getParent(): " + viewRoot.getParent() + " " + viewRoot); } return viewRoot; } 

Вам лучше использовать getChildFragmentManager() вместо getFragmentManager() . Ты использовал

 mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager()); 

Это должно было быть

 mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getChildFragmentManager()); 

В вашем фрагменте

У меня была такая же проблема. Это очень запутанно, но эта нить помогла мне, кроме того, что ответы на самом деле не объяснили, почему это работает.

Исправление этой проблемы заключается в использовании Fragment.getChildFragmentManager() . Что сбивает с толку, так это то, что у андроидного API есть Activity.getFragmentManager() , но если вы пытаетесь поддерживать старые устройства, вам нужно использовать Activity.getSupportFragmentManager() . Однако эта конкретная проблема заключается не в поддержке старых API.

Проблема в том, что у вас есть Activity, у которого есть фрагмент, которому принадлежит ViewPager, которому принадлежит несколько фрагментов. У вас есть фрагменты внутри фрагментов! Первоначальный дизайн Fragments на самом деле не справлялся с этим вариантом использования, а позже был обновлен для его обработки. Когда у вас есть фрагменты внутри фрагментов, вам необходимо использовать:

Fragment.getChildFragmentManager()

Изнутри Fragment вас есть выбор Fragment.getFragmentManager() который возвращает FragmentManager Activity vs Fragment.getChildFragmentManager() который возвращает FragmentManager для этого Fragment который правильно просматривает Fragment s внутри вашего Fragment .