Android开发—Fragment使用

2023-10-30

0.概述

是什么?
Fragment是应用界面中可以重复使用的一部分,可以定义自己的布局、管理自己的生命周期以及处理自己的输入事件。

如何存在?
Fragment不能独立存在,必须由Activity或者另一个Fragment托管

特点?
模块化:

  • Fragment将界面分成离散的模块,不同的Fragment管理自己负责的模块。
  • 当页面比较大或者小的时候,Activity管理整个界面比较麻烦,可以引入Fragment管理界面布局。
  • Activity负责管理界面导航,而Fragment用于管理界面UI展示列表等界面元素
    在这里插入图片描述
  • 图示
    同一屏幕的采用不同屏幕尺寸的两个版本。在左侧,大屏幕包含一个由 Activity 控制的抽屉式导航栏和一个由 Fragment 控制的网格列表。在右侧,小屏幕包含一个由 Activity 控制的底部导航栏和一个由 Fragment 控制的线性列表。

1.Fragment的创建

1.1创建Fragment类

例:

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }
}

1.2将Fragment添加到Activity中

1.2.1 通过xml添加Fragment

将下面代码插入到Activity的xml文件中即可:

<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.example.ExampleFragment" />
  • android:name的值就是对应需要插入的Fragment类名

1.2.2 动态添加

  • 将代码插入到Activity的xml中:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  • 在Activity中添加对应代码
public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.fragment_container_view, ExampleFragment.class, null)
                .commit();
        }
    }
}

注意: 代码中是在savedInstanceStat为null的时候添加,确保界面在首次创建界面的时候添加,当配置变化的时候,不需要重复添加,因为Fragment会从savedInstanceState中恢复。


如果需要传递数据,则实例代码如下:

public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
        	//需要传递的数据
            Bundle bundle = new Bundle();
            bundle.putInt("some_int", 0);

            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                //将bundle作为参数传过去
                .add(R.id.fragment_container_view, ExampleFragment.class, bundle)
                .commit();
        }
    }
}

Fragment中接收:

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        int someInt = requireArguments().getInt("some_int");
        ...
    }
}

2.Fragment管理器

  • FragmentManager类用于负责管理Fragment,比如添加、移除、替换操作以及将操作添加到返回堆栈。

2.1调用FragmentManager

  • Activity调用
    通过 getSupportFragmentManager() 方法调用
  • Fragment调用
    在Fragment中,可以嵌套一个或者多个子Fragment,因此在Fragment中可以通过getChildFragmentManager() 获取子FragmentManager的引用。如果需要访问父FragmentManager,可以通过 getParentFragmentManager() 调用。

2.2 使用FragmentManager

  • 调用FragmentManager.popBackStack()来将最上面的fragment从堆栈中弹出
  • 调用 addToBackStack()来添加多个Fragment、替换多个容器中的Fragment。

2.3 执行事务

  • 如果需要再布局中显示Fragment,需要用FragmentManager创建 FragmentTransaction ,然后就可以执行add()和replace()操作。
    例:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, ExampleFragment.class, null)
    .setReorderingAllowed(true)
    .addToBackStack("name") // name can be null
    .commit();
  • ExampleFragment 会替换当前在布局容器中的 fragment(如有),该布局容器由 R.id.fragment_container ID 进行标识。将 fragment 的类提供给 replace() 方法可让 FragmentManager 使用其 FragmentFactory 处理实例化。

  • setReorderingAllowed(true) 可优化事务中涉及的 fragment 的状态变化,以使动画和过渡正常运行。

  • 调用 addToBackStack() 会将事务提交到返回堆栈。用户稍后可以通过按“返回”按钮反转事务,并恢复上一个 fragment。如果您在一个事务中添加或移除了多个 fragment,弹出返回堆栈时,所有这些操作都会撤消。在 addToBackStack() 调用中提供的可选名称使您能够使用 popBackStack() 弹回到该特定事务。

  • 如果您在执行移除 fragment 的事务时未调用 addToBackStack(),则提交事务时会销毁已移除的 fragment,用户无法返回到该 fragment。如果您在移除某个 fragment 时调用了 addToBackStack(),则该 fragment 只会 STOPPED,稍后当用户返回时它会 RESUMED。在这种情况下,其视图会被销毁。

2.3.1查找Fragment

  • 通过findFragmentById()获取对布局容器当前Fragment引用。实例:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, ExampleFragment.class, null)
    .setReorderingAllowed(true)
    .addToBackStack(null)
    .commit();

...

ExampleFragment fragment =
        (ExampleFragment) fragmentManager.findFragmentById(R.id.fragment_container);
  • 通过分配唯一标识,通过 findFragmentByTag()获取引用
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, ExampleFragment.class, null, "tag")
    .setReorderingAllowed(true)
    .addToBackStack(null)
    .commit();

...

ExampleFragment fragment = (ExampleFragment) fragmentManager.findFragmentByTag("tag");

2.4支持多个返回堆栈

  • 有的时候,应用可能需要支持多个返回堆栈,比如底部使用导航栏。FragmentManager通过saveBackStack()和restoreBackStack()方法支持多个返回堆栈。

假设,使用addToBackStack()提交了FragmentTransaction,从而将Fragment返回到堆栈:

supportFragmentManager.beginTransaction()
  .replace(R.id.fragment_container, ExampleFragment.class, null)
  // setReorderingAllowed(true) and the optional string argument for
  // addToBackStack() are both required if you want to use saveBackStack().
  .setReorderingAllowed(true)
  .addToBackStack("replacement")
  .commit();
  • 可以用saveBackStack()来保存此Fragment事务和ExampleFragment的状态:
supportFragmentManager.saveBackStack("replacement");
  • 可以使用restoreBackStack()来恢复所有弹出事务以及所保存的Fragment状态:
supportFragmentManager.restoreBackStack("replacement");

3.Fragment事务

是什么?

  • 用户每一次提交Fragment就叫做一个事务,并且可以使用FragmentTransaction类提供的API来指定在事务中做什么。
  • 可以通过beginTransaction()函数从FragmentManager中获取FragmentTransaction的实例
    例:
FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  • 每一个FragmentTransaction最后的调用必须是提交事务。commit()方法调用向FragmentManager发出信号,表示所有的操作都被添加到了事务里。
FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

// 在这里可以添加操作

fragmentTransaction.commit();
  • 每一个FragmentTransaction都应该使用.setReorderingAllowed(true)。
FragmentManager fragmentManager = ...
fragmentManager.beginTransaction()
    ...
    .setReorderingAllowed(true)
    .commit();

3.1添加或者移除Fragment

  • 添加:add()
  • 删除:remove()
  • 取代:replace()
// 创建FRagment和事务
FragmentManager fragmentManager = ...
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setReorderingAllowed(true);

// Replace whatever is in the fragment_container view with this fragment
transaction.replace(R.id.fragment_container, ExampleFragment.class, null);

// 提交事务
transaction.commit();

4.Fragment生命周期

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发—Fragment使用 的相关文章

随机推荐

  • 嵌入式毕设项目 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style border solid width 100px height 1px color 000000 size 1 quot 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到
  • 主对角线打印二维数组---美团点评2016研发工程师编程题(二)

    编程题 二维数组打印 有一个二维数组 n n 写程序实现从右上角到左下角沿主对角线方向打印 给定一个二位数组arr及题目中的参数n 请返回结果数组 测试样例
  • ahut 周赛3

    A gzm判试卷 AhutOj 线段树 注意 一定要开到4 N 不然会RE 单点更新 求区间最值 单点更新不需要懒标记 区间修改是大量的点 需要懒标记 AC代码 include
  • 无需依赖Adobe Acrobat,在Java中进行PDF格式转换全新攻略

    将文档从一种格式转换为另一种格式是Spire PDF的主要功能之一 这种转换只不过是加载和保存操作的组合 因此 使用Spire PDF可以将文档从任何受支持的加载格式转换为任何受支持的保存格式 本文整理了包括在Java中以下文件格式的转换指
  • GNN、GCN、GAT图卷积神经网络学习

    一 GNN GNN能干什么 二 GCN 在GNN的基础上 GCN要解决的是一个什么问题呢 以求Xi的平均工资为例 更新后的节点信息 邻居节点的信息N 自身节点的信息 但是A只与B关联 B与很多节点关联 当计算A的平均工资时 按照上面的公式把
  • 4_makefile文件,gdb调试

    4 makefile文件 gdb调试 文章目录 4 makefile文件 gdb调试 1 makefile文件 2 gdb调试 4 makefile文件 gdb调试 1 makefile文件 依赖文件makefile操作 管理 自动化的编译
  • 安装与卸载pytorch

    目录 安装pytorch 方法一 安装pytorch 方法二 推荐 安装torchvision 查看当前pytorch版本 卸载pytorch 安装pytorch 方法一 运行以下命令 可将清华镜像添加至Anaconda仓库中 conda
  • Agents探索实践:自动写文章机器人

    最近几个周末都在写一个自动生成文章的机器人 经过上线实验之后 我的总结如下 1 基于Agents对业务流进行重构就是AI垂直应用的壁垒 2 Prompt的壁垒在于对业务关键环节的重构 可拆解为Role Goal Skill Constrai
  • 1.3.8 手写数字识别之动转静部署

    动静转换 动态图有诸多优点 比如易用的接口 Python风格的编程体验 友好的调试交互机制等 在动态图模式下 代码可以按照我们编写的顺序依次执行 这种机制更符合Python程序员的使用习惯 可以很方便地将脑海中的想法快速地转化为实际代码 也
  • 飞控调试_基于STM32F103开发的飞控系统设计(原理图+PCB+飞控源码)

    飞控是软件和硬件的集合体 没有了硬件或者软件都是不可以 但是上位机就不一样了 这只是一个调试的阶段 或者后期的美化阶段 没有了上位机我们照样可以使用 飞机也照样在天上飞行的 首先我们需要做的硬件设计 其中包括处理器 惯导模块 电源模块等 每
  • Webpack Sourcemap文件泄露漏洞

    Webpack Sourcemap文件泄露漏洞 前言 一 Webpack和Sourcemap 1 1 什么是Webpack 1 2 什么是Sourcemap 二 漏洞利用 2 1 使用reverse sourcemap工具 2 1 直接看前
  • 【教程】如何在标签打印工具TFORMer Designer中自定义布局?

    TEC IT的在线标签生成器TFORMer Designer提供标签打印服务 并提供即用型行业标签模板作为Web服务 使用此软件 您可以在几秒钟内创建您自己的标签和表格或在工业和物流业中使用即时可用的模板 TFORMer Designer的
  • 【源码】爬虫---西瓜视频

    1 瀑布流获取 import requests import json import time import math import hashlib import re import random from zlib import crc3
  • sklearn中RandomForest详解

    文章目录 随机森林基本原理 RandomForestClassifier 参数说明 实例 RandomForestClassifier 随机森林基本原理 随机森林是一种bagging算法 bagging是一种随机采样 bootsrap 算法
  • python画饼图加牵引线_python可视化---饼图添加图例

    原博文 2019 03 03 12 01 import matplotlib pyplot as plt import matplotlib as mpl mpl rcParams font sans serif SimHei mpl rc
  • 简析IBM联合NASA开源的地理空间基础模型

    8月4日 IBM在Hugging Face上开源了地理空间AI基础模型Prithvi Prithvi基于IBM的watsonx ai模型 使用NASA的Harmonized Landsat Sentinel 2 HLS 卫星数据进行训练 并
  • 红米8A 卡刷LineageOS-64位系统,需工具4g内存卡一张

    1 设备解锁 申请解锁小米手机 点击链接 下载解锁工具 根据提示进行解锁 解锁后重启等待5分钟进入系统 2 解锁成功后 刷入TWRP TWRP 请使用安卓10版本 https cloud 189 cn t uuIzymZZFbey 访问码
  • Java学生管理系统升级

    1 案例驱动模式 1 1案例驱动模式概述 通过我们已掌握的知识点 先实现一个案例 然后找出这个案例中 存在的一些问题 在通过新知识点解决问题 1 2案例驱动模式的好处 解决重复代码过多的冗余 提高代码的复用性 解决业务逻辑聚集紧密导致的可读
  • 使用Mutation Observer监听DOM变化(也许是最完全指南?)

    前言 打开自己的博客 猛然发现自己已经有快两个月没有更新了 一方面是因为确实没有遇到什么特别值得记录的问题及知识点 另一方面则是所在部门的组织架构调整 唉 日子难过啊 没啥心情更新 正题 众所周知 我们监听input值得变化 我们可以通过绑
  • Android开发—Fragment使用

    0 概述 是什么 Fragment是应用界面中可以重复使用的一部分 可以定义自己的布局 管理自己的生命周期以及处理自己的输入事件 如何存在 Fragment不能独立存在 必须由Activity或者另一个Fragment托管 特点 模块化 F