Andorid 坑 Fragment重叠问题分析和解决
来源:互联网 发布:库存整理软件 编辑:程序博客网 时间:2024/05/16 14:59
一、问题描述
相信大家在使用Fragment的过程中,肯定碰到过Fragment重叠的问题,重启应用就好了。然而原因是什么呢?
二、原因分析
首先,Android管理Fragment有两种方式,使用add、hide、show的方式和replace方式,两种方式各有优缺点。
replace方式
如果使用这种方式,是可以避免重叠的问题,但是每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据,所以我们并不推荐使用这种方式。add、hide、show的方式
虽然这种方式避免了可能重复加载刷新数据的问题,但是会出现重叠的问题。
原因:
当系统内存不足,Fragment 的宿主 Activity 回收的时候,Fragment 的实例并没有随之被回收。Activity 被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层(View Hierarchy),所以当 Activity 通过导航再次被重建时,之前被实例化过的 Fragment 依然会出现在 Activity 中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠。
然而我们还是推荐使用这个,我们可以解决。
三、问题重现
既然要解决问题,自然要重现一下!
1.手机的 “设置” - “开发者选项” - 打开”不保留活动”(主要用于模拟Activity被及时回收)
2.把 app 切换到后台,再重新打开,通过点按不同的 tab 来切换 Fragment
四、解决方法
方法一、简单暴力
通过注释掉这句话,这样主 Activity 因为种种原因被回收的时候就不会保存之前的 fragment state
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
方法二、(推荐使用)
重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
方法三
思路同样是阻止系统恢复Fragment state,在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
成功解决,ok,o(∩_∩)o ,希望可以帮助有需要的同学,如果觉得好,欢迎留个言啊!
五、源码下载
源码下载
- Andorid 坑 Fragment重叠问题分析和解决
- 关于Fragment重叠问题分析和解决
- 解决Fragment重叠问题
- 解决 Fragment 重叠问题
- Fragment 重叠 遮盖问题 完美解决
- 完美解决Fragment重叠的问题
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- 添加和隐藏fragment导致fragment重叠问题
- fragment重叠问题
- Fragment重叠问题
- Android fragment 重叠问题
- fragment重叠问题
- Fragment 重叠(重影)问题
- Fragment重叠问题
- Fragment重叠的问题
- Fragment 重叠(重影)问题
- 使用Fragment代替ActivityGroup,并解决屏幕旋转重叠问题
- Android解决Fragment使用replace方法重叠问题
- shell脚本超时watchdog
- BZOJ 4782 Usaco2017 Open Bovine Genomics
- LVS:四种负载均衡方式比较
- 错误票据
- 洛谷 P 1273 有线电视网
- Andorid 坑 Fragment重叠问题分析和解决
- OJ 刷题 5-3 出租 (20)
- 关于C#的sqlite数据库操作类
- spring和springmvc的父子容器的关系
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
- OpenMP中的常用函数
- 简单解决返回上一个Activity中的adapter数据刷新问题
- 使用vs调用DLL在运行时调用的方法,使用delph调用dll
- 页面转发