fragment中嵌套viewPager,viewPager中使用FragmentPagerAdapter管理多个fragment时,外面的fragment切换时,viewPager中的fragment数据丢失问题。
刚开始,在嵌套viewPager的fragment中管理viewPager时,使用:(ImageNewsMainPagerAdapter继承FragmentPagerAdapter)
mAdapter = new ImageNewsMainPagerAdapter(getFragmentManager(),mFragments,mTitles); mViewPager.setAdapter(mAdapter); mAdapter.notifyDataSetChanged();
根据上面的代码可以看到,在创建adapter时,使用了getFragmentManager();这样会导致外面的fragment切换时,viewPager中的fragment的数据会丢失,即显示白屏或黑屏(没有加载任何数据);
解决方法:
mAdapter = new ImageNewsMainPagerAdapter(getChildFragmentManager(),mFragments,mTitles); mViewPager.setAdapter(mAdapter); mAdapter.notifyDataSetChanged();
把getFragmentManager()替换成getChildFragmentManager(),这样外面的fragment切换时,viewPager中的fragment就能正常显示数据了。
其中,getChildFragmentManager()的源码:
/** * Return a private FragmentManager for placing and managing Fragments * inside of this Fragment. */ final public FragmentManager getChildFragmentManager() { if (mChildFragmentManager == null) { instantiateChildFragmentManager(); if (mState >= RESUMED) { mChildFragmentManager.dispatchResume(); } else if (mState >= STARTED) { mChildFragmentManager.dispatchStart(); } else if (mState >= ACTIVITY_CREATED) { mChildFragmentManager.dispatchActivityCreated(); } else if (mState >= CREATED) { mChildFragmentManager.dispatchCreate(); } } return mChildFragmentManager; }
即fragment中嵌套fragment时,使用getChildFragmentManager()管理fragment中的子fragment;而getFragmentManager()的使用,是在activity中使用fragment时,用来管理fragment的。