Activity->Activity中动态添加Fragment->Fragment回退栈BackStack

Fragment回退栈

  • Fragment回退栈用于管理Fragment的导航历史(添加、删除、替换)。每个Activity都有一个包含其所有FragmentFragmentManager,调用其addToBackStack方法时,这个事务就会被添加到FragmentManager的回退栈中
  • 当用户按下返回键时,系统就会从回退栈中弹出并反向执行最近的事务。如果你替换了一个Fragment,并将这个操作添加到了回退栈,那么按下返回键时,原来的Fragment会再次出现
  • commitNow()方法不能和addToBackStack()方法一起使用

XML文件

  • Activity 布局文件R.layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/replace_child_ll"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_green_light"android:gravity="center"android:orientation="vertical">
</LinearLayout>
  • 第一次添加的MyFragmentA布局R.layout.inflate_layout_a
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/inflate_tv_a"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_blue_light" />
  • 第二次添加的MyFragmentB布局R.layout.inflate_layout_b
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/inflate_tv_b"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_orange_light"/>

Activity代码和Fragment代码

  • MyFragmentA代码
class MyFragmentA : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.inflate_layout_a, container, false)}
}
  • MyFragmentB代码
class MyFragmentB : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.inflate_layout_b, container, false)}
}
  • Activity代码
const val TAG = "Yang"
class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一个FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {replaceFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二个FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {replaceFragmentAddToStack(secondFragment, it)}}, 2000)}private fun replaceFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.replace(targetView.id, fragment)?.addToBackStack(null)?.commitAllowingStateLoss()}
}

效果图

  • 3s后添加蓝色背景的MyFragmentA,6s后添加橘色背景的MyFragmentB
  • 按下第一次返回键后,最上层的橘色背景的MyFragmentB销毁,下层蓝色背景的MyFragmentA显示
  • 按下第二次返回键后,最上层的蓝色背景的MyFragmentA销毁,下层绿色背景的Activity显示
  • 按下第三次返回键后,最上层的绿色背景的Activity执行onPause()onStop(),应用进入后台
    在这里插入图片描述

FragmentManger.popBackStack()

  • 如果在Activity添加Fragment时,通过addToBackStack添加到回退栈,popBackStack的作用和按下返回键一样

replace方式添加+addToBackStack+popBackStack

class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一个FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {replaceFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二个FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {replaceFragmentAddToStack(secondFragment, it)}}, 2000)// 移除第二个FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 3000)// 移除第一个FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 4000)}private fun replaceFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.replace(targetView.id, fragment)?.addToBackStack(null)?.commit()}
}

效果图

  • 1s添加蓝色背景的MyFragmentA
  • 2s添加橘色背景的MyFragmentB,移除蓝色背景的MyFragmentA,此时屏幕上只有MyFragmentB
  • 3s移除橘色背景的MyFragmentB,显示蓝色背景的MyFragmentA,此时屏幕上只有MyFragmentA
  • 4s移除橘色背景的MyFragmentA,移除蓝色背景的MyFragmentA,此时屏幕上没有任何Fragment
    在这里插入图片描述

add方式添加+addToBackStack+popBackStack

class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一个FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {addFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二个FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {addFragmentAddToStack(secondFragment, it)}}, 2000)// 移除第二个FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 3000)// 移除第一个FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 4000)}private fun addFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.add(targetView.id, fragment)?.addToBackStack(null)?.commit()}
}

效果图

  • 1s添加蓝色背景的MyFragmentA
  • 2s添加橘色背景的MyFragmentB,不移除蓝色背景的MyFragmentA,此时屏幕上有MyFragmentAMyFragmentB
  • 3s移除橘色背景的MyFragmentB,此时屏幕上只有MyFragmentA
  • 4s移除橘色背景的MyFragmentA,此时屏幕上没有任何Fragment
    在这里插入图片描述

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

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

相关文章

关于计算机是如何工作的

计算机的发展历程 世界上的第一个计算机 冯诺依曼机构体系 1.存储器 (包括内存(存储空间小,访问速度快,成本高,掉电后数据丢失) 外存(硬盘,软盘,U盘,光盘)),存储空间小,访问速度慢,成本低,掉电后数据仍在 2.CPU(中央处理单元,计算机最核心的部分,用于算术运算和逻辑判断),…

【Python】教你彻底了解Python中的模块和包

​​​​ 文章目录 一、模块的概念1. 导入模块2. 导入特定对象3. 给模块或对象取别名 二、标准库模块1. 常用标准库模块2. 使用示例 三、自定义模块1. 创建模块2. 使用自定义模块 四、包的结构与使用1. 创建包2. 使用包中的模块 五、包的深入使用1. 相对导入2. 子包3. 使用子包…

【排序】冒泡排序

在我们的生活中&#xff0c;到处都离不开排序的作用&#xff0c;考试分数要排序&#xff0c;商场购物要排序&#xff0c;可以说排序对我们来说处处存在&#xff0c;那么从本章开始&#xff0c;我将要依次分享一些排序方法&#xff0c;从易到难&#xff0c;包括冒泡&#xff0c;…

CNN卷积神经网络

一、概述 卷积神经网络&#xff08;CNN&#xff09;是深度学习领域的重要算法&#xff0c;特别适用于处理具有网格结构的数据&#xff0c;比如说图像和音频。它起源于二十世纪80至90年代&#xff0c;但真正得到快速发展和应用是在二十一世纪&#xff0c;随着深度学习理论的兴起…

Apple开发者证书创建完整过程

1.创建CSR文件: 打开钥匙串访问程序 选择从证书颁发机构请求 创建证书 保存CSR文件到桌面 成功如下: 开始创建证书: 选择

分布式ID生成方式

1.UUID uuid方式存在问题&#xff1a;占用字节数比较大&#xff1b;ID比较随机&#xff0c;作为MySQL主键写入库时&#xff0c;为了保证顺序性将导致BTree节点分裂比较频繁&#xff0c;影响IO性能。 2.数据库方式 步长step 3&#xff0c;即为机器的数量。 第一台机器&#x…

web刷题记录(4)

[GKCTF 2020]cve版签到 进来应该是给了个提示了&#xff0c;就是要以.ctfhub.com结尾 还有一个超链接&#xff0c;这题的ssrf还是挺明显的&#xff0c;抓包看看 发现回显里面有提示 说是和本地有关&#xff0c;那么也就是说&#xff0c;要访问127.0.0.1&#xff0c;大概意思就…

项目实战系列——WebSocket——websock简介

最近项目中需要用到mes和本地客户端进行实时通讯&#xff0c;本来想用webapi进行交互的&#xff0c;但是考虑到高效和实时性&#xff0c;就采用这一项技术。 以往采用的方式——长轮询 客户端主动向服务器发送一个请求&#xff0c;如果服务器没有更新的数据&#xff0c;客户端…

大语言模型 (LLM) 窥探未来

随着2023年的岁月渐渐走向尾声&#xff0c;我们站在人工智能的前沿&#xff0c;回望大语言模型&#xff08;Large Language Models, LLM&#xff09;所走过的道路&#xff0c;同时也不禁展望未来。从初步尝试到成为人工智能领域的万千宠爱&#xff0c;一种又一种的技术突破&…

处理一对多的映射关系

一对多关系&#xff0c;比如说根据id查询一个部门的部门信息及部门下的员工信息 在Dept类中先添加List emps属性 1、collection DeptMapper.xml文件中 <resultMap id"deptAndEmpResultMap" type"Dept"><id property"did" column&qu…

[Redis]List类型

列表类型来存储多个有序的字符串&#xff0c;a、b、c、d、e 五个元素从左到右组成了一个有序的列表&#xff0c;列表中的每个字符串称为元素&#xff0c;一个列表最多可以存储个元素。在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08…

Postgresql中json和jsonb类型区别

在我们的业务开发中&#xff0c;可能会因为特殊【历史&#xff0c;偷懒&#xff0c;防止表连接】经常会有JSON或者JSONArray类的数据存储到某列中&#xff0c;这个时候再PG数据库中有两种数据格式可以直接一对多或者一对一的映射对象。所以我们也可能会经常用到这类格式数据&am…

【Linux】进程切换环境变量

目录 一.进程切换 1.进程特性 2.进程切换 1.进程切换的现象 2.如何实现 3.现实例子 2.环境变量 一.基本概念 二.常见环境变量 三.查询常见环境变量的方法 四.和环境变量相关的命令 五.环境变量表的组织方式 六.使用系统调用接口方式查询环境变量 1.getenv 2.反思 …

如何学习使用淘宝API?淘宝API运营场景

学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用&#xff1a; 淘宝API接口入门 了解淘宝开放平台&#xff1a;淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台&#xff0c;涵盖了丰富的A…

神经网络 torch.nn---优化器的使用

torch.optim - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.optim — PyTorch 2.3 documentation 反向传播可以求出神经网路中每个需要调节参数的梯度(grad)&#xff0c;优化器可以根据梯度进行调整&#xff0c;达到降低整体误差的作用。下面我们对优化器进行介绍。 …

uniapp内置的button组件的问题

问题描述 由于想要使用uniapp内置button组件的开放能力&#xff0c;所以就直接使用了button&#xff0c;但是他本身带着边框&#xff0c;而且使用 border&#xff1a;none&#xff1b;是没有效果的。 问题图片 解决方案 button::after {border: none;} 正确样式 此时的分享…

6.更复杂的光照

一、Unity的渲染路径 渲染路径决定了光照是如何应用到Unity Shader中的。我们需要为每个Pass指定它使用的渲染路径 如何设置渲染路径&#xff1f; Edit>Project Settings>Player>Other Settinigs>Rendering 如何使用多个渲染路径&#xff1f;如&#xff1a;摄像…

kafka-集群搭建(在docker中搭建)

文章目录 1、kafka集群搭建1.1、下载镜像文件1.2、创建zookeeper容器并运行1.3、创建3个kafka容器并运行1.3.1、9095端口1.3.2、9096端口1.3.3、9097端口 1.4、重启kafka-eagle1.5、查看 efak1.5.1、查看 brokers1.5.2、查看 zookeeper 1、kafka集群搭建 1.1、下载镜像文件 d…

makefile2

makefile的条件判断 运行make。 替换 make -c make-f …… 还可以 man make来查看其他的make命令。

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加速数据访…