当前位置:网站首页>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
边栏推荐
- 基于CAP组件实现补偿事务与幂等性保障
- HAproxy: load balancing
- 十分钟教会你如何使用VitePress搭建及部署个人博客站点
- Rust从入门到精通04-数据类型
- How should the acceptance criteria for R&D requirements be written?| Agile Practices
- 曼城推出可检测情绪的智能围巾,把球迷给整迷惑了
- 数据挖掘-05
- 你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
- 1-hour live broadcast recruitment order: industry big names share dry goods, and enterprise registration opens丨qubit·viewpoint
- 阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
猜你喜欢
Flutter入门进阶之旅(八)Button Widget
智驾科技完成C1轮融资,此前2轮已融4.5亿元
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
shell脚本------函数的格式,传参,变量,递归,数组
#Internet of Things essay#Xiaoxiong pie equipment development actual combat
【小程序】低代码+小游戏=小游戏可视化开发
【微服务~远程调用】整合RestTemplate、WebClient、Feign
苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
Shell正则表达式,三剑客之grep命令
腾讯欲成育碧最大股东/ 米哈游招NLP内容生成研究员/ AI发现四千余物种濒临灭绝...今日更多新鲜事在此...
随机推荐
AI basketball referee, walking is special, ask harden care don't care
FFmpeg在win10上编译安装(配置libx264)
专业人士使用的 11 种渗透测试工具
标准C语言学习总结14
Manchester city launch emotional intelligence scarf can be detected, give the fans
JD.com architects tidy up: what are the core technical knowledge points of jvm and performance tuning
注释、关键字、标识符的区别你知道吗?
Batch大小不一定是2的n次幂!ML资深学者最新结论
Recommend a free 50-hour AI computing platform
2022牛客多校(六)M. Z-Game on grid
【HCIP持续更新】IS-IS协议原理与配置
FFmpeg库在win10上配置使用(不配置libx264)
曲鸟全栈UI自动化教学(八):框架代码讲解和进一步优化
微信支付开发流程
FFmpeg compiles and installs on win10 (configure libx264)
曼城推出可检测情绪的智能围巾,把球迷给整迷惑了
两分钟录音就可秒变语言通!火山语音音色复刻技术如何修炼而成?
Shell正则表达式,三剑客之grep命令
OpenSSF的开源软件风险评估工具:Scorecards
AI篮球裁判火了,走步算得特别准,就问哈登慌不慌