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 ...
随机推荐
- taro 开发注意点
taro 开发注意点: 注意点 原因 如果要支持 React Native 端,必须采用 Flex 布局,并且样式选择器仅支持类选择器,且不支持 组合器 Taro RN 端是基于 Expo,因此不支持 ...
- Ribbon 常用配置
配置参数 默认值 说明 <client>.<namespace>.listOfServers 配置服务器列表 <client>.<namespace>. ...
- Spring Cloud(Dalston.SR5)--Eureka 常用配置
配置参数 默认值 说明 服务注册中心配置 Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean eu ...
- msp430学习笔记-DAC12
MSP430F169 的DAC12 模块有2 个DAC 通道,并且可以用DAC12GRP控制位将多个DAC12通道组合起来,实现同步更新,硬件还能确保同步更新独立于任何中断或者NMI事件. DAC12 ...
- VSFTP再配置 我里个去马蛋网上这么多烂文章,走了好多弯路
1.CentOS 进行yum 安装 vsftpd 2.vi /etc/vsftpd/vsftpd.conf 进行配置 3.创建FTP 用户 # useradd –d /var/www -g ftp ...
- SpringBoot使用redis缓存List
一.概述 最近在做性能优化,之前有一个业务是这样实现的: 1.温度报警后第三方通讯管理机直接把报警信息保存到数据库: 2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业 ...
- pyqt4 利用信号槽在子线程里面操作Qt界面
转载:ABigCaiBird #-*- coding:utf-8 -*- ####### from PyQt4.QtCore import * from PyQt4.QtGui import * im ...
- Javascript中的对象(八)
一.如何编写可以计算的对象的属性名 我们都知道对象的属性访问分两种,键访问(["属性名"])和属性访问(.属性名,遵循标识符的命名规范) 对于动态属性名可以这样 var prefi ...
- cmd命令记录
一.查看端口号的使用情况 参考经验:https://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html 1.netstat -ano,列出所 ...
- 自动化 数据分离 --A文件里面的类 中的函数 调用 B文件里面类 的函数 的方法
记录: bb 要实例化 self.dr=dr,那么 iber_test类的 self.dr 才能带过去