前言

绝大部分的app首页架构均为Tab + Fragment,当程序发生异常自动恢复,或者app长时间处于后台恢复后,Fragment出现重影(重叠)等问题。当然部分不顾及页面层级的小伙伴,每个Fragment的view都设置了背景,可能就察觉不出来,但是并不代表没有。然后很多Fragment里面又还有Fragment的使用不当甚至会出现白屏的现象。

1 重影(重叠)

1.1 触发原因

Activity在非正常退出(点返回等属于正常退出)会调用 onSaveInstanceState 方法来保存数据,其中就包括视图层(View Hierarchy),当该Activity在此被重建时,会调用onRestoreInstanceState方法,之前被实例化过的 Fragment 依然会出现在 Activity 中,然后按照正常生命流程走,在onCreate中FragmentTransaction相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了。综上这些因素导致了多个Fragment重叠在一起

1.2 如何调试

  • 当你不确定你的app是否存在该问题时,先检查fragment是否有背景,如果有,先删掉
  • 手机的 “设置” - “开发者选项” - 打开”不保留活动”(主要用于模拟Activity被及时回收)
  • 把 app 切换到后台,再重新打开,通过点按不同的 tab 来切换 Fragment,打开其他页面在回来,在切换tab
  • 如果有重影,请接着看下面的解决方案,如果没有,恭喜你,你的代码太完美了,希望你能提供更优质的解决方案

1.3 解决方案

1.3.1 在onCreate方法判断 savedInstanceState 参数是否为null (不推荐)

如果savedInstanceState不为null,说明该Activity有保存的实例,在add fragment 时添加标签,具体看源码 selectedFragment方法 其中XXX.getClass().getSimpleName()为Tag 为演示才这样写的

private void selectedFragment(int position) {mPosition = position;FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();hideFragment(transaction);switch (position) {case 0:if (fragment1 == null) {fragment1 = new Fragment1();transaction.add(R.id.fl_content, fragment1,fragment1.getClass().getSimpleName());} else {transaction.show(fragment1);}break;case 1:if (fragment2 == null) {fragment2 = new Fragment2();transaction.add(R.id.fl_content, fragment2,fragment2.getClass().getSimpleName());} else {transaction.show(fragment2);}break;case 2:if (fragment3 == null) {fragment3 = new Fragment3();transaction.add(R.id.fl_content, fragment3,fragment3.getClass().getSimpleName());} else {transaction.show(fragment3);}break;case 3:if (fragment4 == null) {fragment4 = new Fragment4();transaction.add(R.id.fl_content, fragment4,fragment4.getClass().getSimpleName());} else {transaction.show(fragment4);}break;default:}transaction.commitAllowingStateLoss();}复制代码

onCreate方法代码

@Override
protected void onCreate(Bundle savedInstanceState) {super.initData(savedInstanceState);//不为null,说明是死而复活,移除已经存在的fragmentif (savedInstanceState != null) {FragmentTransaction mTransaction = getSupportFragmentManager().beginTransaction();mTransaction.remove(mManager.findFragmentByTag(Fragment4.class.getSimpleName()));mTransaction.remove(mManager.findFragmentByTag(Fragment3.class.getSimpleName()));mTransaction.remove(mManager.findFragmentByTag(Fragment2.class.getSimpleName()));mTransaction.remove(mManager.findFragmentByTag(Fragment1.class.getSimpleName()));mTransaction.commitAllowingStateLoss();}selectedFragment(mPosition);......
}
复制代码
1.3.2 重写onSaveInstanceState onRestoreInstanceState 方法 (推荐)

无需为Fragment 添加Tag 保持最开始的实现逻辑不动 源码

    *** 原理  去除Super 切断原有恢复逻辑 保存位置* @param outState*/@SuppressLint("MissingSuperCall")@Overrideprotected void onSaveInstanceState(Bundle outState) {/* 记录当前的position */outState.putInt("position", mPosition);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);mPosition = savedInstanceState.getInt("position");selectedFragment(mPosition);}复制代码

2 白屏

2.1 触发原因

当Fragment里面嵌套Fragment时,没有使用getChildFragmentManager(),在Activity恢复后无法获取FragmentManager内的Fragment,从而出现白屏。

2.1 解决方案

Fragment嵌套Fragment时,使用getChildFragmentManager()获取事务

Fragment重影(重叠)白屏等问题原理解析,以及解决方案相关推荐

  1. 机器视觉技术原理解析及解决方案

    机器视觉技术原理解析及解决方案 机器视觉就是用机器代替人眼来做测量和判断.机器视觉系统是指通过机器视觉产品(即图像摄取装置,分 CMOS 和CCD 两种)将被摄取目标转换成图像信号,传送给专用的图像处 ...

  2. 单例设计模式 序列化破坏单例模式原理解析及解决方案?

    单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏

  3. HTML游戏黑屏,“网页游戏黑屏,白屏,无法调出flash.”的解决方案

    [问题描述]: 网页游戏黑屏,白屏,无法调出flash(例如:"QQ空间打不开") [原因分析]: 这往往是flash未安装或者版本过低造成的.我们通过重新安装flash解决,但是 ...

  4. ios app HTML5 白屏,App平台iOS设备上因内存不足导致白屏、闪退的问题解决方案

    原因 任何手机设备上,当手机内存不足时,os都会回收资源.一般是先回收后台打开的资源.如果当前应用占用的资源过高,当前应用也有可能崩溃. 尤其是在调用摄像头点击拍照时,手机内存占用会达到一个峰值,此时 ...

  5. 大学 校园网登陆界面跳转不出来,没有跳转怎么办 原理解析以及解决方案

    解决学校校园网登陆页面没有跳转的问题 最近有同学问我,学校登录界面跳转不出来,输入百度网址无法跳转. 我在网上搜了一下,各种360,清空DNS缓存的方法,其实还是没有找到源头.(当然只针对本校的情况, ...

  6. 机器视觉技术原理解析及解决方案集锦

    机器视觉就是用机器代替人眼来做测量和判断.机器视觉系统是指通过机器视觉产品(即图像摄取装置,分 CMOS 和CCD 两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度.颜色 ...

  7. 单例设计模式-序列化破坏单例模式原理解析及解决方案

    越来越成熟了,那是不是坚不可摧的呢,现在我们就要用序列号和反序列化来破坏单例模式,后面也会重点讲一下原理,好好听,让我们来一起破坏单例模式吧,首先还是来到Test类里边 package com.lea ...

  8. 前端白屏问题_首页白屏优化实践

    前言 自从前端三大框架React.Vue.Angular面世以来,前端开发逐渐趋向规范化.统一化,大多数时候新建前端项目,首先想到使用的技术一定是三大框架之一,框架给前端开发带来了极大的便利和规范,但 ...

  9. 记ViewPager使用白屏问题

    最近在做项目的时候,遇到了ViewPager空白白屏问题,所有有了本篇文章,从源码分析,记一次ViewPager白屏问题. 如下图所示: 一.切换Tab3后点击Tab1,ViewPager页面出现空白 ...

最新文章

  1. harmonyos上的程序用什么语言写,HarmonyOS应用开发 — HelloWorld应用开发E2E体验
  2. 20130327 jQuery easyUI
  3. 视觉slam学习--坐标系变换 | 欧式变换+仿射变换+射影变换
  4. 【Qt】Qt6调用Visual Studio2019生成的动态库详解
  5. object references an unsaved transient instance - save the transient instance before flushing .
  6. 大数据在农业农村的应用
  7. java变量练习_Java变量与运算符练习
  8. cocos2d-基本概念(5)-Effects 效果
  9. windows批量上传文件到linux,windows上传文件到linux云服务器上
  10. php与mysql毕业设计_基于PHP的毕业设计管理系统设计与实现毕业论文+项目源码及数据库文件...
  11. 手机屏幕分辨率真的是越高越清晰吗?
  12. 一年之计在于春丨看, 农田里的科技范儿
  13. figure,figcaption的用法
  14. NLP 基础应用研究方向简介
  15. 小程序-小程序审核时间
  16. 西门子1200PLC与数控系统808D实现S7通信
  17. ladp3 获取属性_ldap3库:用多个值修改属性
  18. Java:重载的理解
  19. 顺丰科技运维开发工程师HR面面经
  20. Java怎么打开ppt_Java 加密PPT(设置打开密码、编辑权限密码)

热门文章

  1. c语言如何判断密码不同字符,C语言从文本文档读取字符串(用户名和密码验证)...
  2. html dvi如何设置置顶不能空白位置,[html]关于html标签的一些总结
  3. python怎么自动中文版_Python实现AI自动版贪吃蛇
  4. ewebeditor 图片上传中 请等待_AC米兰客场3-1那不勒斯,博内拉透露:伊布伤势情况需要等待...
  5. python中try_python中try...excpet多种使用方法
  6. python 回声程序_一种回声消除系统及回音消除方法与流程
  7. 深入浅出springboot 下载_有没有相见恨晚的学习模电好方法?《新概念模拟电路》全五册合集免费下载...
  8. 【星球知识卡片】AutoML都有哪些核心技术,如何对其进行长期深入学习
  9. 全球及中国电子式儿科呼吸机行业发展现状与市场销量调研报告2022版
  10. svn添加钩子hook