Fragment中嵌套ViewPager数据空白页异常问题分析
2017-12-28 13:50
447 查看
开题思考:Fragment放ViewPager,ViewPager里面是fragment。第一次进入没问题,再次进入ViewPager的fragment时里面内容就没了,出现数据空白页异常问题。
描述:activity中放了两个Fragment,分别为待审核页、已加入页;其中待审核fragment中利用viewpager放了三个fragment,分别为全部、审核加入、审核退出,第二次切换待审核、已加入fragment时,会发现待审核fragment中ViewPager承载的Fragment会出现数据空白页现象。如下图所示:
根据经验感觉是FragmentManager出了问题,因为FragmentManager的职责本来就是负责管理Fragment,包括对Fragment栈中的Fragement进行添加,删除,替换等操作,那既然出现了空白页,肯定是FragmentManager在进行Fragment替换时没有正常工作,查看Fragment以及FragmentActivity的源码发现有三种类型的FragmentManager,分别为getFragmentManager、getSupportFragmentManager、getChildFragmentManager;其中getFragmentManager跟getChildFragmentManager在Fragment类中,而getSupportFragmentManager位于FragmentActivity中,而getFragmentManager虽然在Fragment中,但是官方注释中最后有提到,如果当前Fragment是另外一个Fragment的子类,则当前FragmentManager属于父类,这就意味着,三者虽然相似但管理的对象却是不同的。
三者源码如下:
getSupportFragmentManager:
getChildFragmentManager:
根据google官方的描述(PS:English自译拿不出手),大意为getFragmentManager、跟getSupportFragmentManager是为了获取能管理和当前Activity有关联的Fragment的FragmentManager,也就是说此二者是属于Activity的,再来看下getChildFragment的官方注释
上文注释大致意思返回一个私有的FragmentManager来管理Fragment,它属于Fragment。至此整个问题就梳理清楚了,因为文章开题提出的问题,是在Fragment中使用ViewPager装载Fragment,也就是说,在Fragment中应该是用的是Fragemnt类中提供的manager方法,即在给ViewPager设置FragmentManager的时候应该使用getChildFragmentManager。
文章开题提到的给ViewPager设置Adapter:
经过分析应该修改为:
归纳总结:getFragmentManager()所得到的是所在fragment
的父容器的管理器,而getChildFragmentManager()所得到的是在fragment 里面子容器的管理器,即getFragmentManager到的是activity对所包含fragment的Manager,而如果是fragment作为容器装载Fragment,就需要利用getChildFragmentManager()了
描述:activity中放了两个Fragment,分别为待审核页、已加入页;其中待审核fragment中利用viewpager放了三个fragment,分别为全部、审核加入、审核退出,第二次切换待审核、已加入fragment时,会发现待审核fragment中ViewPager承载的Fragment会出现数据空白页现象。如下图所示:
根据经验感觉是FragmentManager出了问题,因为FragmentManager的职责本来就是负责管理Fragment,包括对Fragment栈中的Fragement进行添加,删除,替换等操作,那既然出现了空白页,肯定是FragmentManager在进行Fragment替换时没有正常工作,查看Fragment以及FragmentActivity的源码发现有三种类型的FragmentManager,分别为getFragmentManager、getSupportFragmentManager、getChildFragmentManager;其中getFragmentManager跟getChildFragmentManager在Fragment类中,而getSupportFragmentManager位于FragmentActivity中,而getFragmentManager虽然在Fragment中,但是官方注释中最后有提到,如果当前Fragment是另外一个Fragment的子类,则当前FragmentManager属于父类,这就意味着,三者虽然相似但管理的对象却是不同的。
三者源码如下:
getFragmentManager:
/** * Return the FragmentManager for interacting with fragments associated * with this fragment's activity. Note that this will be non-null slightly * before {@link #getActivity()}, during the time from when the fragment is * placed in a {@link FragmentTransaction} until it is committed and * attached to its activity. * * <p>If this Fragment is a child of another Fragment, the FragmentManager * returned here will be the parent's {@link #getChildFragmentManager()}. */ final public FragmentManager getFragmentManager() { return mFragmentManager; }
getSupportFragmentManager:
/** * Return the FragmentManager for interacting with fragments associated * with this activity. */ public FragmentManager getSupportFragmentManager() { return mFragments.getSupportFragmentManager(); }
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; }
根据google官方的描述(PS:English自译拿不出手),大意为getFragmentManager、跟getSupportFragmentManager是为了获取能管理和当前Activity有关联的Fragment的FragmentManager,也就是说此二者是属于Activity的,再来看下getChildFragment的官方注释
/** * Return a private FragmentManager for placing and managing Fragments * inside of this Fragment. */ final public FragmentManager getChildFragmentManager() {
上文注释大致意思返回一个私有的FragmentManager来管理Fragment,它属于Fragment。至此整个问题就梳理清楚了,因为文章开题提出的问题,是在Fragment中使用ViewPager装载Fragment,也就是说,在Fragment中应该是用的是Fragemnt类中提供的manager方法,即在给ViewPager设置FragmentManager的时候应该使用getChildFragmentManager。
文章开题提到的给ViewPager设置Adapter:
viewPager.setAdapter(new ManageFragmentPagerAdapter(getFragmentManager(), list));
经过分析应该修改为:
viewPager.setAdapter(new ManageFragmentPagerAdapter(getChildFragmentManager(), list));
归纳总结:getFragmentManager()所得到的是所在fragment
的父容器的管理器,而getChildFragmentManager()所得到的是在fragment 里面子容器的管理器,即getFragmentManager到的是activity对所包含fragment的Manager,而如果是fragment作为容器装载Fragment,就需要利用getChildFragmentManager()了
相关文章推荐
- Fragment嵌套ViewPager切换后数据消失ViewPager空白问题
- fragment嵌套viewpager嵌套fragment第二次加载数据不显示问题
- Fragment嵌套ViewPager切换后数据消失ViewPager空白问题
- 关于ViewPager嵌套Fragment,第二次加载数据不显示问题
- Fragment嵌套ViewPager切换后数据消失ViewPager空白问题
- Fragment嵌套ViewPager切换后数据消失ViewPager第二个空白问题
- viewpager嵌套fragment,数据预加载的问题
- Fragment嵌套ViewPager切换后数据消失ViewPager空白问题
- 关于ViewPager嵌套Fragment,第二次加载数据不显示问题
- ViewPager中嵌套Fragment,切换之后出现空白页没有加载数据的解决方法
- ViewPager嵌套Fragment来回滑动重新加载数据
- 我来谈谈ViewPager搭配FragmentAdapter的数据丢失问题
- 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析
- 关于viewpager中嵌套的fragment中的listview的横向滑动的滑动冲突的问题。
- fragment里面嵌套ViewPager,解决切换fragment了之后ViewPager中的内容消失的问题
- Viewpager+fragment数据更新问题解析
- 关于fragment中嵌套viewpager的问题
- 关于viewpager+fragment中嵌套viewpager+fragment的问题处理:
- ViewPager中切换界面Fragment被销毁的问题分析
- Android-ViewPager+Fragment数据更新问题