一、问题描述

相信大家在使用Fragment的过程中,肯定碰到过Fragment重叠的问题,重启应用就好了。然而原因是什么呢?

二、原因分析

首先,Android管理Fragment有两种方式,使用add、hide、show的方式和replace方式,两种方式各有优缺点。

  1. replace方式
    如果使用这种方式,是可以避免重叠的问题,但是每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据,所以我们并不推荐使用这种方式。

  2. 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

@Override
protectedvoidonSaveInstanceState(Bundle outState) {
//如果用以下这种做法则不保存状态,再次进来的话会显示默认tab
//总是执行这句代码来调用父类去保存视图层的状态
//super.onSaveInstanceState(outState);
}

方法二、(推荐使用)

重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象

    @Overridepublic void onAttachFragment(Fragment fragment) {if (tab1 == null && fragment instanceof Tab1Fragment)tab1 = fragment;if (tab2 == null && fragment instanceof Tab2Fragment)tab2 = fragment;if (tab3 == null && fragment instanceof Tab3Fragment)tab3 = fragment;if (tab4 == null && fragment instanceof Tab4Fragment)tab4 = fragment;}

方法三

思路同样是阻止系统恢复Fragment state,在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。

    protected void onSaveInstanceState(Bundle outState) {FragmentTransaction transaction = fm.beginTransaction();transaction.remove(tab1);transaction.remove(tab2);transaction.remove(tab3);transaction.remove(tab4);transaction.commitAllowingStateLoss();super.onSaveInstanceState(outState);}

成功解决,ok,o(∩_∩)o ,希望可以帮助有需要的同学,如果觉得好,欢迎留个言啊!

五、源码下载

源码下载

关于Fragment重叠问题分析和解决相关推荐

  1. [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法

    [转]Android fragment 重叠问题--通过hide,show方式导致的解决方法 参考文章: (1)[转]Android fragment 重叠问题--通过hide,show方式导致的解决 ...

  2. 解决 Fragment 重叠问题

    Fragment 重叠问题的产生 因为某些原因(例如旋转屏幕)而导致 Activity 发生重建时,Fragment 也会发生重建.重建的 Fragment 如果没有保存状态,那么它的 mHidden ...

  3. 解决Bug:关于折叠屏手机(Android)出现fragment重叠问题

    文 | Promise Sun 一.Bug问题描述 关于安卓折叠手机出现fragment重叠问题: 运行手机:华为折叠手机(HUAWEI Mate X2,很贵的那款) Bug:使用华为折叠手机,当折叠 ...

  4. Fragment重叠问题引发的思考

    参考: http://stackoverflow.com/questions/16189088/overlapping-hidden-fragments-after-application-gets- ...

  5. Android Fragment重叠问题解决

    最近在做项目的时候,遇到了fragment重叠的问题.具体的情况是,我在一个fragment中,通过add的到FragmentTransaction的方式,又放了四个子fragment allFrg, ...

  6. Fragment重叠问题简单解决方案

    在项目中,遇到了fragment重叠的问题,具体是Activity里面有4个fragment,是通过FragmentTransaction的add方法进来的,并通过其show和hide控制子fragm ...

  7. android app画面重叠,Android重新打开APP应用程序或activity后fragment 重叠问题

    问题发生的场景: 产生原因: 解决方法1: (太low,不推荐使用.不能恢复重启前的界面) 直接在包含Fragment的Activity中复写onSaveInstanceState()方法,使其空实现 ...

  8. 杂散干扰解决办法_实用干货——6种常见杂散问题的成因分析及解决办法

    原标题:实用干货--6种常见杂散问题的成因分析及解决办法 虽然目前的高分辨率SAR ADC和Σ-Δ ADC可提供高分辨率和低噪声,但可能难以实现数据手册上的额定SNR性能.而要达到最佳SFDR,也就是 ...

  9. 杂散干扰解决办法_6种直流电源杂散干扰的成因分析及解决办法

    6种直流电源杂散干扰的成因分析及解决办法 所谓散杂干扰就是一个系统的发射频段外的杂散发射落入到另外一个系统接收频段内造成的干扰.杂散干扰直接影响了系统的接收灵敏度.若杂散落入某个系统接收频段内的幅度较 ...

最新文章

  1. 计算机相关的考试题目,计算机考试相关题目汇总.doc
  2. Android相机预览方向
  3. VS2017桌面应用程序打包成.msi或者.exe
  4. 从Client应用场景介绍IdentityServer4(一)
  5. 编程语言_java_面试题0002
  6. 为什么大部分人会碌碌无为?
  7. 几个北大和南开学霸的公众号,值得学习
  8. VS运行时错误 CRT detected that the application wrote to memory after end of heap buffer
  9. ADSL拨号网络环境下实时视频广播的完美实现
  10. 台式计算机睡眠快捷键,电脑如何设置快捷方式迅速进入睡眠的状态?
  11. AM、PM是上午和下午的英文缩写、英文缩写(英语星期月份等)
  12. ubuntu系统瘦身-清理系统垃圾文件
  13. 创业感悟:不忘初心,方得始终
  14. 为什么Multi-DRM如此重要?
  15. 11gR2 RAC vip和network资源的依赖性与频繁failover
  16. 如何取消Idea里面的中文语法检查
  17. 缓解过拟合(overfitting)的方法
  18. HTML标签----图文详解
  19. (近5w字)面向小白のVue全家桶开发电商管理系统项目总结文档
  20. USB鼠标、键盘数据格式

热门文章

  1. 一阶非线性常微分方程解的存在性定理—Picard-Lindelof定理
  2. 微信开发-发放普通红包(java代码实例)
  3. 网站各类备案方法指引
  4. Shader Forge 入门学习(一) 基础操作
  5. html显示转发次数,qq空间中说说被转发的次数不显示出来的原因 – 手机爱问
  6. 判断一个素数是否可以写成两个立方数的差(预处理+二分)
  7. 机器学习:基于KNN对葡萄酒质量进行分类
  8. 域控制器组策略:域用户加入域,禁止USB移动存储
  9. Linux常用截图软件
  10. 鲜花自动售货机方案设计详解