Fragment重叠,使用show和hide控制显示和隐藏界面重叠问题;
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重叠,使用show和hide控制显示和隐藏界面重叠问题;的更多相关文章
- Js控制显示、隐藏文本框中的密码
Js控制显示.隐藏文本框中的密码,也可称为是一款小型的JavaScript星号密码破解器,点击会显示出密码类型的文本框中的真实信息,再次点击则还原,程序 主要是获取HTML元素对象,然后强制更改元素属 ...
- Fragment之间通过add切换时的显示与隐藏
新手,不知道用什么方法实现 ,通过动态的方法显示了Fragment A,在这个里面点击列表项时add方法动态加载Fragment B,但是两者都会一起显示,重叠在一起了,如果用replace方法 ...
- jquery里面控制显示和隐藏 ___土狗toggle
$("#hide").click(function(){ $("p").hide(); }); $("#show").click(funct ...
- NGUI 便捷的显示与隐藏界面
所有的UI都继承自class UIBase,可以把UI做成预设体,同个场景下,读取预设体时,将子UI对象都保存在类似Dictionary<UIType, UIBase>这样的结构中,这样的 ...
- cesium添加多个geojson文件并分别控制显示和隐藏
/*获取geojson数据*/ function get_geojson(name,h,n){ let x=document.getElementById(n); if(x.className === ...
- 控制显示input隐藏和查看密码
通过更改input的password和text类型即可实现 //点击函数,获取dom,判断更改属性. show(){ let input=document.getElementById("i ...
- 微信小程序点击控制元素的显示与隐藏
微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...
- Dynamics CRM 2013 停用和激活按钮的显示与隐藏
CRM中命令栏上的有些按钮是可以通过权限控制显示和隐藏的,比如新建.保存.保存并关闭.删除等,但惟独激活和停用无法控制,但我们还是可以用权限去控制,只是稍微绕了那么一下. 这里就要涉及到按钮的自定义了 ...
- div的显示和隐藏
本文从学习角度出发,仅当做笔记.高手可以忽略本文. 借助div的display属性可以实现div的显示或隐藏,而且在隐藏后不占用原来显示的空间. js控制显示和隐藏的代码: <script ty ...
随机推荐
- removing-guest-session-at-login-in-ubuntu-14-04
http://askubuntu.com/questions/451526/removing-guest-session-at-login-in-ubuntu-14-04
- [转]xargs详解
为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...
- taro 最佳实践
对 JSX 支持程度补充说明: 不能在包含 JSX 元素的 map 循环中使用 if 表达式 不能使用 Array#map 之外的方法操作 JSX 数组 不能在 JSX 参数中使用匿名函数 暂不支持在 ...
- Linux 下的三种时间介绍
Linux 下的三种时间介绍: Access Time:简写为atime,表示文件访问的时间,当文件内容被访问时,更新atime时间 Modify Time:简写为mtime,表示文件内容修改的时间, ...
- msp430学习笔记-msp430g2553
C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf ...
- Delphi跨进程访问DBGRID
要想跨进程访问DBGRID,貌似只能用HOOK,写一个DLL想办法注入到目标进程.注入成功后,使DLL与目标进程在同一进程空间中(其内有一些细节问题,请参见代码),这时可以访问目标进程的VCL组件.并 ...
- Speeding Up The Traveling Salesman Using Dynamic Programming
Copied From:https://medium.com/basecs/speeding-up-the-traveling-salesman-using-dynamic-programming-b ...
- webGL之three.js入门2
入门建议: webGL中文翻译教程,基于NeHe的openGL教程:http://www.hiwebgl.com/?p=42 . WebGL中文网 http://www.hewebgl.com/ ,里 ...
- c#读取Sybase中文乱码的解决办法
最近需要从Sybase数据库中获取数据.用Sybase.Data.AseClient连接的话比较简单,但中文数据会有乱码.用Sybase自带的工具SQL Advantage设置好编码和语言,是可以正常 ...
- [蓝桥杯]ALGO-92.算法训练_前缀表达式
问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法).“-”(减法).“*”(乘法)或“/”(除法),运算对象为 ...