【Android】Fragment的静态动态创建以及两种创建方式的生命周期

参考:

33.3-Fragment的创建-静态创建2_哔哩哔哩_bilibili

Fragment的创建_从现有代码创建foutran-CSDN博客

【Android】Fragment的基本用法、Fragment和活动间的通信、Fragment的生命周期、动态加载布局的技巧_android fragment-CSDN博客

文章目录

  • Fragment的静态创建
    • 先创建一个导航界面
    • 创建一个Activity用来承载Fragment
    • 在Fragment中完成事件的绑定
    • 在Activity中预览Fragment
    • 注意与额外事项
      • 关于FragmentContainerView标签
      • 注意事项
  • Fragment的动态创建
    • 在Activity中设置一个容器
    • 在Activity的代码中,设置动态创建Fragment的代码
  • 两种方式创建Fragment的生命周期的区别
      • Fragment生命周期
      • 静态创建与动态创建的区别

Fragment的静态创建

  1. 创建一个Fragment
  2. 布局代码中用一个容器承接并绑定
    1. fragment标签
    2. FragmentContainView标签

先创建一个导航界面

先创建一个带按钮的空白界面吧!

img

然后创建一个Fragment

img

创建一个Activity用来承载Fragment

由于Fragment依赖于Activity存在,故而我们首先需要创建一个Activity用来承载fragment。

Be like:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity2"><fragmentandroid:id="@+id/my_fragment"android:layout_width="match_parent"android:layout_height="match_parent"android:name="com.example.fragment.fragment.StaticFragment1"/></androidx.constraintlayout.widget.ConstraintLayout>

做到这一步,还并没有感觉到Fragment跟普通的Activity有什么区别,我们给fragment加点控件再看看。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".fragment.StaticFragment1"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请给我的App打分吧!"android:textSize="20sp"android:id="@+id/tv_like"/><RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rb_notlike"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="不喜欢"/><RadioButtonandroid:id="@+id/rb_verynotlike"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="特别不喜欢"/></RadioGroup></LinearLayout><RatingBarandroid:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

img

在Fragment中完成事件的绑定

先做成这样,而后去fragment的.java文件中进行控件的绑定。

fragment的绑定其实与Activity中的绑定比较相似,在Activity中的绑定往往是:

img

在这里写或者直接用ViewBinding工具。

而在fragment中:

img

可以看到上方的onCreateView函数负责引入布局,而控件的绑定需要我们重写onViewCreated函数,大概像这样:(顺便把事件监听也写了)

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);tvlike =  view.findViewById(R.id.tv_like);rbDislike = view.findViewById(R.id.rb_notlike);rbVeryDislike = view.findViewById(R.id.rb_verynotlike);rbStar = view.findViewById(R.id.rating_bar);rbDislike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){tvlike.setText("我不喜欢这个");}}});rbVeryDislike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){tvlike.setText("我非常不喜欢这个");}}});rbStar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {@Overridepublic void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {if (fromUser) {Toast.makeText(getActivity(), "你给我评了"+rating, Toast.LENGTH_SHORT).show();}}});
}

注:这里也可以用ViewBinding进行绑定,笔者为了演示方便故而直接用的findViewById。

此时点击运行,就能正常使用啦!

在Activity中预览Fragment

我们再切换回创建的用于承载Fragment的Activity中。

img

可以看到,虽然能运行,但是预览界面中我们是看不到的。

只需要加上这句话即可

img

可以预览界面了。

注意与额外事项

关于FragmentContainerView标签

img

谷歌目前更加推荐开发者使用这个标签,专为Fragment设计,添加了一些关于生命周期销毁以及恢复的优化。

注意事项

  1. Fragment标签必须声明 android:id 属性,否则会出问题
  2. name属性可以用class属性代替

Fragment的动态创建

  1. 创建一个Fragment
  2. 布局代码中用一个容器来承接,但不直接绑定
  3. 在代码中用FragmentManager、FragmentTransaction添加Fragment到容器中

在Activity中设置一个容器

img

在Activity的代码中,设置动态创建Fragment的代码

img

public class DynamicFragmentActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_dynamic_fragment);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});if(savedInstanceState == null){FragmentManager supportFragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();fragmentTransaction.add(R.id.fragment_container_view_tag, ExampleFragment1.class,null).setReorderingAllowed(true).addToBackStack(null).commit();}}
}
  1. if(savedInstanceState == null){
    1. 这是一个条件判断语句。savedInstanceState是一个Bundle对象,通常用于保存Fragment的实例状态。如果savedInstanceState为null,说明Fragment是首次创建,而不是从保存的状态中恢复。
  2. FragmentManager supportFragmentManager = getSupportFragmentManager();
    1. 获取当前Activity的FragmentManager实例。FragmentManager用于管理Fragment的生命周期和事务。
  3. FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
    1. 创建一个Fragment事务(FragmentTransaction),用于执行添加、替换、删除Fragment等操作。
  4. fragmentTransaction.add(R.id.fragment_container_view_tag, ExampleFragment1.class,null)
    1. 向FragmentManager中添加一个新的Fragment。R.id.fragment_container_view_tag是Fragment要添加到的容器视图的ID。ExampleFragment1.class是要添加的Fragment的类。null是用于标识Fragment的标签,这里传入null表示不使用标签。
  5. .setReorderingAllowed(true)
    1. 允许Fragment事务中的视图重新排序。这通常用于动画效果,使Fragment的添加或替换看起来更平滑。
  6. .addToBackStack(null)
    1. 将这个Fragment事务添加到后退栈中。用户可以通过按后退键来返回到这个Fragment事务之前的状态。传入null表示不使用标签。
  7. .commit();
    1. 提交Fragment事务。这会触发Fragment的生命周期方法,如onCreateonStart等,并最终将Fragment显示在界面上。

两种方式创建Fragment的生命周期的区别

img

Fragment生命周期

Fragment 的生命周期主要分为以下几个阶段:

  1. onAttach(Context context)
    1. 调用时机:当Fragment被附加到Activity时。
    2. 作用:可以在这里获取Activity的引用。
  2. onCreate(Bundle savedInstanceState)
    1. 调用时机:在Fragment被创建时,通常在ActivityonCreate之后。
    2. 作用:进行初始化操作,如设置布局和初始化数据。
  3. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    1. 调用时机:在Fragment的视图被创建时。
    2. 作用:加载和返回Fragment的视图。
  4. onViewCreated(View view, Bundle savedInstanceState)
    1. 调用时机:在Fragment的视图创建后,但在onStart之前。
    2. 作用:可以在视图已经创建但还未显示时进行一些操作。
  5. onActivityCreated(Bundle savedInstanceState)
    1. 调用时机:在ActivityonCreate方法调用后。
    2. 作用:可以访问Activity的初始化数据。
  6. onStart()
    1. 调用时机:当Fragment开始与用户交互时。
    2. 作用:开始动画或处理用户输入。
  7. onResume()
    1. 调用时机:当Fragment可见并与用户交互时。
    2. 作用:恢复之前暂停的操作。
  8. onPause()
    1. 调用时机:当Fragment不再与用户交互时。
    2. 作用:暂停动画或停止处理用户输入。
  9. onStop()
    1. 调用时机:当Fragment不再可见时。
    2. 作用:释放资源。
  10. onDestroyView()
    1. 调用时机:当Fragment的视图被销毁时。
    2. 作用:销毁视图相关的资源。
  11. onDestroy()
    1. 调用时机:当Fragment被销毁时。
    2. 作用:释放所有资源。
  12. onDetach()
    1. 调用时机:当FragmentActivity中分离时。
    2. 作用:清理与Activity的关联。

静态创建与动态创建的区别

  1. 静态创建
    1. 静态创建通常在Activity的布局文件中定义Fragment
    2. 生命周期方法按顺序调用,从onAttachonDetach
    3. 视图创建和销毁的时机与Activity的生命周期一致。
  2. 动态创建
    1. 动态创建是在代码中通过FragmentManager添加或替换Fragment
    2. 生命周期方法的调用顺序可能会有所不同,例如:
      • FragmentActivityonCreate之前被创建。
      • Fragment的视图在Activity的视图创建之后才创建。
        Activity的布局文件中定义Fragment`。
    3. 生命周期方法按顺序调用,从onAttachonDetach
    4. 视图创建和销毁的时机与Activity的生命周期一致。
  3. 动态创建
    1. 动态创建是在代码中通过FragmentManager添加或替换Fragment
    2. 生命周期方法的调用顺序可能会有所不同,例如:
      • FragmentActivityonCreate之前被创建。
      • Fragment的视图在Activity的视图创建之后才创建。
    3. 动态创建的Fragment可以被添加到不同的Activity中,并且可以多次创建和销毁。

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

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

相关文章

各种复现,保证质量

代码复现&#xff0c;文献复现&#xff0c;模型复现&#xff0c;算法复现&#xff0c;文章复现&#xff0c;创新点等等&#xff0c;python/matlab/c语言/r语言均可&#xff0c;保证高质量完成&#xff0c;可接急单&#xff0c;不成功不收费&#xff01;

前端小知识点——按钮之间出现很小的空隙如何规避

前端小知识点——按钮之间出现很小的空隙如何规避 文章介绍问题再现总结 文章介绍 本文主要介绍页面中两个按钮相邻时会出现一点空隙&#xff0c;导致在后续自定义填充的时候出现换行或其它问题&#xff0c;特此记录。 问题再现 这个图片能看到我们给外面的div设置的是300的宽…

C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解

你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发&#xff1a;std::forward 前言 本文代码片段中变量命名规则如下&#xff1a; 小写字母&#xff1a;一般类型的变量&#xff08;非…

Linux_线程的使用

目录 1、线程与进程的关系 2、线程的优缺点 3、创建线程 4、查看启动的线程 5、验证线程是共享地址空间的 6、pthread_create的重要形参 6.1 线程id 6.2 线程实参 7、线程等待 8、线程退出 9、线程取消 10、线程tcb 10.1 线程栈 11、创建多线程 12、__th…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本&#xff0c;它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下&#xff1a; IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

如何设计数据中心100G网络光纤布线

随着全球企业对带宽的需求呈指数级增长&#xff0c;数据中心需要升级以增强其计算、存储和网络能力。数据中心从10G/25G向100G迁移成为必然趋势。随着网络升级&#xff0c;数据中心的光纤布线系统也需要随之优化。本文将指导您如何设计数据中心100G网络光纤布线。 100G以太网的…

python-快速上手爬虫

目录 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 直接上手爬取网页 1.获取UA伪装 2.获取url 3.发送请求 4.获取数据并保存 总结 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 对pip进行换源&#xf…

基于微信小程序图书馆座位预约系统设计与实现

链接: 文档和工程文件地址: ** 2、未完待续:请到目标位置下载 ** 链接: 文档和工程文件地址:

分布式搜索之Elasticsearch入门

Elasticsearch 是什么 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心&#xff0c;它集中存储您的数据&#xff0c;帮助您发现意料之中以及意料之外的情况。 Elastic Stack 又是什么呢&a…

排序系列 之 快速排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想&#xff0c;即在一个无序的序列中选取一个任意的基准元素base&#xff0c;利用base将待排序的序列分…

【吊打面试官系列-ZooKeeper面试题】分布式集群中为什么会有 Master?

大家好&#xff0c;我是锋哥。今天分享关于 【分布式集群中为什么会有 Master&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 分布式集群中为什么会有 Master&#xff1f; 在分布式环境中&#xff0c;有些业务逻辑只需要集群中的某一台机器进行执行&#xff0c…

Leetcode1305.两颗二叉搜索树中的所有元素

1.题目要求: 给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表&#xff0c;其中包含 两棵树 中的所有整数并按 升序 排序。.2.思路: 我这个方法采用的是设立一个数组&#xff0c;然后用前序遍历把值存入数组中&#xff0c;然后用qsort给它排序 3.代码: /*** Definiti…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

蚂蚁集团推出EchoMimic:能通过音频和面部标志生成逼真的肖像动画视频

蚂蚁集团最近推出了一项名为EchoMimic的新技术。能通过音频和面部标志生成逼真的肖像动画视频&#xff0c;让你的声音和面部动作被完美复制到视频中&#xff0c;效果自然如照镜子。 EchoMimic不仅可以单独使用音频或面部标志点生成肖像视频&#xff0c;也可以将两者结合&#…

任意空间平面点云旋转投影至水平面—罗德里格旋转公式

1、背景介绍 将三维空间中位于任意平面上的点云数据&#xff0c;通过一系列的坐标变换&#xff08;平移旋转&#xff09;&#xff0c;使其投影到XOY平面上&#xff0c;同时保证点云的几何中心与XOY平面的原点重合&#xff0c;同时点云形状保持不变。具体效果如下&#xff0c;具…

深入探究理解大型语言模型参数和内存需求

概述 大型语言模型 取得了显著进步。GPT-4、谷歌的 Gemini 和 Claude 3 等模型在功能和应用方面树立了新标准。这些模型不仅增强了文本生成和翻译&#xff0c;还在多模态处理方面开辟了新天地&#xff0c;将文本、图像、音频和视频输入结合起来&#xff0c;提供更全面的 AI 解…

MySQL MVCC原理

全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;主要是为了提高数据库的并发性能。 1、版本链 对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff1a; 1、trx_id&#xff1a;每次一个事务对某条…

Harbor系列之1:介绍、架构及工作流程说明

Harbor介绍、架构及工作流程说明 Harbor 是一个用于存储、签名和扫描内容的企业级容器镜像注册表项目。由 VMware 开发并于 2016 年开源。Harbor 提供了一些关键特性&#xff0c;使其成为企业使用的理想选择。 1. Harbor 介绍 1.1 什么是 Harbor Harbor 是一个开源的云原生…

UDP网口(1)概述

文章目录 1.计算机网络知识在互联网中的应用2.认识FPGA实现UDP网口通信3.FPGA实现UDP网口通信的方案4.FPGA实现UDP网口文章安排5.传送门 1.计算机网络知识在互联网中的应用 以在浏览器中输入淘宝网为例&#xff0c;介绍数据在互联网是如何传输的。我们将要发送的数据包称作A&a…

在 ROS 2 中创建一个节点的过程

在 ROS 2 中创建一个节点的过程包括几个关键步骤。以下是一般的步骤流程&#xff0c;使用 C 和 ament_cmake 构建系统为例&#xff1a; 步骤 1: 创建工作空间 如果还没有工作空间&#xff0c;首先创建一个&#xff1a; mkdir -p ~/my_ros2_ws/src cd ~/my_ros2_ws colcon bu…