Android Fragment 基本概念和基本使用
Android Fragment 基本概念和基本使用
一、基本概念
Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。
过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。
Android 官方对Fragment的解释如下:
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running.
Fragment表示Activity中的行为或user interface的一部分。可以在单个Activity中组合多个Fragment来构建多窗格 UI 并在多个活动中复用Fragment。可以将Fragment视为Activity的模块化部分,它具有自己的生命周期,接收自己的输入事件,并且可以在Activity运行时添加或删除
由此可知
- Fragment是依赖于Activity的,不能独立存在的。
- 一个Activity里可以有多个Fragment。
- 一个Fragment可以被多个Activity重用。
- Fragment有自己的生命周期,并能接收输入事件。
- 我们能在Activity运行时动态地添加或删除Fragment。
Fragment的优势有以下几点:
- 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
- 可重用(Reusability):多个Activity可以重用一个Fragment。
- 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

Fragment核心的类有:
- Fragment:Fragment的基类,任何创建的Fragment都需要继承该类。
- FragmentManager:管理和维护Fragment。他是抽象类,具体的实现类是FragmentManagerImpl。
- FragmentTransaction:对Fragment的添加、删除等操作都需要通过事务方式进行。他是抽象类,具体的实现类是BackStackRecord。
二、基本使用
在res/layout目录下,新建fragment1.xml,其中内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FF00FF"><TextViewandroid:id="@+id/fragment1_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="this is fragment1"android:textColor="#000000"android:textSize="25sp"/></LinearLayout>
在res/layout目录下,新建fragment2.xml,其中内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFF00"><TextViewandroid:id="@+id/fragment2_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="this is fragment2"android:textColor="#000000"android:textSize="25sp" /></LinearLayout>
在res/layout目录下,activity_main.xml内容如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><fragmentandroid:id="@+id/fragment1"android:name="com.example.fragmentdemo.FragmentOne"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="1" /><fragmentandroid:id="@+id/fragment2"android:name="com.example.fragmentdemo.FragmentTwo"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>
新建的FragmentOne类,继承Fragment,在onCreateView里通过inflate(R.layout.fragment1, container, false)加载刚才写过的fragment1.xml里的布局
package com.example.fragmentdemo;import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class FragmentOne extends Fragment {public static final String TAG = "Fragment1";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d(TAG, "onCreateView");return inflater.inflate(R.layout.fragment1, container, false);}
}
新建的FragmentTwo类,继承Fragment,在onCreateView里通过inflate(R.layout.fragment1, container, false)加载刚才写过的fragment2.xml里的布局
package com.example.fragmentdemo;import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;public class FragmentTwo extends Fragment {public static final String TAG = "Fragment2";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {return inflater.inflate(R.layout.fragment2, container, false);}
}
MainActivity内容如下:
package com.example.fragmentdemo;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;import android.os.Bundle;
import android.view.Display;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
整体的目录结构如下:

显示出来的效果如下所示:

其中如果一个Activity里这种分割开来的片段较多,即可采取多个fragment来组成。
三、Fragment之间如何通信
getActivity方法可以让Fragment获取到关联的Activity,然后再调用Activity的findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。
比如上文中的第二个Fragement需要获取第一个Fragment的文本内容的话,就可以通过
在onActivityCreated方法中,这样来获取
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);TextView textView1= getActivity().findViewById(R.id.fragment1_text);TextView textView2 = getActivity().findViewById(R.id.fragment2_text);// 设置第二个Fragement的文本为第一个Fragment的文本textView2.setText(textView1.getText());Log.d(TAG, "onActivityCreated");}

参考:https://blog.csdn.net/guolin_blog/article/details/8881711
相关文章:
Android Fragment 基本概念和基本使用
Android Fragment 基本概念和基本使用 一、基本概念 Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。 过去s…...
xml schema中的all元素
说明 xml schema中的all元素表示其中的子元素可以按照任何顺序出现,每个元素可以出现0次或者1次。 https://www.w3.org/TR/xmlschema-1/#element-all maxOccurs的默认值是1,minOccurs 的默认值是1。 举例 <element name"TradePriceRequest&…...
Java8实战-总结42
Java8实战-总结42 用Optional取代null应用 Optional 的几种模式默认行为及解引用 Optional 对象两个 Optional 对象的组合使用 filter 剔除特定的值 用Optional取代null 应用 Optional 的几种模式 默认行为及解引用 Optional 对象 采用orElse方法读取这个变量的值࿰…...
实现日期间的运算——C++
😶🌫️Take your time ! 😶🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥代码仓库:🔥🔥魔…...
云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露
文章目录 云原生-K8s安全-etcd未授权访问云原生-K8s安全-Dashboard未授权访问云原生-K8s安全-Configfile鉴权文件泄漏云原生-K8s安全-Kubectl Proxy不安全配置 云原生-K8s安全-etcd未授权访问 攻击2379端口:默认通过证书认证,主要存放节点的数据&#x…...
ChatGPT 的工作原理学习 难以理解 需要先找个容易的课来跟下。
ChatGPT 的工作原理 传统搜超搜引擎原理:蜘蛛抓取和数据收集,用户交互查找。 ChatGPT 的工作原理:数据收集称为预训练,用户响应阶段称为推理。 ChatGPT是一种基于自然语言处理技术的人工智能模型,它的工作原理建立在…...
5.DApp-前端网页怎么连接MetaMask
题记 在前端网页连接metamask,以下是全部操作流程和代码。 编写index.html文件 index.html文件如下: <!DOCTYPE html> <html> <head> <title>My DApp</title> <!--导入用于检测Metamask提供者的JavaScript库--> &l…...
手机应用app打开游戏显示连接服务器失败是什么原因?排查解决方案?
亲爱的同学们,有时候我们在使用手机设备时,可能会遇到一个很头疼的问题——连接服务器失败。这个问题不仅让我们感到困扰,还影响到了我们的用户体验。那么,我们究竟能如何解决这个问题呢?今天,笔者就和大家…...
【Java学习之道】指引篇:从入门到入世
引言 你是否曾为找不到适合自己的Java学习之路而烦恼?是否想摆脱混乱的Java知识体系,找到一条从入门到精通的捷径?来《Java学习之道》吧,本专栏为你量身打造,让我们一起轻松踏上Java学习之旅! 第一章、Jav…...
pytorch_quantization安装
官方安装步骤: pip install nvidia-pyindex pip install pytorch-quantization直接安装pytorch-quantization会找不到,需要首先安装 nvidia-pyindex 包, nvidia-pyindex是一个 pip 源,用来连接英伟达的服务器下载需要的包。 如果…...
开源项目汇总
element-plus 人人开源 人人开源 多租户 若依 jeecg https://gitee.com/jeecg/jeecg?_fromgitee_search#https://gitee.com/link?targethttp%3A%2F%2Fidoc.jeecg.com jeeplus JeePlus快速开发平台 j2eefast Sa-Plus...
android.mk介绍
相对于Android的目前来说以前编译底层都使用Android.mk文件配置ndk,现在都使用Cmake这里我们着重介绍下Android.mk 最最基础的几个变量如下 # 定义模块当前路径 LOCAL_PATH : $(call my-dir) #清空当前环境变量 include $(CLEAR_VARS) # 生成libhell.so LOCAL_M…...
极光笔记 | 发送功能使用技巧分享
在全球化竞争激烈的商业环境中,高效的消息通知解决方案是企业成功的关键。EngageLab作为一家专注于海外市场的消息服务平台,为全球企业提供了一体化的消息通知解决方案。其中,EngageLab的国际邮件发送是其强大而灵活的产品服务之一。本文将与…...
Oracle database 开启归档日志 archivelog
Oracle database 开启归档日志 archivelog 归档日志模式 (Archivelog Mode)。归档日志模式是一种数据库运行模式,它允许数据库将日志文件保存到归档日志目录中,以便在需要时进行恢复和还原操作。通过开启归档日志模式,可以提高数据库的可靠性…...
【学一点儿前端】ajax、axios和fetch的概念、区别和易混淆点
省流读法 ajax是js异步技术的术语,早期相关的api是xhr,它是一个术语。 fetch是es6新增的用于网络请求标准api,它是一个api。 axios是用于网络请求的第三方库,它是一个库。 1.Ajax 它的全称是:Asynchronous JavaScri…...
互联网Java工程师面试题·Java 总结篇·第五弹
目录 47、Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别如何使用? 48、运行时异常与受检异常有何异同? 49、列出一些你常见的运行时异常? 50、阐述 final、finally、finalize 的区别…...
车载电子电器架构 —— 国产基础软件现在与未来
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...
在.Core中用EF添加数据库实体类
首先安装dotnet-ef工具,否则提示: *无法执行,因为找不到指定的命令或文件。 可能的原因包括: *你拼错了内置的 dotnet 命令。 *你打算执行 .NET Core 程序,但 dotnet-ef 不存在。 你打算运行全局工具,但在路径上找不到…...
unigui添加ssl(https)访问的方法
首先到腾讯云或者阿里云去申请免费的证书,前提是在该服务商那有申请过域名,怎么找出这个界面?网页顶部一般都有个搜索框,输入【证书】或者【SSL】就能看到了,然后点击申请免费证书,把解析信息填入自己的域名…...
安防监控系统EasyCVR视频汇聚平台设备树收藏按钮的细节优化
视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…...
AI Agent 艺术创作能力探索
AI Agent 艺术创作能力探索:从生成式工具到自主创作主体的范式跃迁 关键词 AI Agent、生成式艺术、多模态创作、自主创作系统、计算美学、大模型推理、人机协同创作 摘要 本文从第一性原理出发,系统拆解AI Agent艺术创作的底层逻辑、技术架构、实现机制与产业价值。我们将…...
Perplexity翻译查询功能进阶指南(企业级多语种实时校验工作流揭秘)
更多请点击: https://kaifayun.com 第一章:Perplexity翻译查询功能的核心定位与企业价值 Perplexity的翻译查询功能并非传统意义上的词句级机器翻译工具,而是深度集成于其AI推理引擎中的语义理解增强模块。它以“上下文感知翻译”为核心范式…...
C# 零基础到精通教程 - 第六章:方法——让代码“模块化“
6.1 为什么需要方法?6.1.1 没有方法的问题csharp// 没有方法:代码重复、臃肿、难以维护 static void Main() {// 第一次计算两个数的和int a1 10, b1 20;int sum1 a1 b1;Console.WriteLine($"{a1} {b1} {sum1}");// 第二次计算两个数的和…...
手把手教你用Verilog在FPGA上实现Sobel边缘检测(附完整Matlab图片转TXT流程)
从图像到硬件加速:FPGA实现Sobel边缘检测全流程实战指南 在计算机视觉领域,边缘检测作为基础预处理步骤,直接影响着后续特征提取和目标识别的精度。传统基于CPU的算法实现往往难以满足实时性要求,而FPGA凭借其并行计算能力和低延迟…...
湿敏电阻HR202/CM-R的两种驱动方案详解:IO充放电法 vs. 交流方波AD采样
湿敏电阻HR202/CM-R的两种驱动方案深度解析:从原理到实战选择 在环境监测和智能家居领域,湿敏电阻作为成本效益突出的湿度传感方案,其驱动电路的设计直接影响测量精度和系统稳定性。HR202和CM-R作为市面上常见的湿敏电阻型号,工程…...
EMD vs NEMD:分子动力学算热导率,新手到底该选哪个?
EMD与NEMD方法实战指南:如何为你的热导率计算选择最佳方案 在纳米材料和新型功能材料的研究中,热导率的精确计算是理解材料热输运性能的关键。面对平衡态分子动力学(EMD)和非平衡态分子动力学(NEMD)两种主流方法,许多研究者常常陷入选择困境。…...
基于Orange Pi 5 Plus与DEEPX栈的边缘AI部署实战指南
1. 项目概述:当一块开发板遇见AI大潮最近在深圳参加了一场关于人工智能硬件与边缘计算的行业峰会,感触颇深。会上,一款基于Orange Pi 5 Plus开发板打造的DEEPX人工智能产品,实实在在地吸引了我的目光。这不仅仅是又一款“开发板AI…...
为Claude Code配置Taotoken备用通道防止服务中断
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken备用通道防止服务中断 对于依赖Claude Code进行日常编程辅助的开发者而言,服务稳定性直接影…...
从源头到输出:开关电源纹波与噪声的精准抑制策略
1. 开关电源纹波与噪声的本质解析 第一次拆解开关电源时,我被电路板上密集的元器件和错综复杂的走线震撼到了。作为电源工程师,我们每天都在和这些看不见的"电脉冲"打交道——纹波就像电源的心跳,而噪声则是它偶尔的"咳嗽&qu…...
51单片机定时器生成PWM波控制电机转速,从原理到代码调试全流程(基于STC89C52)
51单片机定时器生成PWM波控制电机转速:从寄存器配置到闭环调速实战 在嵌入式控制领域,PWM(脉冲宽度调制)技术如同精准的"电子油门",通过调节脉冲占空比实现对电机转速的精细控制。STC89C52RC这颗经典的51内核…...
