Activity + Fragment 页面重叠问题
Activity + Fragment 页面重叠问题
今天在遇到一个很奇怪的问题,我们的软件是用Activity + Fragment构成,在某些场景下,居然发现了有Fragment重叠的现象,究其本质,是因为原来未被销毁,而又新建了一个Fragment,那么这种情况怎么避免呢。
一、 造成问题的原因
根本原因:Activity被销毁并重新创建了,但已经加载过的Fragmen被保存了下来,这时Activity重新创建时又产生了新的Fragment,所以重叠了。
问题场景:
- 横竖屏切换
- 报错之后恢复页面
- 内存不足时Activity销毁
深入探究为什么横竖屏后会产生这个现象呢?
我在网上找到赞同的解释:
当我们旋转屏幕的时候,activity会被销毁并重新创建,并且在销毁之前执行了onSaveInstanceState(Bundle outState)这个方法。这个方法会保存activity的一些信息,其中就包括添加过的fragment,当activity被重新创建时,会初始化其中的变量,这个时候点击底部导航的话会重新去添加fragment,也就导致了重叠的问题。
二、 解决方法
为了模拟这一场景,可在手机 开发者选项-> 应用->不保留活动 模拟场景。
解决方式一:
在Activity回收时不保存状态,这样当Activity销毁时再进入时,就重新加载视图
@Overrideprotected void onSaveInstanceState(Bundle outState) {// super.onSaveInstanceState(outState);}
解决方式二:
- 新建Fragment的集合,初始化时加载Fragment
- 在显示
Fragment
时,为每一个Fragment
添加一个tag
- 后在
Activity
的onCreate
中从Bundle
中取出,并在集合中替换相应的Fragment
- 显示
Fragment
时将其它的隐藏 - 如果想记录保存前的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 页面重叠问题相关推荐
- Android中Activity各种页面跳转并传值(Activity -> Activity)(Activity -> Fragment)(Activity -> Service)
目录 Activity -> Activity Activity -> Fragment Fragment -> Activity Activity -> Service Ac ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- (仿头条APP项目)2.主界面按钮切换Fragment页面
文章目录 主界面按钮切换Fragment页面 效果展示 框架结构 xml视图 主视图 选择器和style java代码模块 创建4个Fragment 1.绑定按钮选择事件 2.初始化和用HashMap ...
- android数据回传多个页面_Android Day06四大组件之Activity多页面跳转和数据传递
ToolBar中menu无法同时显示图标和文字问题的解决方法 Toolbar添加返回按钮 ToolBar与ActionBar 1.什么是Activity 官方文档是这么说的:Anwhich users ...
- must implement OnFragmentInteractionListener/ Fragment与Activity,Fragment与Fragment之间的信息传递
出现这个问题的原因, 是Fragment关联的Activity没有实现OnFragmentInteractionListener接口. 那为什么要实现这个接口,以及怎样实现这个接口呢?让我们一步一步来 ...
- Fragment页面的返回按钮监听
一.首先启用Fragment的返回事件监听. requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, obj ...
- Android跳转动画时长,Android_Activit跳转动画之界面上某个位置并裂开上下拉伸动画跳转,需求:Activity(fragment)跳转的时候 - phpStudy...
Activit跳转动画之界面上某个位置并裂开上下拉伸动画跳转 需求:Activity(fragment)跳转的时候当前界面裂开,上下各自拉出手机屏幕,之后跳转到相对应的Activity.整体效果图如下 ...
- Fragment页面刷新问题
Fragment页面涉及到状态变更时,需要重新加载数据进行刷新.项目中采用接收到EventBus刷新通知直接刷新页面,发现有时候界面内容没有刷新过来. 解放法案:需要采用延时刷新方案. Fragmen ...
- Activity内嵌Fragment,当Activity recreate时Fragment出现重叠
recreate() Activity recreate()之后会出现fragment重叠的问题,需要给fragment增加tag @Override protected void onCreate( ...
最新文章
- java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^
- oracle 创建临时表报权限不足,ORACLE 临时表空间满了的原因解决方案
- 前端利用JS导出数据到Excel表 数字是文本类型 无法计算
- Iperf源代码分析(八)
- IBM AIX服务器分区之间迁移IO设备以迁移HBA卡为例
- Windows server 2008R2本地组与本地用户的创建和管理
- fir.im Weekly - 给 Mac 应用开发者的教程
- java android上传文件_Java-Android-如何将txt文件上传到网站?
- 边缘计算架构_边缘计算与开放基础架构的重要性
- Java中的流(概念和示例)
- 定位CPU异常抖动---tomcat热部署的坑[转载]
- python numpy和pandas做数据分析时去掉科学记数法显示
- libiec61850学习1
- Linux怎么复制文件到其他文件夹
- 用python实现计算器功能_Python实现的计算器功能示例
- 玩游戏计算机缺失msvcp140,绝地求生计算机丢失MSVCP140.dll解决办法
- 什么是X86和X86-64
- HRNet的网络结构---非常详细
- 页面静止一定时间没有操作跳转页面
- halcon直线延长