Activity + Fragment 页面重叠问题

今天在遇到一个很奇怪的问题,我们的软件是用Activity + Fragment构成,在某些场景下,居然发现了有Fragment重叠的现象,究其本质,是因为原来未被销毁,而又新建了一个Fragment,那么这种情况怎么避免呢。

一、 造成问题的原因

根本原因:Activity被销毁并重新创建了,但已经加载过的Fragmen被保存了下来,这时Activity重新创建时又产生了新的Fragment,所以重叠了。

问题场景:

  1. 横竖屏切换
  2. 报错之后恢复页面
  3. 内存不足时Activity销毁

深入探究为什么横竖屏后会产生这个现象呢?

我在网上找到赞同的解释:
当我们旋转屏幕的时候,activity会被销毁并重新创建,并且在销毁之前执行了onSaveInstanceState(Bundle outState)这个方法。这个方法会保存activity的一些信息,其中就包括添加过的fragment,当activity被重新创建时,会初始化其中的变量,这个时候点击底部导航的话会重新去添加fragment,也就导致了重叠的问题。

二、 解决方法

为了模拟这一场景,可在手机 开发者选项-> 应用->不保留活动 模拟场景。

解决方式一:
在Activity回收时不保存状态,这样当Activity销毁时再进入时,就重新加载视图

 @Overrideprotected void onSaveInstanceState(Bundle outState) {// super.onSaveInstanceState(outState);}

解决方式二:

  1. 新建Fragment的集合,初始化时加载Fragment
  2. 在显示Fragment时,为每一个Fragment添加一个tag
  3. 后在ActivityonCreate中从Bundle中取出,并在集合中替换相应的Fragment
  4. 显示Fragment时将其它的隐藏
  5. 如果想记录保存前的Fragment索引
 private void showFragment(int position) {mCurrentFragPosition = position;}
@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("position", mCurrentFragPosition);}
   @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (savedInstanceState != null) {mCurrentFragPosition = savedInstanceState.getInt("position");// 恢复崩溃之前fragment所对应的positionFragment fragment = mFragmentManager.findFragmentByTag("" + mCurrentFragPosition);if (fragment != null)mFragments[mCurrentFragPosition] = fragment;}}

Activity + Fragment 页面重叠问题相关推荐

  1. Android中Activity各种页面跳转并传值(Activity -> Activity)(Activity -> Fragment)(Activity -> Service)

    目录 Activity -> Activity Activity -> Fragment Fragment -> Activity Activity -> Service Ac ...

  2. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  3. (仿头条APP项目)2.主界面按钮切换Fragment页面

    文章目录 主界面按钮切换Fragment页面 效果展示 框架结构 xml视图 主视图 选择器和style java代码模块 创建4个Fragment 1.绑定按钮选择事件 2.初始化和用HashMap ...

  4. android数据回传多个页面_Android Day06四大组件之Activity多页面跳转和数据传递

    ToolBar中menu无法同时显示图标和文字问题的解决方法 Toolbar添加返回按钮 ToolBar与ActionBar 1.什么是Activity 官方文档是这么说的:Anwhich users ...

  5. must implement OnFragmentInteractionListener/ Fragment与Activity,Fragment与Fragment之间的信息传递

    出现这个问题的原因, 是Fragment关联的Activity没有实现OnFragmentInteractionListener接口. 那为什么要实现这个接口,以及怎样实现这个接口呢?让我们一步一步来 ...

  6. Fragment页面的返回按钮监听

    一.首先启用Fragment的返回事件监听. requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, obj ...

  7. Android跳转动画时长,Android_Activit跳转动画之界面上某个位置并裂开上下拉伸动画跳转,需求:Activity(fragment)跳转的时候 - phpStudy...

    Activit跳转动画之界面上某个位置并裂开上下拉伸动画跳转 需求:Activity(fragment)跳转的时候当前界面裂开,上下各自拉出手机屏幕,之后跳转到相对应的Activity.整体效果图如下 ...

  8. Fragment页面刷新问题

    Fragment页面涉及到状态变更时,需要重新加载数据进行刷新.项目中采用接收到EventBus刷新通知直接刷新页面,发现有时候界面内容没有刷新过来. 解放法案:需要采用延时刷新方案. Fragmen ...

  9. Activity内嵌Fragment,当Activity recreate时Fragment出现重叠

    recreate() Activity recreate()之后会出现fragment重叠的问题,需要给fragment增加tag @Override protected void onCreate( ...

最新文章

  1. java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^
  2. oracle 创建临时表报权限不足,ORACLE 临时表空间满了的原因解决方案
  3. 前端利用JS导出数据到Excel表 数字是文本类型 无法计算
  4. Iperf源代码分析(八)
  5. IBM AIX服务器分区之间迁移IO设备以迁移HBA卡为例
  6. Windows server 2008R2本地组与本地用户的创建和管理
  7. fir.im Weekly - 给 Mac 应用开发者的教程
  8. java android上传文件_Java-Android-如何将txt文件上传到网站?
  9. 边缘计算架构_边缘计算与开放基础架构的重要性
  10. Java中的流(概念和示例)
  11. 定位CPU异常抖动---tomcat热部署的坑[转载]
  12. python numpy和pandas做数据分析时去掉科学记数法显示
  13. libiec61850学习1
  14. Linux怎么复制文件到其他文件夹
  15. 用python实现计算器功能_Python实现的计算器功能示例
  16. 玩游戏计算机缺失msvcp140,绝地求生计算机丢失MSVCP140.dll解决办法
  17. 什么是X86和X86-64
  18. HRNet的网络结构---非常详细
  19. 页面静止一定时间没有操作跳转页面
  20. halcon直线延长

热门文章

  1. go库函数之-time-使用示例
  2. 我大121321321321321
  3. 拍拍乐(一)如何在照片里变瘦
  4. 分类——LDA、QDA
  5. eating的中文意思_Eating是什么意思中文
  6. GPGPU基础(二):GPGPU需要用到的OpenGL概念
  7. Java生成Excel表格的代码
  8. 位运算的一些技巧总结
  9. Android重定向,还原短链接为长链接
  10. 三菱FX DMUL指令