文档章节

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

新年
 新年
发布于 2015/05/21 11:12
字数 506
阅读 28741
收藏 18

 最近在做项目的时候,遇到了fragment重叠的问题。具体的情况是,我在一个fragment中,通过add的到FragmentTransaction的方式,又放了四个子fragment allFrg,movieFrg,newsFrg,otherFrg。当我点击allFrg对应tab键时,通过hide隐藏其他三个fragment,通过show来显示allFrg。正常情况下显示是对的,问题就在我切换他其他的app,操作一会之后,再回到当前的app,有很大几率会出现fragment重叠的现象。

        通过搜集相关资料,我找到了原因,在我切换到其他app的时候,fragment所在activity已经被销毁。并且通过

@Override  
public void onSaveInstanceState(Bundle outState) {  
    // TODO Auto-generated method stub        
    Log.v("LH", "onSaveInstanceState"+outState);  
    super.onSaveInstanceState(outState);  
}

这个方法保存了相关的数据。

         当我再次回到这个app的时候,通过onCreate中的参数savedInstanceState恢复了之前的fragment。此时的FragmentTransaction中的相当于又再次add了fragment进去的,之前保存的fragment也还在。hide()和show()方法对之前保存的fragment已经失效了。所以出现了重叠的现象。
         解决方法如下,在进入onCreate函数时,先去判断savedInstanceState是否为null,如果不为null,则表示里面有保存这四个fragment。则不再重新去add这四个fragment,而是通过Tag从前保存的数据中直接去读取。相关代码如下:

//FragmentManager fManager;  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    fManager = getFragmentManager();  
    if (savedInstanceState != null) {  
        allFrg = (AllOfficialAccountFragment) fManager.findFragmentByTag("allFrg");  
        movieFrg = (MovieOfficialAccountFragment) fManager.findFragmentByTag("movieFrg");  
        newsFrg = (NewsOfficialAccountFragment) fManager.findFragmentByTag("newsFrg");  
        otherFrg = (OtherOfficialAccountFragment) fManager.findFragmentByTag("otherFrg");           
    }  
    super.onCreate(savedInstanceState);       
}

 这样子仍是对之前保存的fragment操作,成功解决了重叠的问题。          


///////////////////////////////////////////deadline//////////////////////////////////////////////////////////////

通过上面的方法,在我的应用中,貌似也没有能够很好的解决问题。

另外一个思路是,直接在包含Fragment的Activity中复写

public void onSaveInstanceState(Bundle outState) {  
    // TODO Auto-generated method stub       
    //Log.v("LH", "onSaveInstanceState"+outState);  
    //super.onSaveInstanceState(outState);   //将这一行注释掉,阻止activity保存fragment的状态
}


本文转载自:http://blog.csdn.net/u014391013/article/details/42497575

新年
粉丝 7
博文 84
码字总数 46086
作品 0
海淀
程序员
私信 提问
加载中

评论(5)

安卓小屁孩儿
设置背景图片才行的吧。。。
乔保利
乔保利
干得好!0
zzmhacker
zzmhacker
我设置新出现的fragment的背景挡住下面的fragment,好像也能解决
铲昶行
铲昶行

引用来自“OSC首席捣蛋侠”的评论

用getChildFragment
怎么用,能请教一下吗
OSC首席捣蛋侠
OSC首席捣蛋侠
用getChildFragment
Android开发总结之Fragment

1 Fragment是什么? 碎片,我的理解就是一个具有生命周期的容器控件,只不过Fragment是寄生在Activity上的,是由Activity来管理,而不是像Activity一样由系统来管理的。所以用法上Fragment比...

newtrek
03/07
0
0
Android横屏下Fragment界面重叠问题

转载的别人的东西 因为自己做平板被坑到了。所以自己等于给自己长个知识。 Android横屏下Fragment界面重叠问题 前言: 项目是基于平板开发的,设计的界面是要求横屏展示界面。所以我将所有的...

huyawenz
2017/11/27
0
0
Activity被回收导致fragment的getActivity为null的解决办法

这两天一直被这个问题困扰,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠现象,让我十分不爽。研究了一天,终于明白其中的原理并加以解决。解决办法如下: 如果系统...

bluecoffee
2015/06/20
0
9
Fragment 横竖屏切换问题

在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默认构造函数的话将会报错...

lxholding
2012/09/03
0
0
Android Tips(6)

1. 在引用的module中使用aar 导入test.aar包需要在引用module的build.gradle中加入: 还需在主工程的build.gradle中加入: moduleName为引用module的名称 否则会报出Error:Failed to resolve...

燊在锦官城_
2018/09/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Odoo 自定义Widgets 基础教程(章节2)

大家好, 本文将进一步解释odoo widget 的相关原理,其中首先会讲述:1. 什么是widgets 中的继承;2. 为什么有很多 init : function 语法;3. widgets 系统结构; 首先,让我们来看看结构:(...

openerp
22分钟前
1
0
我的Linux常用软件

我的Linux常用软件 本帖记录我在Linux下常用的软件,系统是Deepin Linux, 以备查询用, 不定期更新。 Sougou Pinyin 这个不用多说, 装系统第一个要找输入法。 TeamViewer Linux有时候需要远...

Frank1126lin
29分钟前
1
0
TypeScript + eslint 格式化代码及其它

缘起 之前使用 tslint 校验代码格式,后来发现 ts 官方已经放弃这个转而使用 eslint,研究了一下把相应配置调整了一下。 目标: 使用 eslint、prettier 格式化 TypeScript 代码 使用 husky、...

郁也风
29分钟前
1
0
虎牙在全球 DNS 秒级生效上的实践

本文整理自虎牙中间件团队在 Nacos Meetup 的现场分享,阿里巴巴中间件受权发布。 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下5各部分: 背景介绍...

阿里云云栖社区
48分钟前
3
0
centos7上记录sftp操作

ftp客户端中使用sftp协议如何记录操作日志? 经过实践,secure-crt上链接sftp session的操作不会被记录下来,命令行应该很少会用,毕竟门槛在呢。 而其他ftp客户端则会被记录下来,包括进入目...

gaolongquan
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部