Android:FragmentTransaction

上一篇Android:FragmentTransaction我们大概介绍了FragmentManager的大致工作流程,知道了每个动作都会添加到Op队列里,并由FragmentTransaction进行管理,那么我们就来看看FragmentTransaction的具体内容。

首先FragmentTransaction中定义了每个动作的常量值。

    static final int OP_NULL = 0;static final int OP_ADD = 1;static final int OP_REPLACE = 2;static final int OP_REMOVE = 3;static final int OP_HIDE = 4;static final int OP_SHOW = 5;static final int OP_DETACH = 6;static final int OP_ATTACH = 7;static final int OP_SET_PRIMARY_NAV = 8;static final int OP_UNSET_PRIMARY_NAV = 9;static final int OP_SET_MAX_LIFECYCLE = 10;

在这些值里面,我们看到了非常熟悉的一些操作,比如add,hide,replace等,每个动作都对应一个值。

有了值,就会为每个动作分配定义一个对象。内部类Op。

    static final class Op {//每个动作对应的命令数值int mCmd;//要操作的那个fragmentFragment mFragment;//进入动画int mEnterAnim;//退出时动画int mExitAnim;int mPopEnterAnim;int mPopExitAnim;//声明周期状态Lifecycle.State mOldMaxState;Lifecycle.State mCurrentMaxState;}

那每个动作是如何添加到事务的呢?当我们调用事务的add,hide,show等操作时,从前面文章知道:

        FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();

这个transaction其实是BackStackRecord对象,所以会调用BackStackRecord中对应的方法,比如hide操作。

//BackStackRecord.javapublic FragmentTransaction hide(@NonNull Fragment fragment) {......//调用父类return super.hide(fragment);}//父类:FragmentTransaction.javapublic FragmentTransaction hide(@NonNull Fragment fragment) {addOp(new Op(OP_HIDE, fragment));return this;}

最终调用父类的addOp方法,创建了一个Op对象,并传入OP_HIDE值和要操作的Fragment对象,然后将其添加到mOps列表中。

    ArrayList<Op> mOps = new ArrayList<>();void addOp(Op op) {mOps.add(op);op.mEnterAnim = mEnterAnim;op.mExitAnim = mExitAnim;op.mPopEnterAnim = mPopEnterAnim;op.mPopExitAnim = mPopExitAnim;}

我们在添加fragment到事务时,add方法有两个重载方法。

transaction.add(f1,"f1");
transaction.add(R.id.layout_f,f1,"f1");

一个是不传容器id,一个需要传,第一个方法,其实就是调用第二个方法,然后id传0。

    public FragmentTransaction add(@NonNull Fragment fragment, @Nullable String tag)  {doAddOp(0, fragment, tag, OP_ADD);return this;}

对于第二个方法,我们来看看。

void doAddOp(int containerViewId, Fragment fragment, @Nullable String tag, int opcmd) {//反射final Class<?> fragmentClass = fragment.getClass();final int modifiers = fragmentClass.getModifiers();//检查fragment是否是匿名类,是不是public的,是不是静态类,是不是嵌套类等if (fragmentClass.isAnonymousClass() || !Modifier.isPublic(modifiers)|| (fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers))) {throw new IllegalStateException("Fragment " + fragmentClass.getCanonicalName()+ " must be a public static class to be  properly recreated from"+ " instance state.");}//如果有标签tagif (tag != null) {//检查tag,不允许修改已经存在的tagif (fragment.mTag != null && !tag.equals(fragment.mTag)) {throw new IllegalStateException("Can't change tag of fragment "+ fragment + ": was " + fragment.mTag+ " now " + tag);}fragment.mTag = tag;}//如果设置里容器Idif (containerViewId != 0) {//如果没有为容器设置IDif (containerViewId == View.NO_ID) {throw new IllegalArgumentException("Can't add fragment "+ fragment + " with tag " + tag + " to container view with no id");}//如果fragment已经有容器Id了,不允许变更if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {throw new IllegalStateException("Can't change container ID of fragment "+ fragment + ": was " + fragment.mFragmentId+ " now " + containerViewId);}fragment.mContainerId = fragment.mFragmentId = containerViewId;}//添加Op到队列addOp(new FragmentTransaction.Op(opcmd, fragment));
}

代码做了注释,就不在具体描述了。

再来看attach和detach方法,detach会将fragment从UI界面移除,即使调用show也无法再次显示出来。调用attach后,fragment会重新显示在界面上。

        findViewById(R.id.tv_1).setOnClickListener((v -> {FragmentTransaction t = fragmentManager.beginTransaction();t.detach(f1);t.commitNow();}));findViewById(R.id.tv_2).setOnClickListener((v -> {FragmentTransaction t = fragmentManager.beginTransaction();t.attach(f1);t.commitNow();}));

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

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

相关文章

酷开系统 | 追求娱乐不止一种方式,酷开科技带你开启新体验!

在当今社会&#xff0c;娱乐方式多种多样&#xff0c;人们对于娱乐的需求和追求也在日益增长。然而&#xff0c;传统的娱乐方式已经无法满足大家对于多元化、个性化的体验需求。此时&#xff0c;酷开科技以其独特的视角和领先的技术&#xff0c;为消费者们带来了全新的娱乐体验…

【数据结构 —— 二叉树的链式结构实现】

数据结构 —— 二叉树的链式结构实现 1.树的概念及其结构1.1.树概念1.2.树的结构1.3树的相关概念1.4.树的表示1.5. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树的概念及其结构2.1二叉树的概念2.2.现实中的二叉树&#xff1a;2.3. 特殊的二叉树…

mysql 命令行导入sql 数据,windows导入,强制导入

线上用了polarDB&#xff0c; 本地导入的时候&#xff0c;通过navicat 的备份导入和执行sql文件的方式导入都失败了 用命令行的方式可以导入sql 当我用windows 的cmd 导入的时候&#xff0c;会报一些命令行的错误。 那其实我检查了这个命令是没有问题的。 mysql -uroot -p hu…

asp.net mvc游戏门户网站

c#asp.net mvc 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发三层架构BLL DAL 功能模块&#xff1a; 前端展示首页 新闻公告 英雄档案 视频图片 管理…

解决苹果手机iphone手机强制重启

强制关机&#xff1a; 方法1.同时按住左侧的&#xff0c;- 键中的一个和右侧的电源键 方法2.点击桌面的悬浮键–设备–更多–重新启动

C# 获取硬件信息工具类

写在前面 通过性能计数器类 PerformanceCounter 传入计数器名称&#xff0c;获取对应的系统指标数据&#xff0c;以便进行分析和参考。 通过System.Management类库中的ManagementObjectSearcher类实现对管理信息的查询&#xff0c;比如&#xff1a;主板信息、内存信息、硬盘信…

Elasticsearch(一)

一&#xff1a;简介 The Elastic Stack, 包括 Elasticsearch、 Kibana&#xff08;展示数据的项目&#xff09;、 Beats 和 Logstash&#xff08;这两个是采集和传输数据的项目&#xff09; 这些项目组合形成的技术栈称为ELK Stack&#xff0c;能够安全可靠地获取任何来源、任…

想学计算机视觉入门的可以看过来了

文章写了有一段时间了&#xff0c;期间不少小伙伴来咨询如何自学入门AI&#xff0c;或者咨询一些AI算法。 90%的问题我都回复了&#xff0c;但有时确实因为太忙&#xff0c;没顾得过来。 在这个过程中&#xff0c;我发现很多小伙伴问的问题都类似&#xff1a;比如如何入门计算…

从 0 到 1 开发一个 node 命令行工具

G2 5.0 推出了服务端渲染的能力&#xff0c;为了让开发者更快捷得使用这部分能力&#xff0c;最写了一个 node 命令行工具 g2-ssr-node&#xff1a;用于把 G2 的 spec 转换成 png、jpeg 或者 pdf 等。基本的使用如下&#xff1a; $ g2-ssr-node g2png -i ./bar.json -o ./bar.…

Django RestFramework

安装restframework pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support安装其他模块 pip install pillowpip install django-cors-headers建模和迁移数据 drf包含四个…

MySQL中的锁(简单)

目录 1. 共享锁&#xff08;Shared Lock&#xff09;&#xff1a; 2. 排他锁&#xff08;Exclusive Lock&#xff09;&#xff1a; 3. 行级锁&#xff08;Row-Level Lock&#xff09;&#xff1a; 4. 页级锁&#xff08;Page-Level Lock&#xff09;&#xff1a; 5. 表级锁…

唯创知音WT2003H系列MP3录音语音芯片:控制方式灵活,高品质录音与内置功放完美结合

在音频技术日新月异的今天&#xff0c;一款功能强大、性能稳定的录音芯片对于电子产品的重要性不言而喻。而唯创知音的WT2003H系列MP3录音芯片&#xff0c;凭借其灵活的控制方式、高品质录音功能以及内置的D类功放&#xff0c;成为了市场上备受瞩目的明星产品。 首先&#xff…

shell编程系列(5)-函数的定义

文章目录 前言函数定义处理函数参数通过getopts接收参数 前言 函数是编程语言中最重要的部分之一&#xff0c;虽然在shell脚本中并不是必须的&#xff0c;但是函数可以提高代码的复用性和可读性&#xff0c;当我们编写稍微复杂的脚本时&#xff0c;函数就是一个好帮手&#xf…

Linux常用命令——basename命令

在线Linux命令查询工具 basename 打印目录或者文件的基本名称 补充说明 basename命令用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。 语法 basename(选项)(参数)选项 --help&…

深度学习可解释性Python库

本文整理了10个常用于可解释AI的Python库&#xff0c;方便我们更好的理解AI模型的决策。 原文阅读 什么是XAI&#xff1f; XAI&#xff08;Explainable AI&#xff09;的目标是为模型的行为和决策提供合理的解释&#xff0c;这有助于增加信任、提供问责制和模型决策的透明度…

STM32 基础知识

1. STM32微控制器的核心特性是什么&#xff1f; STM32微控制器是基于ARM Cortex-M 处理器 &#xff0c; 它具有高性能处理能力和低功耗的特性 &#xff0c; 适合用于嵌入式系统STM32系列具有多种多样的内存大小和丰富的内置外设选项&#xff0c;包括 多通道ADC &#xff0c; 定…

SAP_ABAP_编程基础_二进制文件_SMW0中上传与下载

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读448次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

(2)(2.1) Lightware SF40/C(360度)

文章目录 前言 1 安装SF40c 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF40/C 360 度激光雷达(Lightware SF40/C 360degree lidar)可在 Copter-3.4 及更高版本的 Loiter 模式下用于物体回避。 &#xff01;Warning 该功能尚未在各种情况下进行过…

STM32F407-14.3.5-01捕获_比较通道

捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器) 包括: 捕获的输入部分(数字滤波、多路复用和预分频器)&#xff0c; 输出部分(比较器和输出控制)。 中文参考手册中框图分成了三大模块, 把框图合并成了一个整体,以便更好的理解捕获输…

分布式机器学习、联邦学习、多智能体的区别和联系——一文进行详细解释

1 分布式机器学习、联邦学习、多智能体介绍 最近这三个方面的论文都读过&#xff0c;这里写一篇博客归纳一下&#xff0c;以方便搞这几个领域的其他童鞋入门。我们先来介绍以下这三种机器学习范式的基本概念。 1.1 分布式机器学习介绍 分布式机器学习(distributed machine l…