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

【Android】使用FragmentManager动态添加片段

在这里插入图片描述
三三要成为安卓糕手

上一篇文章,我们是在xml中静态添加fragment,但是一些修改或者其他事情是做不了的;

本章我们达成在java代码中灵活添加、删除、替换fragment操作

一:核心代码展示

简单做一个这种页面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment);findViewById(R.id.btn_add).setOnClickListener(this);findViewById(R.id.btn_remove).setOnClickListener(this);findViewById(R.id.btn_replace).setOnClickListener(this);}@Overridepublic void onClick(View v) {MyFragment myFragment = new MyFragment();//获取管理器,开始事务FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if(v.getId() == R.id.btn_add){//获取管理器,开始事务fragmentTransaction.add(R.id.fcv, myFragment,"tag_myFragment");//提交事务fragmentTransaction.commit();} else if (v.getId() == R.id.btn_remove) {//方式二:id移除,优先用这个Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);fragmentTransaction.remove(fragment);fragmentTransaction.commit();//方式一:直接移除
//            fragmentTransaction.remove(myFragment);//方式三:tag移除法
//            fragmentTransaction.remove(fragmentManager.findFragmentByTag("tag_myFragment"));} else if (v.getId() == R.id.btn_replace) {fragmentTransaction.replace(R.id.fcv,new BlueFragment(),"tag_BlueFragment");fragmentTransaction.commit();}}
}

1:三种移除方式

  • 直接移除new出来的fragment
  • id移除,通过FragmentContainer去移除,泛用性更好最推荐。理解成所有Fragment都会抵达的总站,在这里管理更方便
  • tag移除,这是Fragment的一个标签

2:获取管理器和开始事务

这两行代码尽量不要提取成方法成员变量,避免一些未知错误

        //获取管理器,开始事务FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.add(R.id.fcv, myFragment,"tag_myFragment");

在这段代码中,通过 fragmentTransaction.add(R.id.fcv, myFragment, "tag_myFragment") 这行代码,是将 myFragment 这个 Fragment 实例添加到了 idfcv 的容器,从而实现把 myFragment 对应的布局关联到 R.id.fcv 这个容器里,让 myFragment 的界面能够在该容器所在的位置显示出来。

一句话总结:把myFragment布局关联到R.id_fcv这个FragmentContainer中

(1)getSupportFragmentManager()

自定义启动类继承AppCompatActivity;又继承FragmentActivity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

getSupportFragmentManager()是FragmentActivity中提供的方法在当前类中直接获取Fragment管理器

(2)使用事务

开始事务

将当前某个Activity关联控件当中

第一个参数,第二个参数:你要添加的是哪个Fragment,第三个参数:要添加的Fragment在FragmentManager当中的TAG是什么(性能更好)

3:效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:注意事项

每次处理完事务Transaction后记得要commit

二:替换的Fragment代码展示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:为什么更推荐用id移除

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加红色,替换为蓝色,移除掉蓝色,就会出现bug;因为当前不是tag_myFragment了而是蓝色view,那还移除个蛋

http://www.dtcms.com/a/346732.html

相关文章:

  • C# 项目“交互式展厅管理客户端“针对的是“.NETFramework,Version=v4.8”,但此计算机上没有安装它。
  • week4-[字符数组]字符统计
  • STAR-CCM+|K-epsilon湍流模型溯源
  • c语言学习_数组使用_扫雷1
  • 【小沐学GIS】基于Godot绘制三维数字地球Earth(Godot)
  • HTTP的状态码有哪些,并用例子说明一下
  • 人工智能之数学基础:离散随机变量和连续随机变量
  • react中多个页面,数据相互依赖reducer解决方案
  • 变频器实习DAY35
  • 深入理解Java多线程:状态、安全、同步与通信
  • Day12 数据统计-Excel报表
  • 基于llama.cpp的量化版reranker模型调用示例
  • 目标跟踪 YOLO11 单目标跟踪
  • Uipath查找元素 查找子元素 获取属性活动组合使用示例
  • 【数据结构】线性表——链表
  • 基于springboot购物商城系统源码
  • 灵动AI:工业级商品图AI生成工具
  • 【剖析高并发秒杀】从流量削峰到数据一致性的架构演进与实践
  • GaussDB 数据库架构师修炼(十八) SQL引擎-解析器
  • 慢查询该怎么优化
  • 【文献阅读】Lossless data compression by large models
  • 【卷积神经网络详解与实例】2——卷积计算详解
  • Hive中的join优化
  • 解决散点图绘制算法单一导致的数据异常问题
  • DeepSpeed v0.17.5发布:优化性能与扩展功能的全新升级
  • Axure:有个特别实用的功能
  • 寻找AI——高保真还原设计图生成App页面
  • 【K8s】整体认识K8s之Docker篇
  • 完整实验命令解析:从集群搭建到负载均衡配置
  • 在TencentOS3上部署OpenTenBase:从入门到实战的完整指南