【Android】Fragment的添加

上一篇文章学到了碎片的创建与生命周期,接下来学习碎片的常用操作,其中会用到上一篇文章的三个碎片,就做一个简单的说明吧:LeftFragment(包含一个按钮)、RightFragment4(以粉色为背景的文本,并在这个碎片中写了所有的回调方法)、AnotherRightFragment(以紫色为背景的文本)

FragementManager

每一个Activity都有一个Fragement Manager,用来管理它所包含的Fragement,在使用支持库的时候,使用getSupport-FragmentManager方法来访问Fragement Manager

添加Fragement到Activity中

知识点部分

Fragment的添加

在上一篇当中提到动态地添加碎片,使用是replace()方法,但它其实是碎片的替换方法替换当前的 Fragment 为一个新的 Fragment。真正的添加方法为add()。在一个容器当中可以添加多个Fragment,它们依次盖在上面,类似于FrameLayout。

Fragment的查找

删除与替换的前提都是这个碎片先找到,此时我们使用fragmentManager.findFragmentById(R.id.fcv)fragmentManager.findFragmentByTag("hhh"),根据这两个方法查找到最上面的一个,如果没有,则从BackStack里找,并返回最先添加的一个,如果没有,返回null

Fragment的移除

fragmentTransaction.remove(fragment).commit()方法移除,依次移除当前容器最上面的一个Fragment,但只是将其从容器中移除,backStack里仍然存在,使用查找方法仍可以找到,只不过它的状态是不可见的,需要按下返回键才能彻底移除

Fragment的替换

fragmentTransaction.replace(R.id.fcv, LeftFragment.class, null)当没有addToBackStack会将容器上的所有碎片进行移除,添加新的Fragment。此时BackStack里的Fragment仍然存在,按下返回键依然会响应到BackStack,即弹出BackStack里的Fragment,此时我们看到的是替换的碎片,但是看着好像什么都没有发生。

Fragment的显示与隐藏

show、hide:只是把Fragment显示/隐藏,Fragment的生命周期不发生变化,相当于View的显示/隐藏

attach、detach:把Fragment从容器中移除/装载,Fragment的生命周期发生变化,执行到onDestroyView,其View被销毁,但Fragment仍存在

体验

接下来就体验一下吧:

首先我们创建一个新的活动,其中我们在布局里面放入一个碎片容器以及各种操作的按钮,布局文件代码:

<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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".FragmentAdd"><androidx.fragment.app.FragmentContainerViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:id="@+id/fcv"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/add1"android:text="add1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/add2"android:text="add2"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/remove1"android:text="remove1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/remove2"android:text="remove2"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/replace"android:text="replace"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/show"android:text="show"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/hide"android:text="hide"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/attach"android:text="attach"/><Buttonandroid:id="@+id/detach"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="detach" /></LinearLayout>

主要是在主活动里的代码:

public class FragmentAdd extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_fragment_add);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;});Button buttonadd1 = (Button) findViewById(R.id.add1);buttonadd1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {addFragment1(FragmentAdd.this.getCurrentFocus());}});Button buttonadd2 = (Button) findViewById(R.id.add2);buttonadd2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {addFragment2(FragmentAdd.this.getCurrentFocus());}});Button buttonremove1 = (Button) findViewById(R.id.remove1);buttonremove1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {removefragment1(FragmentAdd.this.getCurrentFocus());}});Button buttonremove2 = (Button) findViewById(R.id.remove2);buttonremove2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {removefragment2(FragmentAdd.this.getCurrentFocus());}});Button buttonreplace = (Button) findViewById(R.id.replace);buttonreplace.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {replacefragment(FragmentAdd.this.getCurrentFocus());}});Button buttonshow = (Button) findViewById(R.id.show);buttonshow.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showfragment(FragmentAdd.this.getCurrentFocus());}});Button buttonhide = (Button) findViewById(R.id.hide);buttonhide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {hidefragment(FragmentAdd.this.getCurrentFocus());}});Button buttonattach = (Button) findViewById(R.id.attach);buttonattach.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {attachfragment(FragmentAdd.this.getCurrentFocus());}});Button buttondetach = (Button) findViewById(R.id.detach);buttondetach.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {detachfragment(FragmentAdd.this.getCurrentFocus());}});}public void addFragment1 (View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.add(R.id.fcv, RightFragment4.class, null, "添加碎片").addToBackStack("hhh").setReorderingAllowed(true).commit();}public void addFragment2 (View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();AnotherRightFragment anotherRightFragment = new AnotherRightFragment();fragmentTransaction.add(R.id.fcv, anotherRightFragment).commit();}public void removefragment1 (View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);Log.d("查找碎片", "查找的顶端碎片" + fragment.toString());fragmentTransaction.remove(fragment).commit();}public void removefragment2 (View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();Fragment fragment = fragmentManager.findFragmentByTag("添加碎片");Log.d("查找碎片", "根据Tag查早的碎片" + fragment.toString());fragmentTransaction.remove(fragment).commit();}public void replacefragment(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.replace(R.id.fcv, LeftFragment.class, null).commit();}public void showfragment(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);if (fragment != null) {fragmentTransaction.show(fragment).commit();}}public void hidefragment(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);if (fragment != null) {fragmentTransaction.hide(fragment).commit();}}Fragment fragmenthh;public void attachfragment(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();/*Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);*/if (fragmenthh != null) {fragmentTransaction.attach(fragmenthh).commit();}}public void detachfragment(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmenthh = fragmentManager.findFragmentById(R.id.fcv);if (fragmenthh != null) {fragmentTransaction.detach(fragmenthh).commit();}}
}

添加:为所有的按钮注册了点击事件,两种不同的添加方式,第一种我们添加进去粉色底色的文本,按下第二个按钮就会添加进去一个紫色的文本,两种添加方式也不同,第一个添加方式采用上一篇内容的模拟返回栈内容,当你按下第一个按钮会看到这样的界面:

在这里插入图片描述

此时按下add2按钮,采用第二种方式添加碎片,界面发生了变化:

在这里插入图片描述

此时我们只能看到第二个碎片,碎片的添加方式是叠加的,此时查看到底有多少个碎片:

在这里插入图片描述

就可以看到此时共有两个碎片,在返回栈当中只有一个碎片,因为只有第一个按钮是将添加的碎片也加入到返回栈当中,此时按下Back按钮会看到页面没有发生任何的变化,此时是将返回栈当中的第一个碎片取出来,再次按下Back键,就会退出这个活动。

思考一下,如果我再次按下第一个按钮,将第一个碎片再次加入到活动当中,此时按下Back键会发生什么,按多少次Back按钮才会退出这个活动呢?

此时我们明白,返回栈当中有两个粉色的碎片,当第一次按下Back按钮,最上面的粉色碎片就会从返回栈当中移除,此时界面为紫色,之后返回栈当中就只剩下一个碎片了与上面的情况一样。因此我们一共需要按3次Back按钮才会退出活动。

查找与删除:我们依次添加四个碎片,此时有两个进入了栈里面,此时页面为紫色碎片的样子

在这里插入图片描述

此时按下第一个移除键,删除的是活动顶部的碎片,紫色碎片被移除,页面为粉色的碎片,查看日志的打印信息:

在这里插入图片描述

可以看到删除的就是顶部的碎片,此时按下remove2,会页面没有发生变化,但我们知道是因为有两个一样的碎片,再次按下remove2,会看到页面变回了紫色,此时查看打印日志:

在这里插入图片描述

再次按下remove1,我们知道碎片已经移除完毕了,此时页面没有任何的碎片,再次按下删除键,此时不会进行移除操作,但会去返回栈寻找最底部即第一次添加的碎片。

替换:重新运行程序,添加几个碎片到活动当中,此时查看含有的碎片:
在这里插入图片描述

按下replace按钮,被替换成了另一个含有按钮的碎片:

在这里插入图片描述

此时查看有多少个碎片:
在这里插入图片描述

此时可以看到活动内所有的碎片都被去除,由新的碎片替代,我们看到栈当中并未有任何的改变,栈内只能由Back键进行操作,此时活动只剩下这一个碎片。

显示与隐藏

在上篇文章中提到我们给RightFragment4添加了回调方法,因此此处使用这个碎片,此时按下hide按钮,我们看到页面发生了变化,由粉色变为了紫色,此时打印日志并没有发生任何的变化。再次按下show按钮,粉色显示出来了,此时打印日志还是没有发生任何的变化。

接下来按下detach按钮,页面与按下hide按钮的效果相同,此时的打印日志:

在这里插入图片描述

当我们attach()的时候这个碎片必须是已经创建好的,但是未与活动创建联系,我们这里将detach的碎片记录下来,这个碎片经过detach()方法与活动解除了联系,再调用attach()方法此时刚才的碎片又显示出来了

到这里就结束了!

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

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

相关文章

跨境电商选品师做好这几个关键点

在当今充满竞争的跨境电商市场上&#xff0c;成为一名成功的选品师并非易事。以下是几个关键点&#xff0c;能够帮助跨境电商选品师做好工作并取得成功。下面老阳为大家总结几点做好跨境选品师的几个关键点&#xff0c;希望对大家有所帮助。 首先&#xff0c;深入市场调研和产品…

Notepad

https://codeforces.com/contest/17/problem/D ​​​​​​​ 没有前导零 因此一共写个数字&#xff0c;再mod c 数据范围很大,因此我们魔改一下快读 再用扩展欧拉定理 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ty…

JAVA里的多线程上部(详解)

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

华清IOday2 24-7-29

1> 写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 1、2024- 7-29 10:31:19 2、2024- 7-29 10:31:20 3、2024- 7-29 10:31:21 ctrlc:停止程序 ./a.out 4、2024- 7-29 10:35:06 5、2024- 7-29 10:35:07 6、2024- 7-29 10:35:08 main.c …

缓存穿透,缓存击穿,缓存雪崩

目录 介绍 缓存穿透 缓存击穿 缓存雪崩 原因 影响 解决方案 缓存穿透 防止缓存穿透->空值缓存案例 缓存击穿 使用互斥锁解决缓存击穿 介绍 缓存穿透 定义&#xff1a;缓存穿透是指用户查询数据&#xff0c;缓存和数据库中都不存在该数据&#xff08;一般是发起恶意…

实战:ZooKeeper 操作命令和集群部署

ZooKeeper 操作命令 ZooKeeper的操作命令主要用于对ZooKeeper服务中的节点进行创建、查看、修改和删除等操作。以下是一些常用的ZooKeeper操作命令及其说明&#xff1a; 一、启动与连接 启动ZooKeeper服务器&#xff1a; ./zkServer.sh start这个命令用于启动ZooKeeper服务器…

403 forbidden (13: Permission denied)

403 forbidden (13: Permission denied) 目录 403 forbidden (13: Permission denied) 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者…

基于视觉的语义匹配见多了,那基于雷达的呢?

论文题目&#xff1a; LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection 论文作者&#xff1a; Yansong Gong, Xinglian Zhang, Jingyi Feng, Xiao He and Dan Zhang 作者单位&#xff1a;北京驭势科技有限公司 导读&#xff…

python 查询机器python、gpu、安装包等环境版本信息

checkenv.py """Check environment configurations and dependency versions."""import importlib import os import resource import subprocess import sys from collections import OrderedDict, defaultdictimport torch# 查询自己想要的包…

cf960(div2)

A. Submission Bait&#xff08;博弈&#xff09; 题意&#xff1a;爱丽丝和鲍勃在大小为n的数组a中进行游戏&#xff0c;他们轮流进行运算&#xff0c;爱丽丝先开始&#xff0c;不能运算的一方输&#xff0c;一开始mx0&#xff0c;每次操作&#xff0c;玩家可以选择一个牵引i…

MOMFEA-SADE--基于子空间对齐和自适应差分进化的多目标多任务优化算法

MOMFEA-SADE–基于子空间对齐和自适应差分进化的多目标多任务优化算法 title&#xff1a; Evolutionary Multitasking for Multiobjective Optimization With Subspace Alignment and Adaptive Differential Evolution author&#xff1a; Zhengping Liang, Hao Dong, Cheng …

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…

“链动革新:2+1模式引领用户复购与留存潮流“

大家好&#xff01;我是吴军&#xff0c;来自一家在业界享有盛誉的软件开发公司&#xff0c;担任产品经理一职。今天&#xff0c;我想和大家深入探讨一个话题——如何利用创新的链动21模式来显著提升用户的留存率和复购率。 提到链动模式&#xff0c;很多人可能第一时间想到的是…

醒醒,别睡了...讲《数据分析pandas库》了—/—<6>

一、 1、长宽格式转换 基于多重索引&#xff0c;Pandas 可以很容易地完成长型、宽型数据格式的相互转换。 1.1 转换为最简格式 stack&#xff08;&#xff09;其使用法如下&#xff1a; stack函数用于将DataFrame中的列转换为行&#xff0c;即将宽格式数据转换为长格式数据。…

中控屏UI设计全解析:布局与交互技巧

在现代科技的浪潮中&#xff0c;中控屏已成为智能系统不可或缺的交互界面。无论是智能家居、车载系统还是工业控制&#xff0c;一个直观、易用且美观的中控屏 UI 设计对于提升用户体验至关重要。本教程将带领你深入探索中控屏UI设计的精髓&#xff0c;指导你如何打造出既专业又…

2024.7.28 记录一次悲惨的笔试——作业帮NLP校招

小红的奇偶抽取 题目描述 题解 #include <iostream> #include<stack> using namespace std;int main() {long long n;stack <int> ji, ou;cin >> n;while (n) {int a n % 10;if (a % 2 0)ou.push(a);elseji.push(a);n n / 10;}long long jN 0, o…

用深度学习改进乳腺癌MRI诊断| 文献速递--AI辅助的放射影像疾病诊断

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 用深度学习改进乳腺癌MRI诊断 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种检测乳腺癌的高度敏感的方式&#xff0c;报告的敏感性超过80%。传统上&#xff0c;其在筛查…

html+css+js作业王者荣耀司空震1个页面带js

htmlcssjs作业王者荣耀司空震1个页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89595421 目录1 目录2 项目视频 htmlcssjs作业王者荣耀司空震1个页面 页面1

QQ微信头像制图工具箱小程序纯前端源码

微信小程序源码&#xff0c;经测试QQ小程序也可以完美运行&#xff0c;所以给大家分享一下这个QQ微信头像制图工具箱小程序纯前端源码。 主要功能有文字九格、头像挂件生成、爆趣九宫格、形状九宫格、创意长图、情侣头像、猫狗交流器。 这个QQ微信小程序源码是纯前端的&#x…

2024 Navicat Premium最新版简体中文版破解激活永久图文详细教程(亲测可用)

1.官网下载&#xff1a;下载地址 2.百度网盘下载&#xff1a;下载地址 3.未安装过的用户可直接跳过该步骤&#xff0c;如果已安装Navicat&#xff0c;记得先卸载干净&#xff0c;防止破解失效&#xff0c;卸载完成后执行补丁压缩包中的Navicat.bat脚本&#xff08;一闪而过表示…