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 的方法,从而传递数据

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

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

相关文章

01背包问题 刷题笔记

思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…

[剪藏] - 教育系统的成功

我在国内并没有系统地学习语音&#xff0c;在英国也未能成功&#xff0c;现在美国我确定我已经行驶在轨道上了&#xff08;即使未来的作业分数及格或不及格&#xff09;。 我反思有这么几点&#xff1a; 1. 美国紧扣系统的教材&#xff0c;不是老师自由发挥。教材是知识精英们…

tidyverse去除表格中含有NA的行

在tidyverse中&#xff0c;特别是使用dplyr包&#xff0c;去除含有NA的行可以通过filter()函数结合is.na()和any()或all()函数来实现。dplyr是tidyverse的一部分&#xff0c;提供了一系列用于数据操作的函数&#xff0c;使数据处理变得更加简单和直观。 以下是一个简单的例子&…

软考笔记--软件系统质量属性

一.软件系统质量属性的概念 软件系统的质量就是“软件系统与明确地和隐含的定义的需求相一致的程度”。更具体地说&#xff0c;软件系统质量就是软件与明确地叙述的功能和性能需求文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。从管理…

关于汽车E\E架构演进的思考(2)

目录 1.概述 2. 整车通信的限制 3 如何保证融合ECU的功能安全和信息安全 4.小结 1.概述 上篇文章主要聊了当前电子电气架构以及未来电子电气架构的特点&#xff0c;简述了即将要面临的挑战&#xff0c;下面我们继续讲述挑战。 2. 整车通信的限制 下一代架构主要以以太网…

python 爬虫 爬电视剧 小网站没经验别看 这个网站没看到不让爬的公告 也没说流量啥的 应该能爬 你们用的话要注意 只供学习使用 不可商用

在开始运行爬虫之前&#xff0c;请确保已经安装了相关依赖&#xff0c;并且在目标小网站上搜索你想要下载的电视剧名称&#xff0c;确认能够精确搜索到相关内容而没有被禁止爬取或者受到流量限制。如果你对爬虫没有相关经验&#xff0c;建议先撤退。 为了爬取电视剧内容&#…

记一次busybox-mountPath简单但容易忽略的问题open /proc/self/fd: no such file or directory

目录 一.设备条件介绍 二.我的目的 三.问题所在 1.在用以下pod进行测试的时候出现问题 2.报错 3.解决 4.解决完成 一.设备条件介绍 [rootk8s-master pv]# containerd --version containerd containerd.io 1.6.25 d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f ​ [rootk…

Centos9环境部署MySQL的PXC

前期理解 pxc就是将多个mysql数据库整合为一个集群&#xff0c;每台服务器上的mysql数据库会实时同步&#xff0c;而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最关注的是数据的一致性&#xff0c;对待事物的行为时&#xff0c;要么在所有节点上执行&#xff…

爬虫(四)

1.图片验证码 import requestsres requests.get(https://www.gushiwen.cn/RandCode.ashx)with open("code.png", "wb") as f:f.write(res.content)2.打码平台 网址&#xff1a;http://www.ttshitu.com/&#xff0c;找到开发文档点击Python,没有钱了要用我…

Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<int>(text2.size()1,0));int res 0;for(int i 1; i < text1.size(); i){for(int j 1; j <…

Leetcode148 排序链表

排序链表 题解1 线性表题解2 自顶向下归并排序题解3 自底向上归并排序 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回排序后的链表 。 题解1 线性表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…

网络编程第1天

OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; &#xff08;1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 应用层提供的协议&#xff1a; HTTP&#xff1a;超文本传输…

React-Redux简单使用

1.配置环境 1.1开启项目 npx create-react-app react-redux-pro 1.2安装配套工具 说明&#xff1a;安装Redux Toolkit和react-redux。Redux Toolkit(RTK)~官方推荐编写Redux逻辑的方式&#xff0c;是一套工具的集合集&#xff0c;简化书写方式&#xff1b;react-redux-用来…

【Leetcode】3028.边界上的蚂蚁

题目描述 思路 题目中要求我们返回 蚂蚁返回到边界的次数。简单来想&#xff0c;就是蚂蚁原来的位置的一维坐标为0&#xff0c;然后经过&#xff0c;若干次移动&#xff0c;统计有几次坐标再次变为0的个数。 我们利用前缀和&#xff0c;像定义一个数组&#xff0c;算出前缀和数…

CleanMyMac X 4.14.6 2024核心功能详解 CleanMyMac X中文官网安装包 Mac电脑系统清理软件

CleanMyMac 是 macOS 上久负盛名的系统清理工具&#xff0c;2018 年&#xff0c;里程碑式版本 CleanMyMac X 正式发布。不仅仅是命名上的变化&#xff0c;焕然一新的 UI、流畅的动画也让它显得更加精致。新增的系统优化、软件更新等功能&#xff0c;使得在日常使用 macOS 时有了…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码&#xff0c;往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时&#xff0c;就会把内存中的数据先读出来&#xff0c;加载到cpu寄存器中&#xff0c;再去参与运算。 但是&#xff0c;关键是cpu读…

Flink实时数仓同步:实时表实战详解

一、背景 在大数据领域&#xff0c;初始阶段业务数据通常被存储于关系型数据库&#xff0c;如MySQL。然而&#xff0c;为满足日常分析和报表等需求&#xff0c;大数据平台采用多种同步方式&#xff0c;以适应这些业务数据的不同存储需求。这些同步存储方式包括离线仓库和实时仓…

细说券商VIP快速交易通道与交易所报单一文看懂

最近的行情渐入佳境&#xff0c;很多朋友都喜欢做短线或者打板交易。可以往往发现打板进去的要么就是量能不足没有封住的&#xff0c;或者说是炸板的&#xff0c;想要交易一字板又打板不进去&#xff0c;这种就很让人苦恼。今天我们就来解答下这种到底该怎么处理&#xff1f;首…

98、小册内容总结

恭喜你,如果你是从头到尾按照顺序看过来的,那么关于小册的内容基本上就看完了(time at: 2024-02-25)。 先备注几点: 按照原来的设想,会写 100 篇左右的文章,实际写了 98 篇(后面还会补几篇代码仓库的使用介绍)。 如果你从头看过来,会发现有些文章篇幅短,而有些文章篇…

Vue中如何处理组件间的耦合问题?

在Vue中处理组件间的耦合问题是前端开发中常见的挑战之一。耦合问题指的是组件之间的依赖关系过于紧密&#xff0c;一旦某个组件发生改动&#xff0c;则可能导致其它组件也需要作出相应调整。为了解决这个问题&#xff0c;我们可以采取以下几种方法&#xff1a; 使用事件总线&…