Fragment重叠原因:

App因某种原因崩溃自动重启,或App长期在后台运行Fragment依赖的activity被回收等等原因;当系统内存不足,Fragment 的依附Activity 被回收的时,Fragment 的实例并没有随之被回收。Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层,当Activity通过再次被重建时,之前被实例化过的 Fragment 会出现在Activity中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠;

复现BUG:

设置 -- 开发者选项 -- 不保留活动(打开);这样设置后按HOME键Activity就会被回收。

方式一:(不推荐使用)

Activity被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层;简单粗暴:不让它保存;

@Override
protected void onSaveInstanceState(Bundle outState) {
//不保存之前的fragment的状态
// super.onSaveInstanceState(outState);
}

方式二:(推荐使用)

重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment;

@Override
public void onAttachFragment(Fragment fragment) {
//重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象
if (HomeFm == null && fragment instanceof Fragment1)
HomeFm = fragment;
if (SpcFm == null && fragment instanceof Fragment2)
SpcFm = fragment;
if (OrderFm == null && fragment instanceof Fragment3)
OrderFm = fragment;
if (MyFm == null && fragment instanceof Fragment4)
MyFm = fragment;
super.onAttachFragment(fragment);
}

方式三:(推荐使用)

在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉;

 */
protected void onSaveInstanceState(Bundle outState) {
//在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove(HomeFm);
transaction.remove(SpcFm);
transaction.remove(OrderFm);
transaction.remove(MyFm);
transaction.commitAllowingStateLoss();
super.onSaveInstanceState(outState);
}

方式四:

Fragment保存自己是否显示;

public class BaseFragment extends Fragment {
/**
* FragmentState没帮我们保存Hidden状态,那就我们自己来保存,在页面重启后,我们自己来决定Fragment是否显示!
*/
private static final String STATE_SAVE_IS_HIDDEN = "CCB_IS_HIDDEN";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (isSupportHidden) {
ft.hide(this);
} else {
ft.show(this);
}
ft.commit();
}
} @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
}
}

随意门:Fragment+Radiogroup联动

Fragment重叠,使用show和hide控制显示和隐藏界面重叠问题;的更多相关文章

  1. Js控制显示、隐藏文本框中的密码

    Js控制显示.隐藏文本框中的密码,也可称为是一款小型的JavaScript星号密码破解器,点击会显示出密码类型的文本框中的真实信息,再次点击则还原,程序 主要是获取HTML元素对象,然后强制更改元素属 ...

  2. Fragment之间通过add切换时的显示与隐藏

    新手,不知道用什么方法实现 ,通过动态的方法显示了Fragment   A,在这个里面点击列表项时add方法动态加载Fragment  B,但是两者都会一起显示,重叠在一起了,如果用replace方法 ...

  3. jquery里面控制显示和隐藏 ___土狗toggle

    $("#hide").click(function(){ $("p").hide(); }); $("#show").click(funct ...

  4. NGUI 便捷的显示与隐藏界面

    所有的UI都继承自class UIBase,可以把UI做成预设体,同个场景下,读取预设体时,将子UI对象都保存在类似Dictionary<UIType, UIBase>这样的结构中,这样的 ...

  5. cesium添加多个geojson文件并分别控制显示和隐藏

    /*获取geojson数据*/ function get_geojson(name,h,n){ let x=document.getElementById(n); if(x.className === ...

  6. 控制显示input隐藏和查看密码

    通过更改input的password和text类型即可实现 //点击函数,获取dom,判断更改属性. show(){ let input=document.getElementById("i ...

  7. 微信小程序点击控制元素的显示与隐藏

    微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...

  8. Dynamics CRM 2013 停用和激活按钮的显示与隐藏

    CRM中命令栏上的有些按钮是可以通过权限控制显示和隐藏的,比如新建.保存.保存并关闭.删除等,但惟独激活和停用无法控制,但我们还是可以用权限去控制,只是稍微绕了那么一下. 这里就要涉及到按钮的自定义了 ...

  9. div的显示和隐藏

    本文从学习角度出发,仅当做笔记.高手可以忽略本文. 借助div的display属性可以实现div的显示或隐藏,而且在隐藏后不占用原来显示的空间. js控制显示和隐藏的代码: <script ty ...

随机推荐

  1. TypeScript 知识点

    TypeScript 通过 类型批注 提供静态类型以在编译时启动类型检查. 基本批注类型是number.bool.string.而弱或动态类型是any. typescript 使用 作用 语句 全局安 ...

  2. PHP中strlen和mb_strlen的区别

    在PHP中,strlen与mb_strlen是求字符串长度的函数,下面通过例子,讲解这两者之间的区别. <?php //测试时文件的编码方式要是UTF8 $str='中文a字1符'; echo ...

  3. 读懂 PetaLinux:让 Linux 在 Zynq 上轻松起“跑”(转)

    对于Zynq这样一个“ARM+可编程逻辑”异构处理系统我们已经不陌生,其创新性大家也有目共睹.不过想要让更多的应用享受到这一“创新”带来的红利,让其真正“落地”则需要大量系统性的工作,去营造一个完善的 ...

  4. 从Excel文件中读取内容

    从Excel文件中读取内容 global::System.Web.HttpPostedFileBase file = Request.Files["txtFile"]; strin ...

  5. 开源数据采集组件比较: scribe、chukwa、kafka、flume

    针对每天TB级的数据采集,一般而言,这些系统需要具有以下特征: 构建应用系统和分析系统的桥梁,并将它们之间的关联解耦: 支持近实时的在线分析系统和类似于Hadoop之类的离线分析系统: 具有高可扩展性 ...

  6. SPI Flash Memory 芯片手册阅读

    SPI Flash Memory 芯片手册阅读 信息来源

  7. DEBUG模式详解

    1. 如果开启了DEBUG模式,那么以后我们修改了Django项目的代码,然后按下ctrl+s,那么Django就会自动的给我们重启项目,不需要手动重启.2. 如果开启了DEBUG模式,那么以后Dja ...

  8. ALGO-121_蓝桥杯_算法训练_猴子分苹果

    问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一 ...

  9. Python 里面什么时候用一个=,什么时候用两个=

    赋值用=                                                                   i != j != k   >>>> ...

  10. Jenkins小试

    之前有提到和同事搭建了个Git+Gerrit+Jenkins环境,可惜都在一台机器上,中间IT重装系统后就杯具了,没有备份,只好重来. 6月份项目发布了首个Open API,那时候建了个api uni ...