08 |「Fragment 」

news2025/6/10 12:15:58

前言

实践是最好的学习方式,技术也如此。

文章目录

    • 前言
    • 一、简介
      • 1、是什么
      • 2、为什么要有 Fragment
      • 3. Fragment 详细解释
    • 二、Fragment 与 Activity 的直观理解
    • 三、Fragment 的创建
      • 1、Fragment 的创建方式
      • 2、Fragment 的增删替查
        • 1) 替换(常见)
      • 3、Fragment 的数据传递
        • 1)Activity 向 fragment 传递数据
        • 2)fragment 向 Activity 传递数据
        • 3)fragment 之间传递数据

一、简介

1、是什么

  • Fragment 翻译过来为:片段、碎片;
  • Fragment 直观印象
    • 是一部分内容构成的片段,体现在屏幕上就是一块内容区域;页面区域直接是可以进行切换;整体上是存在于 Activity 上;

2、为什么要有 Fragment

  • 在 Fragment 之前,通常把一个 Activity 作为一个页面;
  • 随着页面元素的增加以及场景的复杂,单个页面已经不能满足需要,在屏幕上通常要同时展示多个区域,多个页面内容,这些内容的切换通常是整体的;
  • 为了让一个 Activity 上承载更多的内容,以及这些内容统一管理,引入了 Fragment;
  • 相对于 Activity,Fragment 更加轻量级一些,相当于一个子页面的概念;

3. Fragment 详细解释

  • 将一块内容区域封装在一起,统一管理,构成一个 Fragment
  • Fragment 是依附在 Activity 上而存在的;
  • 一个 Activity 中可以有个多个 Fragment,各个 Fragment 之间可以传递数据、互相切换;
  • FragmentActivity 类似,也有生命周期函数(onCreate、onPause、onDestory 等);
  • 一个 Fragment 从开始到结束的生命周期流程(因为 fragment 是依附于 Activity 存在的,因此 fragment 的生命周期会受到 Activity 生命周期的影响);
    • onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause ->onStop -> onDestoryView -> onDestroy -> onDetach
  • onCreate()

    • 创建 fragment 时调用,此时 fragment 的视图还没有创建,是 fragment 生命周期开始的地方;在这个阶段,fragment 正在被创建,这个阶段通常用于初始化那些不依赖于 fragment 视图的。
  • onCreateView()

    • fragment 生命周期中专门用于创建和设置 fragment 视图的阶段,在这个阶段,开发者通常会
      • 1)加载布局:通过 LayoutInflater 来加载布局文件,这是设置 fragment 视图的首要步骤;
      • 2)初始化视图组件:找到布局文件中的各个组件(如 TextViews, Buttons 等),并进行相应的设置或事件绑定 ;
      • 3)处理逻辑:根据传入的参数或应用的状态,调整视图的显示或初始化特定的数据;
  • onViewCreated()

    • 在视图创建完成后并返回给宿主Activity之后调用 ;
  • onActivityCreated

    • fragment 所在的 Activity 完成 oncreate() 时调用;
  • onStart

    • fragment 变得可见时调用;
  • onResume

    • fragment 可见且能够与用户交互时调用;
  • onPause

    • 用户即将离开 fragmentfragment 即将被停止时调用;
  • onstop

    • fragment 不再可见时调用;
  • ondestory

    • fragment 销毁时调用;
  • 过程

    • 调用 newInstance 方法:当通过 newInstance 方法创建一个 Fragment 实例时,实际上是调用了 Fragment 的构造方法并设置了相关的参数;在newInstance 方法内部,通过 setArguments 方法将参数传递给 Fragment 实例。
    • 生命周期方法
      • 当将创建的 Fragment 实例添加到 FragmentManager 并提交事务时,系统会管理Fragment的生命周期;
      • 此时,生命周期方法(例如onCreate、onCreateView等)会被系统自动调用;
      • 参数传递:在生命周期方法中,可以通过 getArguments 方法获取通过newInstance 传递的参数。这样设计的好处是,在 Fragment 销毁并重新创建时(例如屏幕旋转),Bundle 中的参数会被保留,不会丢失。

二、Fragment 与 Activity 的直观理解

  • Fragment 需要 Activity 作为它的框架去支持,多个 Fragment 之间可以进行相互切换,每切换一个 Fragment,当前的 Fragment 就会填充到当前 Activity 并进行呈现,其它的 Fragment 会隐藏或者被移除掉;
  • 每一个 Fragment 上面还可以有 子Fragment

三、Fragment 的创建

1、Fragment 的创建方式

  • 静态创建

    • 1)添加依赖
      • 包名(包要导对,和工程相匹配的包);
    • 2)使用 xml 代码引入 Fragment(在布局中直接写进去)
      • 创建一个 Fragment
      • 布局代码中用一个容器承接并绑定
        • 类比于 button ,用标签在布局中写好,在 Fragment 中的 Java 代码中进行绑定;
        • 标签:FragmentFragmentContainerView
    • 步骤总结
      • 在入口界面(Activity)-> 通过 button 点击进入承载 fragment 的 Activity,在承载 fragment 的 Activity的布局里面利用 <fragment 标签引入 fragment -> 创建 fragment 的 java 代码,通过在标签中加入 android:name 与 fragment 的 java 代码关联起来(中有实现对应 fragment 的 xml 文件的对应)
  • 动态创建

    • 添加依赖;
    • 创建一个 Fragment(Java 代码)和布局;
    • 布局代码中用一个容器( <androidx.fragment.app.FragmentContainerView)承接,但不直接在容器中绑定创建的 Fragment
    • 代码中,使用 FragmentManagerFragmentTranction 添加创建的 Fragment 到容器(呈现的 Activity)中;

2、Fragment 的增删替查

1) 替换(常见)
  • 替换的应用场景:页面上一般只会存在一个 fragment,添加一个新的 fragment 时,会将当前 fragment 隐藏或移除;
  • 替换包括的两个步骤
    • 1)将当前容器上的 Fragment 全部移除;
    • 2)添加新的 Fragment

3、Fragment 的数据传递

1)Activity 向 fragment 传递数据
  • 通过方法传递(基本的,通过编程语言的基本性质传递数据,没有涉及到 Android 层面)
    • 通过构造方法
      • 在承载fragment的Activity中创建 fragment 对象时调用其构造方法传递数据,将成员变量设置为传递的数据;
        Fragment fragment = Fragment.newInstance(0, firstPageApps);
        
    • 通过 Public 方法
      • 在承载 fragmentActivity 中创建 fragment 对象时调用 public 方法将成员变量设置为传递的数据;
  • 通过 Argument
    • 是 android 本身提供的向 fragment 传递数据的方式,可用来一次性传递复杂、大量的数据;
    • 通过 public setArguments(Bundle args) 传递数据; Bundle 是一种打包的数据,本质是一个键值对;
    • 通过 public Bundle getArguments() 接收数据;
  • 通过接口
    • 通过接口也是一种基于编程语言自身性质的数据通信方式,与 android 本身无关;
    • 本质上可以看作就是个观察者模式,即 两个对象,“被观察者 - 观察者”
      • 数据由A传到B,A就是被观察者,B就是观察者,B不必亲自观察(因为B不知道A啥时候数据进行变化啥时候需要往外传递数据),它可以派一个小兵替自己观察,当有了结果之后通知B即可,B对相应的数据变化进行展示即可,这个被派去的小兵就是接口;
2)fragment 向 Activity 传递数据
  • 通过 getActivity
    • 由于 Activity 是 fragment 的承载者,每个 fragment 都可以通过 getActivity() 方法获得承载它的 Activity 对象,从而可以调用这个 Activity 类中定义的方法, 进而向 Activity 传递数据;
  • 通过接口
3)fragment 之间传递数据
  • 通过 Activity 中转
    • 由于 Activity 是各个 fragment 的承载者,所以可以作为中间桥梁(作为底层的东西)为各个 fragment 传递数据 ;
    • 通过 Activty 与 fragment 之间传递数据可以知道,在 fragment 中可以通过 getActivity() 获得 Activity 对象;在 Activity 中可以通过 findFragmentById 或者 findFragmentByTag 找到指定的 Fragment。或者 Fragment 作为 Activity 的成员变量直接使用;
    • fragment 之间传递数据
      • fragmentA 向 fragmentB 传递数据,fragmentA 可以通过 getActivity() 拿到承载 fragmentB 的 Activity 对象,然后通过调用 findFragmentById 或者 findFragmentByTag 找到 fragmentB,找到后就可以调用 fragmentB 的方法,从而传递数据

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

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

相关文章

哪个牌子宠物空气净化器好?质量好的宠物空气净化器推荐

即使我们很爱自家的宠物&#xff0c;但我们也无法否认处理房间里飘荡的宠物毛发和皮屑&#xff0c;以及那些令人不快的气味&#xff08;比如地毯上的意外和垃圾桶里的气味&#xff09;的挑战。对于过敏患者来说&#xff0c;这几乎是无法忍受的。寻找有效的方法来减少这些问题对…

电子邮件怎么发送?如何发送匿名电子邮件?

电子邮件发送的详细步骤&#xff1f;电子邮件的发送方式有哪些&#xff1f; 掌握如何发送电子邮件&#xff0c;尤其是如何发送匿名电子邮件&#xff0c;对于保护个人隐私、进行安全交流具有重要意义。下面&#xff0c;AokSend就来详细探讨一下电子邮件的发送方法以及如何发送匿…

转录组总结

1. 软件安装 2.转录组分析步骤&#xff1a; ① 建立环境 #建立python2.7的环境&#xff0c;大部分的转录组信息都需要在Python2的环境下进行 conda create -n py2env python2.7 source activate py2env ② 获取fastqc报告 #单个报告 fastqc -t 15 /home/yinwen/biosoft/DN…

17-Java解释器模式 ( Interpreter Pattern )

Java解释器模式 摘要实现范例 解释器模式&#xff08;Interpreter Pattern&#xff09;实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文 这种模式被用在 SQL 解析、符号处理引擎等 解释器模式提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式 …

数据库(mysql)-新手笔记-基本知识点(1)

基本概念 数据库 Database :存储数据的容器 表 Table : 在数据库中存储的基本结构,它由行和列组成 行 Row : 表中的一条记录 列 Column : 表中的字段,定义了数据的类型和约束 数据类型 数据值 如 INT(整型),FLAOT(浮点型) ,DECIMAL (精确小数点) 字符串 如 VARCHAR(可变长度字…

Linux第68步_旧字符设备驱动的一般模板

file_operations结构体中的函数就是我们要实现的具体操作函数。 注意&#xff1a; register_chrdev()和 unregister_chrdev()这两个函数是老版本驱动使用的。现在新字符设备驱动已经不再使用这两个函数&#xff0c;而是使用Linux内核推荐的新字符设备驱动API函数。 1、创建C…

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了&#xff1f; 3月4日周一&#xff0c;人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人&#xff0c;其中包括Opus、Sonnet和Haiku三种模型&#xff0c;该公司声称&#xff0c;这是迄今为止它们开发的最快速、最强…

NLP:自定义模型训练

书接上文&#xff0c;为了完成指定的任务&#xff0c;我们需要额外训练一个特定场景的模型 这里主要参考了这篇博客&#xff1a;大佬的博客 我这里就主要讲一下我根据这位大佬的博客一步一步写下时&#xff0c;遇到的问题&#xff1a; 文中的cfg在哪里下载&#xff1f; 要不…

Jellyfin影音站点搭建并结合内网穿透实现远程观看本地影视资源

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

国创证券|沪指震荡微跌,资源股集体拉升,黄金概念持续活跃

7日早盘&#xff0c;两市股指盘中震动下探&#xff0c;创业板指、科创50指数跌超1%&#xff0c;北证50指数跌逾2%&#xff1b;北向资金小幅流出。 截至午间收盘&#xff0c;沪指跌0.16%报3035.04点&#xff0c;深证成指跌0.68%&#xff0c;创业板指跌1.48%&#xff0c;科创50指…

基于redis实现用户登陆

因为session有数据共享问题&#xff0c;不同tomcat服务器中的session不能共享&#xff0c;之后负载均衡就无法实现。所以我们用redis代替session。redis可以被多个tomcat服务器共享&#xff0c;redis基于内存。 之前的session可以看做登陆凭证&#xff0c;本次登陆凭证由sessi…

【Redis】Redis的应用场景

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Redis ⛺️稳中求进&#xff0c;晒太阳 Redis的应用场景&#xff1a; 限流 要求10s内只能访问一次 RequestMapping("xian")public String xianLiu(String sign){String sign1 …

allure怎么生成测试报告简单方法

方法一&#xff1a;import pytest pytest.main([‘-s’,‘./执行文件名.py’,‘–alluredir’,‘./result’]) 方法二&#xff1a;os.system(‘allure generate result -o report --clean’) 1、点击index.html&#xff0c;右上角选择浏览器打开 2、查看界面化测试报告

前端vue项目,引入PingFang SC字体

一,首先需要先获取PingFang SC字体,如果你有 请直接跳到第二步 链接:https://pan.baidu.com/s/1nkmV59kT_hvjK4yPJn1cJA 提取码:n0s1 二,将下载好的PingFang SC字体,放在项目的和样式一起的文件下,如下图 然后再创建一个fonts.scss文件(引入的时候注意路径是否正确)…

企业如何实现跨部门和员工之间的高效沟通协同?

在当今高度竞争和信息化的商业环境中&#xff0c;企业内部各部门和员工之间的沟通协同效率直接影响到企业的整体运营效果。那么&#xff0c;企业如何实现各部门和员工之间的高效沟通协同呢&#xff1f; 一、建立有效沟通机制与明确部门职责 要实现各部门和员工间的高效协同&…

第三方软件测试报告有效期是多久?专业软件测试报告获取

第三方软件测试报告是在软件开发过程中&#xff0c;由独立的第三方机构对软件进行全面测试和评估后发布的报告。这些第三方机构通常是与软件开发商和用户无关的专业技术机构&#xff0c;具备丰富的测试经验和专业知识。    第三方测试报告具有以下几个好处&#xff1a;   …

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…

selenium等待机制

selenium等待机制 影响元素加载的外部因素1.计算机的性能2.服务器的性能3.浏览器的性能4.网络因素 强制等待1.强制等待2.页面加载超时机制 隐性等待显性等待1.WebDriverWait类2.WebDriverWait类提供的方法untileuntile_not显性等待的语法格式 3.expected_conditions模块方法exp…

Docker本地部署Redis容器结合内网穿透实现无公网ip远程连接

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

HarmonyOS NEXT应用开发案例——阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…