Android fragment隐藏和显示重叠问题解决(叠加显示)

项目场景:

项目首页使用RadioGroup+RadioButton+Fragment实现页面切换,出现了一个问题fragment会出现重叠问题,就是一个fragment显示了两层,
并不是必现问题。

经过排查发现是项目主页面Activity被销毁重建了,但是之前的fragment对象没有被回收导致。

原因分析:

在旋转屏幕后或者页面调到后台一段时间在打开,就会出现Fragment重叠显示,显示了两个相同fragment的效果。


解决方案:

第一步,在添加fragment的时候添加key。
 第二步,再onCreate里判断savedInstanceState是否为空,若不为空说 明是重建的activity,用key将fragment对象取出来即可。
  下面我们来看一下具体代码

    private FragmentManager fManager;private FragmentTransaction transaction;private List<Fragment> fragmentList = new ArrayList<>();private FragmentOne fragmentOne;private FragmentTwo fragmentTwo;private FragmentFour fragmentFour;private FragmentFive fragmentFive;private static final String FRAGMENT_ONE_KEY = "FragmentOne";private static final String FRAGMENT_TWO_KEY = "FragmentTwo";private static final String FRAGMENT_FOUR_KEY = "FragmentFour";private static final String FRAGMENT_FIVE_KEY = "FragmentFive";protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);fManager = getSupportFragmentManager();//如果activity销毁后重建,在这里拿出之前的Fragment对象。if (savedInstanceState != null) {fragmentOne = (FragmentOne) fManager.findFragmentByTag(FRAGMENT_ONE_KEY);fragmentTwo = (FragmentTwo) fManager.findFragmentByTag(FRAGMENT_TWO_KEY);fragmentFour = (FragmentFour) fManager.findFragmentByTag(FRAGMENT_FOUR_KEY);fragmentFive = (FragmentFive) fManager.findFragmentByTag(FRAGMENT_FIVE_KEY);initFragment(fragmentOne);initFragment(fragmentTwo);initFragment(fragmentFour);initFragment(fragmentFive);}initView();}
    private void initView() {fragmentOne = (FragmentOne) fManager.findFragmentByTag(FRAGMENT_ONE_KEY);if (fragmentOne == null) {fragmentOne = new FragmentOne();fragmentList.add(fragmentOne);hideOthersFragment(fragmentOne, true, FRAGMENT_ONE_KEY);} else {hideOthersFragment(fragmentOne, false, FRAGMENT_ONE_KEY);}radioGroup.setOnCheckedChangeListener((group, checkedId) -> {switch (checkedId) {case R.id.radio1:if (fragmentOne == null) {fragmentOne = new FragmentOne();fragmentList.add(fragmentOne);hideOthersFragment(fragmentOne, true, FRAGMENT_ONE_KEY);} else {hideOthersFragment(fragmentOne, false, FRAGMENT_ONE_KEY);}break;case R.id.radio2:if (fragmentTwo == null) {fragmentTwo = new FragmentTwo();fragmentList.add(fragmentTwo);hideOthersFragment(fragmentTwo, true, FRAGMENT_TWO_KEY);} else {hideOthersFragment(fragmentTwo, false, FRAGMENT_TWO_KEY);}break;case R.id.radio4:if (fragmentFour == null) {fragmentFour = new FragmentFour();fragmentList.add(fragmentFour);hideOthersFragment(fragmentFour, true, FRAGMENT_FOUR_KEY);} else {hideOthersFragment(fragmentFour, false, FRAGMENT_FOUR_KEY);}break;case R.id.radio5:if (fragmentFive == null) {fragmentFive = new FragmentFive();fragmentList.add(fragmentFive);hideOthersFragment(fragmentFive, true, FRAGMENT_FIVE_KEY);} else {hideOthersFragment(fragmentFive, false, FRAGMENT_FIVE_KEY);}break;}});}

下面是两个方法

 //将fragment对象添加进fragmentListpublic void initFragment(Fragment fragment) {if (fragment != null) {fragmentList.add(fragment);}}}//加载fragmentpublic void hideOthersFragment(Fragment showFragment, boolean isAdd, String key) {transaction = fManager.beginTransaction();if (isAdd) {//这里别忘了添加keytransaction.add(R.id.Frame_ID, showFragment, key);}if (ObjectUtils.isNotEmpty(fragmentList)) {for (Fragment fragment : fragmentList) {if (showFragment.equals(fragment)) {transaction.show(fragment);} else {transaction.hide(fragment);}}transaction.commit();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【环境搭建】linux docker-compose安装mysql5.7

建议改一下配置&#xff0c;安装mysql8.0 新建目录 mkdir -p /data/docker/mysql/data mkdir -p /data/docker/mysql/logs mkdir -p /data/docker/mysql/conf 给权限 chmod -R 777 /data/docker/mysql 到目录 cd /data/docker/mysql 新建docker-compose.yml文件 vi doc…

【学习笔记】minIO分布式文件服务系统

MinIO 一、概述 1.1 minIO是什么&#xff1f; MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。&#xff08;早前流行的还有FastDFS&#xff09; 据官方介绍&#xff0c;单个对象最大可存储5T&#xff0c;非常适合存储海量图片、视频、日志文件、备…

java.sql.SQLFeatureNotSupportedException解决方法

使用MyBatis访问数据库查询数据时报错&#xff1a; Caused by: java.sql.SQLFeatureNotSupportedExceptionat com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1771)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun…

DB2分区表详解

一、分区表基本概念 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。分区后的表称为分区表。 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时…

03在命令行环境中创建Maven版的Java工程,了解pom.xml文件的结构,了解Java工程的目录结构并编写代码,执行Maven相关的构建命令

创建Maven版的Java工程 Maven工程的坐标 数学中使用x、y、z三个向量可以在空间中唯一的定位一个点, Maven中也可以使用groupId,artifactId,version三个向量在Maven的仓库中唯一的定位到一个jar包 groupId: 公司或组织域名的倒序, 通常也会加上项目名称代表公司或组织开发的一…

Linux命令(93)之su

linux命令之su 1.su介绍 linux命令su用于变更为其它使用者的身份&#xff0c;如root用户外&#xff0c;需要输入使用者的密码 2.su用法 su [参数] user su参数 参数说明-c <command>执行指定的命令&#xff0c;然后切换回原用户-切换到目标用户的环境变量 3.实例 3…

C++ 什么时候用`.template` 和 `::template`

C 什么时候用.template 和 ::template 简单来说&#xff0c;就是你有一个未知类型T**&#xff08;这个T本身就是模板&#xff09;** 假设这个T是一个类&#xff0c;这个类里包含了一些模板函数或者模板结构体 你需要使用T. 或者 T:: 去调用他们&#xff0c;并且要显示指定模板…

JDBC操作BLOB类型字段

JDBC中Statement接口本身不能直接操作BLOB数据类型 操作BLOB数据类型需要使用PreparedStatement或者CallableStatement(存储过程) 这里演示通过PreparedStatement操作数据库BLOB字段 设置最大传入字节 一般是4M 可以通过以下命令修改 set global max_allowed_packet1024*1…

网页在线打开PDF_网站中在线查看PDF之pdf.js

一、pdf.js简介 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区驱动的&#xff0c;并由 Mozilla 支持。我们的目标是为解析和呈现 PDF 创建一个通用的、基于 Web 标准的平台。 pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素&#xff0c;并使用 JavaScr…

Puppeteer结合测试工具jest使用(四)

Puppeteer结合测试工具jest使用&#xff08;四&#xff09; Puppeteer结合测试工具jest使用&#xff08;四&#xff09;一、简介二、与jest结合使用&#xff0c;集成到常规测试三、支持其他的几种四、总结 一、简介 Puppeteer是一个提供自动化控制Chrome或Chromium浏览器的Node…

MyBatis(中)

目录 1、动态sql&#xff1a; 1、if标签&#xff1a; 2、where标签&#xff1a; 3、 trim标签&#xff1a; 4、set标签&#xff1a; 5、choose when otherwise&#xff1a; 6、模糊查询的写法&#xff1a; 7、foreach标签&#xff1a; &#xff08;1&#xff09;批量删除…

施耐德Unity通过Modbus控制变频器

硬件设备 PLC: Unity Premium (CPU:TSX P57154) 通讯卡: TSX SCP 114 连接电缆: TSX SCP CM 4030 VSD: ATV 58 硬件连接 Unity Premium (CPU: TSX P57154)本身不带Modbus接口&#xff0c;因此&#xff0c;采用TSX SCP 114扩展一个Modbus接口。TSX SCP 114是一个RS-485接…

NumPy 基础知识

数据类型 数组类型之间的转换 NumPy支持比Python更多种类的数字类型。本节显示了哪些可用,以及如何修改数组的数据类型。 支持的原始类型与 C 中的原始类型紧密相关: Numpy 的类型C 的类型描述np.boolbool存储为字节的布尔值(True或False)np.bytesigned char平台定义np.…

【已解决】No Python at ‘D:\Python\python.exe‘

起因&#xff0c;我把我的python解释器&#xff0c;重新移了个位置&#xff0c;导致我在Pycharm中的爬虫项目启动&#xff0c;结果出现这个问题。 然后&#xff0c;从网上查到了这篇博客: 【已解决】No Python at ‘D:\Python\python.exe‘-CSDN博客 但是&#xff0c;按照上述…

【Docker】命令使用大全

【Docker】命令使用大全 目录 【Docker】命令使用大全 简述 Docker 的主要用途 基本概念 容器周期管理 run start/stop/restart kill rm pause/unpause create exec 容器操作 ps inspect top attach events logs wait export port 容器 rootfs 命令 c…

SpringSecurity源码学习三:认证

目录 1. 认证步骤2. 认证2.1 WebSecurityConfigurerAdapter配置介绍2.2 使用UsernamePasswordAuthenticationFilter登录认证2.2.1 UsernamePasswordAuthenticationFilter源码2.2.1.1 ProviderManager源码 2.2.2 认证流程总结 2.3 自定义登录认证代码示例2.3.1 认证流程总结 1. …

php的加密方式汇总

一、单列散列函数加密 1.md5()一般用于密码的不可逆加密 2.password_hash() //密码加密 $password 123456; $passwordHash password_hash($password,PASSWORD_DEFAULT,[cost > 12] );//密码验证 if (password_verify($password, $passwordHash)) {//Success } else {//…

8.Covector Transformation Rules

上一节已知&#xff0c;任意的协向量都可以写成对偶基向量的线性组合&#xff0c;以及如何通过计算基向量穿过的协向量线来获得协向量分量&#xff0c;且看到 协向量分量 以 与向量分量 相反的方式进行变换。 现要在数学上确认协向量变换规则是什么。 第一件事&#xff1a;…

前端小案例 | 一个带切换的登录注册界面(静态)

文章目录 &#x1f4da;HTML&#x1f4da;CSS&#x1f4da;JS &#x1f4da;HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

紫光同创FPGA实现UDP协议栈网络视频传输,基于YT8511和RTL8211,提供4套PDS工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案紫光同创FPGA精简版UDP方案紫光同创FPGA带ping功能UDP方案 3、设计思路框架OV7725摄像头配置及采集OV5640摄像头配置及采集UDP发送控制视频数据组包数据缓冲FIFOUDP协议栈详解RGMII转GMII动态ARPUDP协议IP地址、端口…