08 |「Fragment 」

前言

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

文章目录

    • 前言
    • 一、简介
      • 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 的方法,从而传递数据

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

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

相关文章

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

海外IP代理应用:亚马逊使用什么代理IP?

代理IP作为网络活动的有力工具&#xff0c;同时也是跨境电商的必备神器。亚马逊作为跨境电商的头部平台&#xff0c;吸引了大量的跨境电商玩家入驻&#xff0c;想要做好亚马逊&#xff0c;养号、测评都需要代理IP的帮助。那么应该使用什么代理IP呢&#xff1f;如何使用&#xf…

TikTok小店如何批量生成/上传产品视频?

有许多Shopee卖家都会遇到这样的问题&#xff1a;明明产品标题、描述优化了&#xff0c;产品主图也认真做了&#xff0c;但是自己的Shopee店铺还是没转化! 可能是忽略了产品视频。 在Shopee官方的交流沙龙中&#xff0c;Shopee官方讲师提及&#xff1a;“有视频的产品比没有视…

插件WebApiClient.JIT报异常Cannot access a disposed object

调第三方接口使用的是插件WebApiClient.JIT 这个插件很好用&#xff0c;一直使用的都没问题&#xff0c;但是今天却出现了一个奇怪的问题&#xff0c;放在循环里调接口抛异常“Cannot access a disposed object” 调了login接口后IsDisposed true&#xff0c;再使用_erpOutAp…

基于Llama 2家族的提示词工程:Llama 2 Chat, Code Llama, Llama Guard

Prompt Engineering with Llama 2 本文是学习 https://www.deeplearning.ai/short-courses/prompt-engineering-with-llama-2/ 的学习笔记。 文章目录 Prompt Engineering with Llama 2What you’ll learn in this course [1] Overview of Llama Models[2] Getting Started wi…

【DP】蓝桥杯第十三届-费用报销

#include<iostream> #include<algorithm> #include<cstring> #include<set> #include<queue> using namespace std; const int N1010; int dp[N][5010];//dp[i][j]:选到第i个物品是否能取到价值j&#xff1b; int month[13]{0,31,28,31,30,31,30…

Vivado HLS学习笔记

任意精度的数据类型 u 代表 unsigned&#xff0c;fixed代表定点数据&#xff0c;即常数 采用任意精度的数据类型可以使用更少的资源&#xff0c;硬件友好性 数据类型定义在 header file 中 表示任意进制 ap_int<6> a("101010",2); //二进制数据101010 ap_in…

一个比较全面实用的C#帮助类、工具类库

前言 经常会有一些同学会问为什么感觉我身边的大佬写一个功能会这么快&#xff1f;一个类似的模块大佬可能半天就搞定了&#xff0c;而我要搞一两天。其实工作久了你会发现很多常用公共的帮助类和工具类&#xff0c;如常见的Excel数据导入导出、文件操作、字符串操作、数据转换…

【Spring】yaml自定义参数添加提示功能

文章目录 1. 说明2. 依赖3. 处理流程&#xff08;以自定义swagger配置为例&#xff09;3.1 定义自定义参数SwaggerProperties3.2 通过Configuration启用并使用自定义参数 4. 使用 返回首页 1. 说明 编写SpringBoot项目时是不是羡慕spring以及第三方插件的自动提示功能。其实实…

【CSP试题回顾】201409-3-字符串匹配

CSP-201409-3-字符串匹配 关键点&#xff1a;<string>库函数的使用 length() 或 size(): 返回字符串的长度。 empty(): 检查字符串是否为空。 append() 或 : 向字符串的末尾添加字符或另一个字符串。 insert()在字符串的指定位置插入另一个字符串或字符。 std::str…

《汇编语言》第3版 (王爽)第10章检测点解析

第10章 检测点 检测点10.1&#xff1a;补全程序&#xff0c;实现从内存1000:0000处开始执行指令。 解析: 我们知道retf指令是用栈中的数据&#xff0c;同时修改CS和IP寄存器中的内容&#xff0c;实现远转移&#xff0c;而且是先出栈的数据放入IP中&#xff0c;后出栈的数据放入…

数据分析-Pandas两种分组箱线图比较

数据分析-Pandas两种分组箱线图比较 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

Yolov7-tiny如何指定某个权重继续断点训练,并且训练到指定轮数

文章目录 前情提要步骤1. 拷贝整个运行train.py之后生成的文件&#xff08;然后删掉weights文件夹&#xff09;2. 删掉新路径下的weights里的所有权重&#xff0c;然后挑选一个权重放进去3. 修改新路径下的opt.yaml4. 指定新路径下的weights重的权重的绝对路径&#xff0c;开始…

Modified Bessel Function of the First Kind

Abstract 最近接触到 von Mises–Fisher distribution, 其概率密度如下: f p ( x ; μ , κ ) κ p 2 − 1 ( 2 π ) p 2 I p 2 − 1 ( κ ) e κ μ ⊺ x \begin{aligned} f_{p}(\bm{x}; \bm{\mu}, \kappa) \frac{\kappa^{\frac{p}{2}-1}} {(2\pi)^{\frac{p}{2}} I_{\frac…

2.5K Star,打造个性化博客平台

2.5K Star&#xff0c;打造个性化博客平台 Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 导语 在当今的信息时代&a…

Interceptor拦截器+JWT令牌实现登陆验证

一、背景 与过滤器的作用类似&#xff0c;不过拦截器是spring中的组件&#xff0c;只能拦截进入spring的请求&#xff1b;过滤器则可以拦截所有从前端页面发送来的请求。 *拦截器和过滤器选一就可以实现登陆验证&#xff0c;过滤器的实现在以下这篇博客中&#xff0c;有需要可…

设置Matlab2022a断点查看参数变化

Matlab2022a设置断点&#xff0c;查看参数变化 本文使用的是下载好的matlab2022a软件&#xff0c;下载加安装matlab预计1小时&#xff08;百度网盘加速&#xff09;。需要的安装包的评论。 安装好的matlab界面如下&#xff1a; 接下来&#xff0c;编辑一个.m文件&#xff0c;…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子&#xff0c;谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署&#xff08;迁移&#xff09;项目时发现&#xff0c;项目的excel导出功能报错&#xff0c;错误如下…

灵根孕育源流出,心性修持大道生

解法&#xff1a; 手动本地跑了一下1e9&#xff0c;显然超时。 然后预处理发现开不了这么大的数组。 肯定有规律&#xff0c;打表看看 代码如下 #include<iostream> #include<vector> #include<algorithm> #include<cmath> using namespace std; #…

3.7作业

一 1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 应用层提供的协议&#xff1a; &#xff08;2&#xff09;表示层 负责网络中通信的数据的编码和格式&#xff0c;确保通信过程中…