03 Android基础--fragment
03 Android基础--fragment
- 什么是fragment?
- fragment生命周期?
- 动态的fragment与静态的fragment
- fragment常用的两个类与API
- Fragment与Activity通信
什么是fragment?
碎片,一个activity中可以使用多个fragment,可以把activity看成碎片的容器。fragment也有自己的生命周期
fragment生命周期?

需要知道的是:
创建和重建过程: Activity生命周期优先于Fragment
暂停和销毁过程: Fragment生命周期优先于Activity
动态的fragment与静态的fragment
一个xml写,一个用Java代码写。
// 静态的fragment// 第一步:编写fragment所需要的XML文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context=".BlankFragment1"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView"android:textSize="30dp"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:text="Button" />
</FrameLayout>// 第二步:编写activity所需要的XML文件,把fragment的XML定位到activity所需的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"android:orientation="vertical"tools:context=".MainActivity"><!-- name为确定 这个fragment绑定的哪个,id必须设置,因为资源管理会使用。一个avtivity可以包含多个fragment--><fragmentandroid:id="@+id/fragment1"android:name="com.example.fifthdemo_framgent_01.BlankFragment1"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout>// 第三步:编写fragment本身的代码
public class BlankFragment1 extends Fragment {private View root;private TextView textView;private Button button;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if (root == null) {root = inflater.inflate(R.layout.fragment_blank1, container, false);}textView = root.findViewById(R.id.textView);button = root.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {textView.setText("button setOnClickListener");}});return root;}
}// 第四步:编写activity。这个时候,fragment就会被渲染到activity中了。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
// 动态的fragment:一般都用这个// 第一步:编写fragment所需要的XML文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context=".BlankFragment1"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView"android:textSize="30dp"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:text="Button" />
</FrameLayout>// 第二步:编写fragment本身的代码
public class BlankFragment1 extends Fragment {private View root;private TextView textView;private Button button;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if (root == null) {root = inflater.inflate(R.layout.fragment_blank1, container, false);}textView = root.findViewById(R.id.textView);button = root.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {textView.setText("button setOnClickListener");}});return root;}
}// 第三步:编写activity所需要的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"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/bt1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="add fragment" /><Buttonandroid:id="@+id/bt2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="repalce" /><!-- fragment的容器,将来动态创建的fragment直接放这里面--><FrameLayoutandroid:id="@+id/framelayout_1"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#A68EA3"/></LinearLayout>// 第四步:编写activity,动态的创建fragment
public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button1 = findViewById(R.id.bt1);button1.setOnClickListener(this);Button button2 = findViewById(R.id.bt2);button2.setOnClickListener(this);}@Overridepublic void onClick(View view) { //点击事件switch (view.getId()) {case R.id.bt1: replaceFragment(new BlankFragment1());break;case R.id.bt2: replaceFragment(new ItemFragment2());break;}}private void replaceFragment(Fragment fragment) {//获取Fragment的管理器类 FragmentManagerFragmentManager fragmentManager = getSupportFragmentManager();//获取 FragmentManager中用于 Fragment 替换之类的类 FragmentTransactionFragmentTransaction transaction = fragmentManager.beginTransaction();//创建一个替换Fragment的事件transaction.replace(R.id.framelayout_1,fragment); // 替换的是framelayout_1中的fragment//将新的Fragment对象压入一个栈内,点击back会进行回退,而非退出apptransaction.addToBackStack(null);//提交事件transaction.commit();}
}
补充:FragmentManager支持链式调用:
// FragmentManager支持链式调用:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_container, ExampleFragment.class, null).setReorderingAllowed(true).addToBackStack("name") // name can be null.commit();
fragment常用的两个类与API
常用的类
- FragmentManager :顾名思义是负责管理Fragment的管理类,可以对Fragment进行添加、移除、替换等操作。在activity中操作。
- FragmentTransaction :通过FragmentManager获得,保证了fragment操作的原子性。
常用的API
- FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
- transaction.add();//让Activity中添加一个Fragment
- transaction.remove();//从Activity移除一个Fragment,如果被移除的
Fragment没有添加到回退栈,这个Fragment事例将会被销毁。 - transaction.replace();//使用另一个Fragment替换当前到,就相当于remove()以后,再add()
- transaction.hide();//隐藏当前的Fragment。
- Transaction.show();//显示之前隐藏的Fragment
- detach();//将view从UI中移除和remove()不同,此时Fragment的状态依然由FragmentManager维护。
- attach();重建view视图,附加到UI上并显示。
- transaction.commit();//提交一个事务。
Fragment与Activity通信
有很多种,接下来说一些常用的
- 通过构造器
- 通过ViewModel
- 通过EventBus
- 通过接口回调
- 通过Handler
- 通过广播
接下来介绍两种最常用的:
// 通过构造器,在activity中。FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();Fragment fragTop = new FrameTop();fragmentTransaction.replace(R.id.frame1,fragTop);Bundle bundle = new Bundle();fragTop.setArguments(bundle);bundle.putString("name","fragTop");fragmentTransaction.commit();// 在fragment中获取@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);Bundle arguments = getArguments();String name = arguments.getString("name");}
// 通过viewModel,将来这个最常用
// 官方文档代码示例:
public class SharedViewModel extends ViewModel {private final MutableLiveData<Item> selected = new MutableLiveData<Item>();public void select(Item item) {selected.setValue(item);}public LiveData<Item> getSelected() {return selected;}
}public class ListFragment extends Fragment {private SharedViewModel model;public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);itemSelector.setOnClickListener(item -> {model.select(item);});}
}public class DetailFragment extends Fragment {public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);model.getSelected().observe(getViewLifecycleOwner(), item -> {// Update the UI.});}
}相关文章:
03 Android基础--fragment
03 Android基础--fragment什么是fragment?fragment生命周期?动态的fragment与静态的fragmentfragment常用的两个类与APIFragment与Activity通信什么是fragment? 碎片,一个activity中可以使用多个fragment,可以把activi…...
Redis使用,AOF、RDB
前言 如果有人问你:"你会把 Redis 用在什么业务场景下?" 我想你大概率会说:"我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。…...
SOLIDWORKS Premium 2023 SP1.0 三维设计绘图软件
SOLIDWORKS 中文完美正式版提供广泛工具来处理最复杂的问题,并提供深层技术完成关键细节工作。新功能可助您改善产品开发流程,以更快地将创新产品投入生产。Solidworks 是达索公司最新推出的三维CAD系统,它可让设计师大大缩短产品的设计时间,让产品得以快速、高效地投向市场…...
PyQGIS开发--自动化地图布局案例
前言创建地图布局是 GIS 作业结束时的一项常见任务。 它用于呈现最终结果的输出,作为与用户交流的一种方式,以便从地图中获取信息、知识或见解。 在包括 QGIS 在内的任何 GIS 软件中制作地图布局都非常容易。 但另一方面,当我们必须生成如此大…...
严格模式和非严格模式下的this指向问题
一、全局环境 1.函数调用 非严格模式:this指向是Window // 普通函数 function fn () { console.log(this, this); } fn() // 自执行函数 (function fn () { console.log(this, this); })() 严格模式:this指向是undefined //…...
vue2、vue3组件传值,引用类型,对象数组如何处理
vue2、vue3组件传值,引用类型,对象数组如何处理 Excerpt 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父… 下述组件传值指引…...
165. 小猫爬山
Powered by:NEFU AB-IN Link 文章目录165. 小猫爬山题意思路代码165. 小猫爬山 题意 翰翰和达达饲养了 N只小猫,这天,小猫们要去爬山。 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕…...
ECharts教程(详细)
ECharts教程(详细) 非常全面的ECharts教程,非常全面的ECharts教程,目前线条/节点颜色、线条粗细、线条样式、线条阴影、线条平滑、线条节点大小、线条节点阴影、线条节点边框、线条节点边框阴影、工具提醒、工具提醒样式、工具自定义提醒、工具提醒背景…...
pinia
目录一、介绍二、快速上手1.安装2.基本使用与state3.actions的使用4.getters的使用5.storeToRefs的使用6.pinia模块化三、数据持久化1.安装2.使用插件3.模块开启持久化4.按需缓存模块的数据一、介绍 pinia从使用角度和之前Vuex几乎是一样的,比Vuex更简单了。 在Vu…...
mysql中insert语句的五种用法
文章目录前言一、values参数后单行插入二、values参数后多行插入三、搭配select插入数据四、复制旧表的信息到新表五、搭配set插入数据总结前言 insert语句是标准sql中的语法,是插入数据的意思。在实际应用中,它也演变了很多种用法来实现特殊的功能&…...
YOLOV7模型调试记录
先前的YOLOv7模型是pytorch重构的,并非官方提供的源码,而在博主使用自己的数据集进行实验时发现效果并不理想,因此生怕是由于源码重构导致该问题,此外还需进行对比实验,因此便从官网上下载了源码,进行调试运…...
模拟光伏不确定性——拉丁超立方抽样生成及缩减场景(Matlab全代码)
光伏出力的不确定性主要源于预测误差,而研究表明预测误差(e)服从正态分布且大概为预测出力的10%。本代码采用拉丁超立方抽样实现场景生成[1,2]、基于概率距离的快速前代消除法实现场景缩减[3],以此模拟了光伏出力的不确定性。与风电不确定性模拟不同之处在于——光伏存在0出…...
Elasticsearch聚合查询速览
Es 数据分析工具 - Elasticsearch Aggregations (聚合查询) 官方文档 Aggregations | Elasticsearch Guide [7.15] | Elastic 1. Bucket aggregations 桶聚合 that group documents into buckets, also called bins, based on field values, ranges, o…...
CEC2017:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解cec2017(提供MATLAB代码)
一、鱼鹰优化算法简介 鱼鹰优化算法(Osprey optimization algorithm,OOA)由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出,其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…...
Vue3 企业级项目实战:通关 Vue3 企业级项目开发,升职加薪快人一步
Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.juejin.cn/ds/S2RkR9F/ 课程介绍 很高兴为大家介绍这个…...
vue样式绑定(v-if)
文章目录一.第一次用vue框架二.要求:1.定义两种样式,一种描述正确的状态,一种描述错误的状态。2.在结构代码中定义一个块,实现绑定正确的样式状态。3.定义一个按钮,实现正确和错误两种状态的class切换。三.源代码四.效果一.第一次…...
无需公网IP,安全稳定实现U8C异地访问
用友是全球领先的企业云服务与软件提供商,在财务、人力、供应链、采购、制造、营销、研发、项目、资产、协同等领域为客户提供数字化、智能化、社会化的企业云服务产品与解决方案。 U8C是用友针对成长型、创新型企业,提供企业级ERP整体解决方案。在系统…...
Graph Neural Network(GNN)图神经网络
Graph Neural Network(GNN)图神经网络,是一种旨在对图结构数据就行操作的深度学习算法。它可以很自然地表示现实世界中的很多问题,包括社交网络,分子结构和交通网络等。GNN旨在处理此类图结构数据,并对图中的节点和边进行预测或执…...
JSTL核心库的简单使用
JSTL核心库的简单使用 7.1考试重点 7.1.1c:out输出数据 考试重点就是c的相关的 jar包下载地址:Apache Tomcat - Apache Taglibs Downloads 看会典型应用就可以<% page contentType"text/html;charsetUTF-8" language"java" %> <% taglib uri"…...
ffmpeg.dll丢失怎么办,有什么修复ffmpeg.dll的方法
如果你在运行某些音视频软件或游戏时遇到了“ffmpeg.dll丢失”的错误消息,这意味着你的Windows系统中缺少了ffmpeg.dll文件,这是一个必要的动态链接库(DLL)文件,用于支持许多音视频软件和游戏的运行。在这篇文章中&…...
PowerToys Awake终极指南:如何让Windows电脑在你需要时永不休眠?
PowerToys Awake终极指南:如何让Windows电脑在你需要时永不休眠? 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_…...
FPGA阵列信号处理矩阵算子高性能实现【附代码】
✨ 长期致力于自动驾驶、阵列信号处理、矩阵特征值分解、Jacobi旋转、三角矩阵求逆、序列排序、序列部分排序研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1&…...
量子生成模型电路设计:特征相似性优化方法
1. 量子生成建模与电路设计概述量子生成模型作为量子机器学习的重要分支,正逐渐展现出其在特定任务上的潜在优势。这类模型的核心思想是利用量子系统的固有概率特性,通过参数化量子电路(PQC)来学习目标数据集的概率分布。与传统生…...
怎样轻松上手yuzu模拟器:3个实用技巧帮你快速畅玩Switch游戏
怎样轻松上手yuzu模拟器:3个实用技巧帮你快速畅玩Switch游戏 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 你是不是也想在电脑上玩Switch游戏,但又觉得模拟器配置太复杂?别担心…...
ARM AMUv1架构解析与性能监控实战
1. ARM AMUv1活动监视器架构解析活动监视器(Activity Monitor Unit,简称AMU)是ARM架构中用于性能监控的关键硬件组件。作为处理器微架构的一部分,AMU通过专用硬件计数器实现对处理器行为的精确测量。我第一次在Cortex-A76芯片上接…...
3步快速安装:APK Installer让你在Windows电脑上直接运行Android应用
3步快速安装:APK Installer让你在Windows电脑上直接运行Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Windows电脑上直接安装和运行Android…...
ARM微服务器与异构计算:从欧洲实验室到现代数据中心的演进
1. 项目概述:欧洲实验室里的微服务器“新酿”最近在整理资料时,翻到一篇2014年EE Times的老报道,讲的是当时欧洲几个由欧盟资助的微服务器项目。虽然时间过去快十年了,但里面探讨的一些架构思路和设计哲学,在今天看来依…...
别再手动导网表了!巧用OrCAD Capture与Allegro PCB Editor联动,实现原理图变更一键同步
别再手动导网表了!巧用OrCAD Capture与Allegro PCB Editor联动,实现原理图变更一键同步 在PCB设计领域,效率与准确性往往决定着项目成败。当工程师面对频繁的原理图修改时,传统的手动导出-导入网表流程不仅耗时费力,还…...
Markdown基础功能
原文:Markdown基础语法介绍 | Colin Gretzky的博客 本文介绍 Markdown 笔记格式的基础功能,涵盖核心语法和使用要点,适合初学者快速上手。 Markdown 简介 Markdown 是一种轻量级的标记语言,由 John Gruber 于 2004 年设计。它的核…...
Pixel-to-Space 像素到空间 一镜到底·跨镜连续技术解析方案
Pixel-to-Space 像素到空间 一镜到底跨镜连续技术解析方案一、技术总览1.1 核心定义Pixel-to-Space像素到空间,是一套自成体系的二维视频像素向三维物理空间实时反演的全域感知范式,跳出市面传统视频解析与空间重建的通用研发路线,形成专属化…...
