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

news2024/9/21 0:36:59

参考:

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">
    
    <fragment
        android: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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="请给我的App打分吧!"
            android:textSize="20sp"
            android:id="@+id/tv_like"/>
        
        <RadioGroup
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <RadioButton
                android:id="@+id/rb_notlike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="不喜欢"/>
            <RadioButton
                android:id="@+id/rb_verynotlike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="特别不喜欢"/>
        </RadioGroup>

    </LinearLayout>

    <RatingBar
        android: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() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                tvlike.setText("我不喜欢这个");
            }
        }
    });
    rbVeryDislike.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                tvlike.setText("我非常不喜欢这个");
            }
        }
    });
    rbStar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
        @Override
        public 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 {

    @Override
    protected 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.coloradmin.cn/o/1936339.html

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

相关文章

贝锐蒲公英远程运维方案:即装即用、无需专线,断网也可远程维护

目前&#xff0c;公路、隧道、桥梁、航道&#xff0c;甚至是施工现场和工业生产环境等&#xff0c;都采用了实时监测方案。 通过部署各类传感器和摄像头等设备&#xff0c;现场视频画面和控制单元&#xff08;如PLC、工控机等&#xff09;数据可以实时回传&#xff0c;用于集中…

0711springNews新闻系统管理 实现多级评论

0611springmvc新闻系统管理-CSDN博客 0711springNews新闻系统管理项目包 实现多级评论-CSDN博客 数据库字段 需要添加父节点id&#xff0c;通过该字段实现父评论和子评论的关联关系。 对象属性 实现链表&#xff0c;通过一个父评论可以找到它对应的所有子孙评论。 业务层 实现…

linux集群架构--web服务器--nginx检查模块/算法/rewrite知识补充

web集群-负载均衡 轮询算法 &#xff08;1&#xff09;概述 决定负载均衡如何把请求分发给后端节点&#xff0c;这种分发的方式就是轮询算法 &#xff08;2&#xff09;轮询算法 面试题&#xff1a;说说常见nginx轮询算法 rr,wrr,ip_hash,lc算法&#xff08;最小连接数&…

CH03_布局

第3章&#xff1a;布局 本章目标 理解布局的原则理解布局的过程理解布局的容器掌握各类布局容器的运用 理解 WPF 中的布局 WPF 布局原则 ​ WPF 窗口只能包含单个元素。为在WPF 窗口中放置多个元素并创建更贴近实用的用户男面&#xff0c;需要在窗口上放置一个容器&#x…

基于 Three.js 的 3D 模型加载优化

作者&#xff1a;来自 vivo 互联网前端团队- Su Ning 作为一个3D的项目&#xff0c;从用户打开页面到最终模型的渲染需要经过多个流程&#xff0c;加载的时间也会比普通的H5项目要更长一些&#xff0c;从而造成大量的用户流失。为了提升首屏加载的转化率&#xff0c;需要尽可能…

怎么关闭 Windows 安全中心,手动关闭 Windows Defender 教程

Windows 安全中心&#xff08;也称为 Windows Defender Security Center&#xff09;是微软 Windows 操作系统内置的安全管理工具&#xff0c;用于监控和控制病毒防护、防火墙、应用和浏览器保护等安全功能。然而&#xff0c;在某些情况下&#xff0c;用户可能需要关闭 Windows…

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

接上一篇 通义千问AI模型对接飞书机器人-模型配置&#xff08;2-1&#xff09; 1、通过飞书机器人对接ai的在线接口 参考文档&#xff1a;发送 HTTP 请求 1.1 创建飞书应用 创建流程 配置http请求 http请求地址上一篇百炼平台配置的应用地址 1.2 企业自建应用对接AI 添加应用…

小程序-5(vant组件+全局数据共享+分包+tabBar案例)

目录 1.使用npm包 小程序对npm的支持和限制 使用vant组件 使用CSS变量定制主题样式 API的promise化 2.全局数据共享 小程序中的全局数据共享方案 安装MobX相关的包 创建MobX的store实例 将Store中的成员绑定到页面中 在页面上使用Store中的成员 将Store中的成员绑定…

pyqt/pyside QTableWidget失去焦点后,选中的行仍高亮的显示

正常情况下pyqt/pyside的QTableWidget&#xff0c;点击input或者按钮失去焦点后 行的颜色消失了 如何在失去焦点时保持行的选中颜色&#xff0c;增加下面的代码&#xff1a; # 获取当前表格部件的调色板 p tableWidget.palette()# 获取活跃状态下的高亮颜色和高亮文本颜色&a…

防火墙内容安全综合实验

一、实验拓扑 二、实验要求 1&#xff0c;假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2&#xff0c;我们需要针对办公区用户进行上网行为管理&#xff0c;要…

仿源码大师主界面UI的iAPP源文件

仿源码大师首页主界面的布局 首页&#xff0c;分类&#xff0c;需求&#xff0c;我的 就只有这几个界面内容而已 资源静态 没有任何动画和功能 纯UI布局 纯UI布局 他的最新版已经不是这个UI布局 放心使用 以学习参考为目的&#xff0c;如有不妥望告知 原创&#xff0c;纯…

国内微短剧系统平台抖音微信付费小程序app开发源代码交付

微短剧作为当下热门的内容&#xff0c;结合抖音平台的广泛用户基础&#xff0c;开发微短剧付费小程序APP具有显著的市场潜力&#xff0c;用户对于短剧内容的需求旺盛&#xff0c;特别是在言情、总裁、赘婿等热门题材方面&#xff0c;接下来给大家普及一下微短剧小程序系统。 顺…

数据结构(5.2_3)——二叉树的存储结构

二叉树的顺序存储 #define MAXLEN 255struct TreeNode {ElemType value;//结点中的数据元素bool isEmpty;//结点是否为空 };void main() {TreeNode t[MaxSize]; } 定义一个长度为MaxSize的数组t&#xff0c;按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点 几个…

【matlab 投影寻踪】基于PSO算法的最优投影方向优化

一 投影寻踪算法 投影寻踪是处理和分析高维数据的一类统计方法&#xff0c;其基本思想是将高维数据投影到低维&#xff08;1&#xff5e;3维&#xff09;子空间上&#xff0c;寻找出反映原高维数据的结构或特征的投影&#xff0c;以达到研究和分析高维数据的目的。1974年&…

Linux下开放指定端口

比如需要开放82端口&#xff1a; #查询是否开通 firewall-cmd --query-port82/tcp#开放端口82 firewall-cmd --zonepublic --add-port82/tcp --permanent#重新加载防火墙 firewall-cmd --reload

云原生系列 - Jenkins

Jenkins Jenkins&#xff0c;原名 Hudson&#xff0c;2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。 官方网站&#xff08;英文&#xff09;&#xff1a;https://www.jenkins.io/ 官方网站&#xff08;中文&#xff09;&#xff1a;https://www.jenkins.io…

2024“钉耙编程”中国大学生算法设计超级联赛(1)

Rank 待补1003树&#xff0c;1005博弈&#xff0c;1012并。 星星 - HDU 7434 - Virtual Judge 这题第一眼云的时候感觉是贪心&#xff0c;后来要上手写代码感觉无从下手&#xff0c;遂反映过来是动态规划。 然后就是一个很简单的dp&#xff0c;外层枚举物品&#xff0c;里面枚举…

多类别支持向量机(Multi-class SVM)

多类别支持向量机&#xff08;Multi-class SVM&#xff09;是一种扩展二分类支持向量机以处理多类别分类问题的方法。常见的方法有“一对一”&#xff08;one-vs-one&#xff09;和“一对多”&#xff08;one-vs-rest&#xff09;。 一、数学模型理论推导 1.1 一对多&#xf…

时间卷积网络(TCN):序列建模的强大工具(附Pytorch网络模型代码)

1. 引言 引用自&#xff1a;Bai S, Kolter J Z, Koltun V. An empirical evaluation of generic convolutional and recurrent networks for sequence modeling. arXiv[J]. arXiv preprint arXiv:1803.01271, 2018, 10. 时间卷积网络&#xff08;Temporal Convolutional Networ…

Six common classification algorithms in machine learning

分类算法是一种机器学习算法&#xff0c;其主要目的是从数据中发现规律并将数据分成不同的类别。分类算法通过对已知类别训练集的计算和分析&#xff0c;从中发现类别规则并预测新数据的类别。常见的分类算法包括决策树、朴素贝叶斯、逻辑回归、K-最近邻、支持向量机等。分类算…