当前位置: 首页 > news >正文

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
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源
  • 查询SQL02:寻找用户推荐人
  • 影子,介绍一下自己
  • 【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?
  • Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头
  • 【DevOps】VyOS:功能强大的开源网络操作系统和实战
  • Vue——初识组件
  • 为什么会有虚像(完美解释焦距和像大小和透镜的关系)
  • EverWeb 强大的零基础Mac网页设计制作软件
  • 最大似然估计、贝叶斯估计、最小二乘估计与贝叶斯学习的本质区别
  • 6、组件通信详解(父子、兄弟、祖孙)
  • Hack The Box(黑客盒子)Dancing篇
  • 【区分vue2和vue3下的element UI ¶Upload 上传组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • Apache Doris 基础 -- 数据表设计(使用AUTO_INCREMENT)
  • 水库大坝安全监测系统打通监控数据“最后一公里”
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • gcc介绍及安装
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 内存分配及垃圾回收机制初探
  • java2019面试题北京
  • jquery ajax学习笔记
  • js 实现textarea输入字数提示
  • PAT A1120
  • Python进阶细节
  • vue.js框架原理浅析
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 前端技术周刊 2019-02-11 Serverless
  • 巧用 TypeScript (一)
  • 微服务框架lagom
  • 新版博客前端前瞻
  • 学习笔记:对象,原型和继承(1)
  • 一起参Ember.js讨论、问答社区。
  • 源码安装memcached和php memcache扩展
  • 正则表达式
  • Android开发者必备:推荐一款助力开发的开源APP
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (007)XHTML文档之标题——h1~h6
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (pojstep1.3.1)1017(构造法模拟)
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (八)Spring源码解析:Spring MVC
  • (分享)自己整理的一些简单awk实用语句
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十三)Maven插件解析运行机制
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • ... 是什么 ?... 有什么用处?
  • .NET 设计一套高性能的弱事件机制
  • .NET 事件模型教程(二)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET上SQLite的连接
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)