当前位置:网站首页>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热题(11.合并两个有序链表)
- "Digital Economy Panorama White Paper" Special Analysis of Banking Industry Intelligent Marketing Application Released
- Recommend a free 50-hour AI computing platform
- 软件测试——金融测试类面试题,看完直接去面试了
- ThreadLocal的简单理解
- Here comes the question: Can I successfully apply for 8G memory on a machine with 4GB physical memory?
- electron 应用开发优秀实践
- 900页数学论文证明旋转的黑洞不会爆炸,丘成桐:30多年来广义相对论首次重大突破...
- 虚拟机安装出现的问题汇总
- 随机快排时间复杂度是N平方?
猜你喜欢
保存Simulink仿真模型为图片或者PDF的方法
Scala Advanced (7): Collection Content Summary (Part 1)
AI篮球裁判火了,走步算得特别准,就问哈登慌不慌
链表噩梦之一?5000多字带你弄清它的来龙去脉
#Internet of Things essay#Xiaoxiong pie equipment development actual combat
箭头函数和普通函数的常见区别
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...
MongoDB-查询中$all的用法介绍
Flutter入门进阶之旅(七)GestureDetector
World's 4th mad scientist dies on his 103rd birthday
随机推荐
Scala Advanced (7): Collection Content Summary (Part 1)
全面了解什么是TPS、QPS以及两者的区别
Flutter入门进阶之旅(七)GestureDetector
Adalvo acquires its first branded product, Onsolis
How to upload local file trial version in binary mode in ABAP report
Gumbel_Softmax 概要
【无标题】
The FFmpeg library is configured and used on win10 (libx264 is not configured)
Two minutes recording can pass by second language!The volcano how to practice and become voice tone reproduction technology?
基于STM32+铂电阻设计的测温仪
微服务架构的核心关键点
Manchester city launch emotional intelligence scarf can be detected, give the fans
WeChat payment development process
Blazor Server (9) from scratch -- modify Layout
Resolved IndentationError: unindent does not match any oute r indentation Level
1小时直播招募令:行业大咖干货分享,企业报名开启丨量子位·视点
AI basketball referee, walking is special, ask harden care don't care
LeetCode热题(11.合并两个有序链表)
Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
箭头函数和普通函数的常见区别