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

Activity->Activity中动态添加Fragment->add和replace方式添加的区别

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/root_ll"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/add_child_ll"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@android:color/holo_green_light"android:gravity="center"android:orientation="vertical"></LinearLayout><LinearLayoutandroid:id="@+id/replace_child_ll"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@android:color/holo_red_light"android:gravity="center"android:orientation="vertical"></LinearLayout>
</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"/>

Activtiy代码和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 addLl : LinearLayout? = nullvar replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)addLl = findViewById(R.id.add_child_ll) as? LinearLayoutreplaceLl = findViewById(R.id.replace_child_ll) as? LinearLayoutmMainHandler.postDelayed({val firstFragment1 = MyFragmentA()val firstFragment2 = MyFragmentA()addLl?.let {replaceFragment(firstFragment1, it)}replaceLl?.let {replaceFragment(firstFragment2, it)}}, 3000)mMainHandler.postDelayed({val secondFragment1 = MyFragmentB()val secondFragment2 = MyFragmentB()addLl?.let {addFragment(secondFragment1, it)}replaceLl?.let {replaceFragment(secondFragment2, it)}}, 6000)}private fun addFragment(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.add(targetView.id, fragment)?.commitNowAllowingStateLoss()}private fun replaceFragment(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.replace(targetView.id, fragment)?.commitNowAllowingStateLoss()}
}
  • 3s后通过replace()方法在两个LinearLayout中以居中方式添加蓝色背景的MyFragmentAMyFragmentAbackground不会覆盖掉原有Activitybackground
  • 6s后通过add()方法在R.id.add_child_llLinearLayout中以居中方式添加橘色背景的MyFragmentBadd()方法添加并不会移除覆盖掉第一次添加的MyFragmentAbackground。因为不会移除,所以橘色背景的MyFragmentB在第一次添加的MyFragmentAbackground下方继续布局绘制
  • 6s后通过replace()方法在R.id.replace_child_llLinearLayout中以居中方式添加橘色背景的MyFragmentBadd()方法添加会移除覆盖掉第一次添加的MyFragmentAbackground。因为会移除,所以橘色背景的MyFragmentB直接在原有R.id.replace_child_llLinearLayout中直接居中布局绘制
  • 如果只是将新的Fragment添加到Activity,而不关心或者不需要移除已存在的Fragment,使用add()方法。但是如果希望替换container中已存在的Fragment,使用replace()方法

获取当前Fragment的数量

  • 获取ActivityFragment的数量
    override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)Log.i(TAG, "onCreate")setContentView(R.layout.activity_main)addLl = findViewById(R.id.add_child_ll) as? LinearLayoutreplaceLl = findViewById(R.id.replace_child_ll) as? LinearLayoutmMainHandler.postDelayed({val firstFragment1 = MyFragmentA()val firstFragment2 = MyFragmentA()addLl?.let {replaceFragment(firstFragment1, it)}replaceLl?.let {replaceFragment(firstFragment2, it)}Log.i(TAG, "3000ms Number of fragments: ${supportFragmentManager.fragments.size}")Log.i(TAG, "addLl active fragment count = ${addLl?.let { getActiveFragmentCount(it) }} ")Log.i(TAG, "replaceLl active fragment count = ${replaceLl?.let { getActiveFragmentCount(it) }} ")}, 3000)mMainHandler.postDelayed({val secondFragment1 = MyFragmentB()val secondFragment2 = MyFragmentB()addLl?.let {addFragment(secondFragment1, it)}replaceLl?.let {replaceFragment(secondFragment2, it)}Log.i(TAG, "6000ms Number of fragments: ${supportFragmentManager.fragments.size}")Log.i(TAG, "addLl active fragment count = ${addLl?.let { getActiveFragmentCount(it) }} ")Log.i(TAG, "replaceLl active fragment count = ${replaceLl?.let { getActiveFragmentCount(it) }} ")}, 6000)}// log result
// 3s添加了两个MyFragmentA,数量为2
// 6s添加两个MyFragmentB,移除一个MyFragmentA,数量为3
2024-06-06 11:11:31.427 24538-24538 Yang       I  3000ms Number of fragments: 2
2024-06-06 11:11:34.423 24538-24538 Yang       I  6000ms Number of fragments: 3
  • 获取ViewFragment的数量
fun getActiveFragmentCount(view : View): Int {var count = 0supportFragmentManager.fragments.forEach {if(it.view?.parent == view){count++}}return count
}// log result
// 3s添加了两个LinearLayout各自添加一个Fragment
2024-06-06 12:57:55.747 24983-24983 Yang        I  3000ms Number of fragments: 2
2024-06-06 12:57:55.747 24983-24983 Yang        I  addLl active fragment count = 1 
2024-06-06 12:57:55.747 24983-24983 Yang        I  replaceLl active fragment count = 1 
// 6s第一个LinearLayout通过add方式添加,
2024-06-06 12:57:58.739 24983-24983 Yang        I  6000ms Number of fragments: 3
2024-06-06 12:57:58.740 24983-24983 Yang        I  addLl active fragment count = 2 
2024-06-06 12:57:58.740 24983-24983 Yang        I  replaceLl active fragment count = 1 

效果图

在这里插入图片描述

相关文章:

  • 基于单片机的电子万年历设计
  • 11 gpio 与 pinctrl 子系统
  • TCP/IP协议介绍——三次握手四次挥手
  • C语言中指针的说明
  • 浏览器打开 three.js-r160/editor/index.html 后,为何显示白屏
  • C++,观察者模式,模拟Qt的信号和槽机制
  • iOS Universal Links 配置
  • 算法家族之一——二分法
  • Blender + Marvelous Designer(MD)服装,Quad Remesher四边面拓扑布线、UV投射
  • 【ARM Cache 系列文章 1.1 -- Cache size 读取详细介绍及代码实现】
  • STM32F103单片机工程移植到航顺单片机HK32F103注意事项
  • Diffusers代码学习: T2I Adapter
  • 在vscode 中使用npm的问题
  • 【Spring Boot】异常处理
  • cad导入su线条不在一个平面怎么办?
  • 08.Android之View事件问题
  • flutter的key在widget list的作用以及必要性
  • github从入门到放弃(1)
  • Hexo+码云+git快速搭建免费的静态Blog
  • 安装python包到指定虚拟环境
  • 前端代码风格自动化系列(二)之Commitlint
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何解决微信端直接跳WAP端
  • 使用 Docker 部署 Spring Boot项目
  • 算法---两个栈实现一个队列
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • gunicorn工作原理
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (6)设计一个TimeMap
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Note)C++中的继承方式
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (翻译)terry crowley: 写给程序员
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (循环依赖问题)学习spring的第九天
  • (一)基于IDEA的JAVA基础1
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .so文件(linux系统)
  • /proc/interrupts 和 /proc/stat 查看中断的情况