当前位置:网站首页>Fragment中嵌套ViewPager数据空白页异常问题分析
Fragment中嵌套ViewPager数据空白页异常问题分析
2022-08-09 12:04:00 【谢栋_】
开题思考: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属于父类,这就意味着,三者虽然相似但管理的对象却是不同的。
三者源码如下:
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
边栏推荐
- LeetCode #101. Symmetric Binary Tree
- 告别手摇织布机的AI时代
- Information system project managers must memorize the core test sites (63) The main process of project portfolio management & DIPP analysis
- #Internet of Things essay#Xiaoxiong pie equipment development actual combat
- 索引index
- 微信一面:一致性哈希是什么,使用场景,解决了什么问题?
- The redis library cannot be imported
- 数字化转型之支撑保障单元
- Programmer's Exclusive Romance - Use 3D Engine to Realize Fireworks in 5 Minutes
- The latest interview summary in 20022 brought by Ali senior engineer is too fragrant
猜你喜欢

中科院打脸谷歌:普通电脑追上量子优越性,几小时搞定原本要一万年的计算...

已解决IndentationError: unindent does not match any oute r indentation Level

无需精子卵子子宫体外培育胚胎,Cell论文作者这番话让网友们炸了

阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

MongoDB-查询中$all的用法介绍

Simple understanding of ThreadLocal

智驾科技完成C1轮融资,此前2轮已融4.5亿元

GRPC整体学习

鹅厂机器狗花式穿越10m梅花桩:前空翻、单桩跳、起身作揖...全程不打一个趔趄...

系统提供的堆 VS 手动改写堆
随机推荐
发明时代,「幂集创新」事关你我
ABAP 报表中如何以二进制方式上传本地文件试读版
放下手机吧:实验表明花20分钟思考和上网冲浪同样快乐
AI basketball referee, walking is special, ask harden care don't care
Experiment record: the process of building a network
ThreadLocal的简单理解
箭头函数和普通函数的常见区别
Shell正则表达式,三剑客之grep命令
JD.com architects tidy up: what are the core technical knowledge points of jvm and performance tuning
h264协议
专业人士使用的 11 种渗透测试工具
FFmpeg库在win10上配置使用(不配置libx264)
MySQL查询性能优化七种武器之索引潜水
【小程序】低代码+小游戏=小游戏可视化开发
微信小程序支付及退款整体流程
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
Glory to the Blue Yonder, speeds up the strategic growth
曼城推出可检测情绪的智能围巾,把球迷给整迷惑了
1小时直播招募令:行业大咖干货分享,企业报名开启丨量子位·视点
无重复字符的最长子串