当前位置:网站首页>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
边栏推荐
- World's 4th mad scientist dies on his 103rd birthday
- Flutter入门进阶之旅(十)Dialog&Toast
- GRPC整体学习
- Glory to the Blue Yonder, speeds up the strategic growth
- Django cannot link mysql database
- Nature:猪死亡1小时后,器官再次运转
- 报告:想学AI的学生数量已涨200%,老师都不够用了
- ABAP 报表中如何以二进制方式上传本地文件试读版
- 你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
- OpenSSF的开源软件风险评估工具:Scorecards
猜你喜欢
数字化转型之支撑保障单元
Rust从入门到精通04-数据类型
[Microservice ~ Remote Call] Integrate RestTemplate, WebClient, Feign
又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
h264协议
【微服务~远程调用】整合RestTemplate、WebClient、Feign
The grep command Shell regular expressions, the three musketeers
#Internet of Things essay#Xiaoxiong pie equipment development actual combat
AI basketball referee, walking is special, ask harden care don't care
注释、关键字、标识符的区别你知道吗?
随机推荐
The latest interview summary in 20022 brought by Ali senior engineer is too fragrant
又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
全面了解什么是TPS、QPS以及两者的区别
PM2 configuration file
900页数学论文证明旋转的黑洞不会爆炸,丘成桐:30多年来广义相对论首次重大突破...
go基础之web获取参数
ansible-cmdb友好展示ansible收集主机信息
阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
一甲子,正青春,CCF创建六十周年庆典在苏州举行
Information system project managers must memorize the core test sites (63) The main process of project portfolio management & DIPP analysis
智驾科技完成C1轮融资,此前2轮已融4.5亿元
2022牛客多校(六)M. Z-Game on grid
AI篮球裁判火了,走步算得特别准,就问哈登慌不慌
随机快排时间复杂度是N平方?
MySQL 原理与优化,Group By 优化 技巧
箭头函数和普通函数的常见区别
标准C语言学习总结14
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
Batch大小不一定是2的n次幂!ML资深学者最新结论
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来