Android - Fragment 内嵌 ViewPager ,ViewPager各个页面使用Fragment第二次进入空白界面


唠叨

标题好长啊,我也不想啊,为了你们,我只能这么写这么长,描述清楚问题嘛!

再说一遍问题 :
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()
  • ViewPageradapterFragmentStatePagerAdapter

比如: 下面是我错误的实现

ContentFragment

   managePageAdapter = new ManagePageAdapter(getFragmentManager(),fragments);

ManagePageAdapter

public class ManagePageAdapter extends FragmentStatePagerAdapter {}

解决

来张很烂的图,说明几个内容的关系:

这里写图片描述

  • 所有的Fragment都继承自BaseFragment
  • ContentFragment 内嵌 ViewPager
  • ViewPager 的每个页面使用的是 ListFragment 实现
  • 少画了一层: ContentFragmentActivity中被commit

解决方案就是 如图所示:

  • ViewPagerAdapter使用 FragmentPageAdapter实现
  • ContentFragment中初始化ViewPagerAdapter的时候使用`getChildFragmentManager()

比如 下面是正确的配置:

ContentFragment

   managePageAdapter = new ManagePageAdapter(getChildFragmentManager(),fragments);

ViewPagerAdapter

public class ManagePageAdapter extends FragmentPagerAdapter{}

问题探究

如果在宿主Fragment中使用 getFragmentManager() 初始化 Adapter 的时候,会将宿主FragmentViewpager中的子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
  • 分而治之 ,各管各的内容

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
China Scenic Area
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告