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"?>
<LinearLayout
    xmlns: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"?>
<TextView
    xmlns: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"?>
<TextView
    xmlns: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? = null
    var 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
        // 添加第一个Fragment
        mMainHandler.postDelayed({
            val firstFragment = MyFragmentA()
            replaceLl?.let {
                replaceFragmentAddToStack(firstFragment, it)
            }
        }, 1000)
        // 添加第二个Fragment
        mMainHandler.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? = null
    var 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
        // 添加第一个Fragment
        mMainHandler.postDelayed({
            val firstFragment = MyFragmentA()
            replaceLl?.let {
                replaceFragmentAddToStack(firstFragment, it)
            }
        }, 1000)

        // 添加第二个Fragment
        mMainHandler.postDelayed({
            val secondFragment = MyFragmentB()
            replaceLl?.let {
                replaceFragmentAddToStack(secondFragment, it)
            }
        }, 2000)

        // 移除第二个Fragment
        mMainHandler.postDelayed({
            supportFragmentManager.popBackStack()
        }, 3000)

        // 移除第一个Fragment
        mMainHandler.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? = null
    var 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
        // 添加第一个Fragment
        mMainHandler.postDelayed({
            val firstFragment = MyFragmentA()
            replaceLl?.let {
                addFragmentAddToStack(firstFragment, it)
            }
        }, 1000)

        // 添加第二个Fragment
        mMainHandler.postDelayed({
            val secondFragment = MyFragmentB()
            replaceLl?.let {
                addFragmentAddToStack(secondFragment, it)
            }
        }, 2000)

        // 移除第二个Fragment
        mMainHandler.postDelayed({
            supportFragmentManager.popBackStack()
        }, 3000)

        // 移除第一个Fragment
        mMainHandler.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
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

三十九、openlayers官网示例Extent Interaction解析——在地图上绘制范围并获取数据

官网demo 地址&#xff1a; Extent Interaction 在openlayers中可以使用ExtentInteraction添加交互事件&#xff0c;配合shiftKeyOnly实现按住shift键绘制边界区域。 const map new Map({layers: [new TileLayer({source: new OSM(),}),],target: "map",view: new …

LeetCode 算法:合并区间c++

原题链接&#x1f517;&#xff1a;合并区间 难度&#xff1a;中等⭐️⭐️ 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰…

一文搞懂常见的数据拆分方案

常见的几种数据拆分方案 1、客户端分片 直接在应用层实现读取分片规则&#xff0c;解析规则&#xff0c;根据规则实现切分逻辑。 这种方案优缺点&#xff1a; 侵入业务(缺点)&#xff1b; 实现简单&#xff0c;适合快速上线&#xff0c;容易定位问题&#xff1b; 对开发人员…

C++基础编程100题-025 OpenJudge-1.4-05 整数大小比较

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/05/ 描述 输入两个整数&#xff0c;比较它们的大小。 输入 一行&#xff0c;包含两个整数x和y&#xff0c;中间用单个空格隔开。 0 < x < 2^32, -2^31 < y < 2^31。 输出 一个字符。 若x &…

锁存器(Latch)的产生与特点

Latch 是什么 Latch 其实就是锁存器&#xff0c;是一种在异步电路系统中&#xff0c;对输入信号电平敏感的单元&#xff0c;用来存储信息。锁存器在数据未锁存时&#xff0c;输出端的信号随输入信号变化&#xff0c;就像信号通过一个缓冲器&#xff0c;一旦锁存信号有效&#…

DP读书:如何使用badge?(开源项目下的标咋用)

最近在冲论坛&#xff0c;很少更一些内容了。但遇到了一个真的有趣的&#xff1a; 开源项目下&#xff0c;蓝蓝绿绿的标是怎么用的呢&#xff1f; 这是我的主页Readme&#xff0c;在看一些NXP的主仓时&#xff0c;突然发现没有这个玩&#xff0c;就自己整了个 再比如我的CSDN专…

【stm32/CubeMX、HAL库】swjtu嵌入式实验七 ADC 实验

相关电路与IO引脚 注意&#xff1a;串口打印重定向后使用printf打印需要在keil里勾选 Use MicroLIB &#xff0c;否则会卡住。 参看&#xff1a;https://zhuanlan.zhihu.com/p/565613666 串口重定向&#xff1a; /* USER CODE BEGIN Includes */#include <stdio.h>//…

利用opencv-python实现图像全景拼接技术实现

这个代码的主要功能是将多张图像拼接成一张全景图。它使用了OpenCV库中的SIFT特征提取、特征匹配和图像变换等技术来实现图像拼接。 一、预览效果 二、安装依赖 contourpy1.2.1 cycler0.12.1 fonttools4.53.0 importlib_resources6.4.0 kiwisolver1.4.5 matplotlib3.9.0 numpy…

保姆级讲解 FTP服务器的配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

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

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

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

Spring boot 集成mybatis-plus

Spring boot 集成mybatis-plus 背景 Spring boot集成mybatis后&#xff0c;我们可以使用mybatis来操作数据。然后&#xff0c;我们还是需要写许多重复的代码和sql语句&#xff0c;比如增删改查。这时候&#xff0c;我们就可以使用 mybatis-plus了&#xff0c;它可以极大解放我…

docker镜像深入理解

大家好&#xff0c;本篇文章和大家聊下docker相关的话题~~ 工作中经常有关于docker镜像的问题&#xff0c;让人百思不解 docker镜像加载到系统中到哪里去了&#xff1f;docker load 加载镜像的流程是怎样的&#xff1f;为什么容器修改内容后&#xff0c;删除容器后再次开启容…

微信小程序毕业设计-民大食堂用餐综合服务平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…

java小游戏-坦克大战1.0

文章目录 游戏界面样式游戏需求分析设计类过程1&#xff1a;初始化界面过程2&#xff1a;用面向对象思想设置功能过程3&#xff1a;调用类实例化对象过程4&#xff1a;联合调试 项目代码下载&#xff1a; CSDN_java小游戏-坦克大战1.0 来源&#xff1a;该游戏来自尚学堂~&…

5.23.3 乳腺癌成像中的深度学习:十年的进展和未来方向

乳腺影像学在早期诊断和干预以改善乳腺癌患者的预后方面发挥着重要作用。在过去的十年中,深度学习在乳腺癌成像分析方面取得了显着进展,在解释乳腺成像模式的丰富信息和复杂背景方面具有巨大前景。 基于深度学习的乳腺癌成像研究涵盖了对乳房X光检查、超声、磁共振成像和数字…

新奇css模板

引言 (csscoco.com)https://csscoco.com/inspiration/#/./init 可视化集合 (hepengwei.cn)http://hepengwei.cn/#/html/visualDesign 30 秒代码 (30secondsofcode.org)https://www.30secondsofcode.org/ Animate.css |CSS动画的跨浏览器库。https://animate.style/

探索StartAI:创成式填充与AI绘画的革新

在人工智能的浪潮中&#xff0c;StartAI以其独特的创成式填充和AI绘画功能&#xff0c;成为创意产业的新星。这款产品不仅为艺术家和设计师提供了一个全新的创作平台&#xff0c;也为普通用户提供了探索和表达自我的途径。 创成式填充&#xff1a;【AI扩图】智能艺术的起点 S…