ViewPager片段在更改屏幕旋转时消失

我正在使用Fragment s包含ViewPager Android应用程序,如下所示:

MainActivityMainActivityFragmentscreenSlideViewPagerFragment s))),这意味着:

Activity 包含的 Fragment 包含 ViewPager 包含的 Fragment

现在我的问题是当旋转设备或更改屏幕旋转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; } } } 

编辑2 屏幕旋转后的活动

很显然, MainActivityMainActivityFragment被加载,并且certificate是ActionBar ,同样注意到ViewPager也被加载,因为你仍然可以在页面之间导航(蓝灯意味着页面到达最后一页),但是你看不到它的内容。

Solutions Collecting From Web of "ViewPager片段在更改屏幕旋转时消失"

它看起来像你的主要活动是使用getSupportFragmentManager(),而你的片段正在使用getFragmentManager()。

不知道这是否值得回答post,但我的评价太低,不能回复任何其他方式。 🙂

编辑:我相信你可能还需要扩展与支持库的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; } } } 

我尝试了很多解决scheme,但在任何一个方面取得成功 最后我修正如下:

  • 使用getActivity()。getSupportFragmentManager()而不是getChildFragmentManager()

  • 在你的ViewPagerAdapter类中重写getItemId(int position)方法,如下所示:

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

对我来说,它就像魅力一样,请在这里评论你的观点。

对于有这个问题的人,你可以试试这个:

 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”

避免再次创buildviewpager。 把onCreateView的代码放在onCreate()中。 并使你的片段使用onRetainInstance(true)。 因此,这不会重新创build片段,因为视图在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() 。 有什么令人困惑的是android API有Activity.getFragmentManager() ,但是如果你想要支持旧设备,你需要使用Activity.getSupportFragmentManager() 。 但是,这个特定的问题不是支持旧的API。

问题是你有一个活动有一个拥有多个片段的ViewPager的片段。 碎片中有碎片! 碎片的原始devise并没有真正处理这个用例,后来被更新来处理它。 当碎片中有碎片时,您需要使用:

Fragment.getChildFragmentManager()

Fragment你可以selectFragment.getFragmentManager() ,它返回ActivityFragmentManagerFragment.getChildFragmentManager() ,它返回这个FragmentFragmentManager ,这个Fragment正确地在你的FragmentFragment的范围。