本文出处:http://blog.csdn.net/twilight041132/article/details/43812745

在用Fragment做Tab页面,发现有时候进入应用会同时显示多个Tab内容,UI发生重叠。

当应用被强行关闭后(通过手机管家软件手动强关,或系统为节省内存自动关闭应用),再次进入应用时,每次都有这现象。

第一次进入应用时,根据选择的tab分别创建对应的Fragment,之后每次选择页面时隐藏其他tab内容。

通过分析发现,正常back键退出应用时,Activity及Fragment对象会被销毁,因此再次进入时会在切换到Tab时创建对应的Fragment对象。

但是当强行关闭应用后,Activity虽然被回收,但Fragment对象仍然保持,再次进入应用时,系统会分别调用Fragment的onAttach方法将其附加到Activity上,

02-08 12:41:24.107: D/FragmentTab1(7032): onAttach

02-08 12:41:24.107: D/FragmentTab3(7032): onAttach

这里对应的就是强行关闭应用前的fragment对象,

后面会分别调用两个fragment的onCreateView方法,因此这两个Fragment对应的View层次结构都会加到Activity的View层次中。

虽然setSelection方法会把所有fragment先隐藏再显示选中的对象,但由于此时Activity中Fragment对象的成员变量还未初始化,因此会再次实例化fragment对象,

之后add、show及hide的都是在第二次创建的对象上操作的,而之前被保持的fragment对象的视图层次已经反映到Activity视图中并且不会被hide,因此发生了上述重叠现象。

解决方法:

在Activity的onAttachFragment方法中,有一个fragment参数,它就是onAttach方法对应的Fragment对象,

通过判断这个fragment对象,如果属于我们的FragmentTabX类并且该类还未被实例化过,则将Activity的成员变量mFragmentTabX指向该fragment对象,这样就可以在原来的fragment对象上操作add/show/hide,因此不会有重叠现象。

@Override  public void onAttachFragment(Fragment fragment) {  // TODO Auto-generated method stub  super.onAttachFragment(fragment);  Log.d(TAG,"onAttachFragment");  //mTab1,mTab2,mTab3 是在Activity中创建的Fragmentif (mTab1 == null && fragment instanceof FragmentTab1) {  mTab1 = (FragmentTab1)fragment;  }else if (mTab2 == null && fragment instanceof FragmentTab2) {  mTab2 = (FragmentTab2)fragment;  }else if (mTab3 == null && fragment instanceof FragmentTab3) {  mTab3 = (FragmentTab3)fragment;  }  }  

-------------------------------------华丽的分割线------------------------------------------

以下参考:http://m.blog.csdn.net/article/details?id=41912445

上面的貌似说的很有道理,但是测试了一下还是不行,也许是我遇到的问题跟他说的不一致。

我遇到的问题是:当报错时(比如空指针)主页面出现Fragment重叠。

在debug的时候,发现CarFragment是执行了onCreateView()的,意味着成功生成了车辆管理的界面,但究竟为什么仍然显示的是SupplyFragment的界面呢,直观感觉,SupplyFragment像一层蒙板一样放在最上层,点击其他4个tab栏,生成的Fragment都被隐藏在了它的下面。

后来在google查到相关资料,原因是:当Fragment长久不使用,系统进行回收,FragmentActivity调用onSaveInstanceState保存Fragment对象。很长时间后,再次打开app,系统恢复保存的Fragment,但是在FragmentActivity重新执行生命周期的时候,我们重新生成了fragment对象附加到该FragmentActivity,系统恢复的fragment和FragmentActivity失去关联,进而出错。

解决方案为以下两种:

方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理。

方法2:在fragmentActivity里重写onSaveInstanceState方法,但不做实现,也就是将super.onSaveInstanceState(outState)注释掉。

方法2很好理解,当系统要回收Fragment时,我们告诉系统:不要再保存Fragment。相当于用户回到app的时候,我们就当用户是第一次打开app(因为很长时间没有操作了)。

方法1理论上没有问题,但在测试的时候,用了一种非常规的方案,横竖屏切换来测试,而在横竖屏切换时,系统会首先销毁FragmentActivity再重新生成,无法模拟测试条件,还要再研究。

方法1博主亲测,没有什么卵用。

转载于:https://www.cnblogs.com/a446276468/p/5354206.html

用Fragment制作的Tab页面产生的UI重叠问题相关推荐

  1. android tabhost 动画,Android中使用TabHost 与 Fragment 制作页面切换效果

    三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android ...

  2. html制作花样链接卡页面_8 个「新标签页」Chrome 扩展,把 New Tab 页面玩出花样 | Matrix 精选...

    Matrix 是少数派的全新产品,一个纯净.小众的写作平台,我们主张分享真实的产品体验,有实用价值的互联网领域经验.思考.欢迎忠于写作,喜好分享的朋友参与内测.我们会不定期挑选 Matrix 最优质的 ...

  3. html制作多个tab页面,纯CSS打造双层Tab

    写代码前的准备 一般来说,使用纯CSS实现Tab页面效果的常用方式是a标签和:target结合,但是这样实现有一个强迫症的地方:由于是使用a标签把页面"链接"到某个指定ID的元素上 ...

  4. 处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

    一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42087915 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项 ...

  5. Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)

    运行效果图 Navigation + Fragment制作APP主页面 前言 正文 1. 添加依赖 2. 添加导航图 3. 添加NavHost 4. NavController控制显示Fragment ...

  6. 鸿蒙HarmonyOS的初次使用––制作一登录页面,实现跳转(DevEcoStudio)

    ------用DevEcoStudio实现鸿蒙开发(制做登录页面,跑马灯,页面跳转,页面选择) 环境配置 创建java项目 运行模拟器 代码部署 java代码 xml代码 layout目录下的xml文 ...

  7. 制作生成静态页面的新闻系统

    利用PHP生成静态HTML页面的好处很多: 1.静态页面不需要Web服务器解释执行,用户打开网页的速度会快些: 2.打开静态页面时,Web服务器不需要访问数据库,减轻了对数据库访问的压力: 3.静态H ...

  8. 开心庄园页面HTML素材,练习2:制作开心庄园页面.html

     练习2:制作开心庄园页面 如何犁地.播种和收获? 1.点击耙子,即可在庄园中开垦田地: 2.一开始,你可以开垦数十块的田地:扩充庄园后,可开垦的数量更多: 3.在商店 购买种子后,点击庄园中的田地 ...

  9. Tab页面手势滑动切换以及动画效果

    . 3张页卡之间的切换.带动画效果. 工程结构. 主要应用到android-support-v4.jar这个jar包. 布局文件. 1.main.xml中的代码 [html] <?xml ver ...

最新文章

  1. java编写交通灯思路
  2. Windows Embedded Compact 7新特性
  3. JSK-388 等差数列【入门】
  4. 【Java篇】 Java小游戏中加入背景音乐
  5. Window 消息大全使用详解
  6. jquery-migrate.min.js兼容jQuery版本
  7. 如何将FLV视频转成MP3格式?
  8. Java大数据应用领域及就业方向
  9. 【小程序】安卓端InnerAudioContext无法销毁
  10. 如何改善物流行业项目管理?
  11. pip 安装库出错:Defaulting to user installation because normal site-packages is not writeable
  12. The server time zone value ‘锟叫癸拷锟斤拷\u05FC时锟斤拷‘ is unrecognized or represents more than one time zone
  13. amazon账号关联|这三点要记牢
  14. 苹果要求添加手机号且忘记安全提示问题解决办法
  15. 【USACO 2020 January Silver】Loan Repayment 题解
  16. 【已解决】部分安卓手机,部分ios机型,调微信的jssdk方法失败
  17. 红旗2000陷造假门 国产软件想说爱你不容易
  18. Windows Server 2008 显示隐藏文件 扩展名
  19. PHP家长互助沙龙流程,家长沙龙活动方案
  20. 互联网服务器攻防秘笈

热门文章

  1. 【FastJSON】解决FastJson中“$ref 循环引用”的问题
  2. 关于人生倒计时的一个小玩意,纯属业余
  3. 【记】jQuery中的选择器:visible对visibility:hidden的处理
  4. 播撒汗水,收获希望!
  5. biweb wms门户网站php开源建站系统 v5.8.3,BIWEB WMS PHP开源企业建站系统 v5.8.5
  6. wordpress archive.php,wordpress分类目录模板(archive.php)制作
  7. 内存压力测试软件_日常游戏,毫无压力,荣耀Magicbook 14锐龙版性能测试
  8. java枚举怎么编译不行的_java枚举类型
  9. java图形旋转动画_Java动画:旋转图像
  10. 真香系列-JSFinder实用改造