标题好长啊,我也不想啊,为了你们,我只能这么写这么长,描述清楚问题嘛!
再说一遍问题 : Fragment
内嵌 ViewPager
, 而ViewPager
各个页面使用Fragment
实现,第一次进入没问题,第二次及其以后的进入前两页空白,什么都没有!
因为之前从没有做过多Fragment
嵌套,之前开发都是 单 Activity
- 单 Fragment
实现,这次改变了开发思路,因为是小应用,就想着使用 单Activity
- 多 Fragment
实现,没想到在Fragment
中使用ViewPager
的时候,会出现空白问题,查了好多说是 ViewPagerAdapter
重新实例化了,但我想了,这每次进入肯定要实例化啊,因为重新进入了啊!后就那个纠结啊,还有人说使用 getChildFragmentManager
() ,但是当时我的Adapter
使用的是FragmentStatePagerAdapter
这就尴尬了,居然报下面错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:667)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1319)
at android.view.View.dispatchRestoreInstanceState(View.java:13795)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3016)
....
不开心了,明明Google
推荐使用 FragmentStatePagerAdapter
到头来居然使用不了!
当然你可以看下面文章学习使用 FragmentStatePagerAdapter
:
Android-ViewPager(FragmentPagerAdapter 和 FragmentStatePagerAdapter
最后改成FragmentPagerAdapter
才正常,下面总结下。
Fragment
内嵌 ViewPager
, 而ViewPager
各个页面使用Fragment
实现,第一次进入没问题,第二次及其以后的进入前两页空白,什么都没有!
当时我的实现是:
Fragment
初始化adapter
使用的是 getFragmentManager()
ViewPager
的adapter
是 FragmentStatePagerAdapter
比如: 下面是我错误的实现
ContentFragment
managePageAdapter = new ManagePageAdapter(getFragmentManager(),fragments);
ManagePageAdapter
public class ManagePageAdapter extends FragmentStatePagerAdapter {}
来张很烂的图,说明几个内容的关系:
Fragment
都继承自BaseFragment
ContentFragment
内嵌 ViewPager
ViewPager
的每个页面使用的是 ListFragment
实现ContentFragment
在Activity
中被commit
解决方案就是 如图所示:
ViewPager
的Adapter
使用 FragmentPageAdapter
实现ContentFragment
中初始化ViewPagerAdapter
的时候使用`getChildFragmentManager()比如 下面是正确的配置:
ContentFragment
managePageAdapter = new ManagePageAdapter(getChildFragmentManager(),fragments);
ViewPagerAdapter
public class ManagePageAdapter extends FragmentPagerAdapter{}
如果在宿主Fragment
中使用 getFragmentManager()
初始化 Adapter
的时候,会将宿主Fragment
中Viewpager
中的子Fragment
添加到宿主的FragmentManager
;
看图:
ContentFragment
中使用getFragmentManager()
其实就是Activity
中的FragmentManager
比如 打印Activity中的FragmentManager会发现 Viewpager中的Fragment被加入其中,那么这就乱套了,这个实例在第一次加载的时候被加入,所以第一次正常显示,后面的因为存在了实例未被销毁,所以在第二次及其后面的显示中,就没有再次被加入,除非它被销毁或移除才可以。
V/WorkActivity: FragmentManager >> 3
V/WorkActivity: >> ManageFragment{2de85921 #0 id=0x7f0e0080}
V/WorkActivity: >> ManageListFragment{279c3146 #1 id=0x7f0e009d android:switcher:2131624093:0}
V/WorkActivity: >> ManageListFragment{16a87f07 #2 id=0x7f0e009d android:switcher:2131624093:1}
知道了原因,就使用 分而治之 策略,在 Viewpager
中的子Fragment
使用 ContentFragment
中的ChildFragmentManager
来管理,各管各的就可以了。
如图 :
ContentFragment
使用 getChildFragmentManager()
获取 子 FramgetManager
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。