【Android】Fragment的添加

news2024/11/16 19:47:33

上一篇文章学到了碎片的创建与生命周期,接下来学习碎片的常用操作,其中会用到上一篇文章的三个碎片,就做一个简单的说明吧: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.FragmentContainerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:id="@+id/fcv"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/add1"
        android:text="add1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/add2"
        android:text="add2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/remove1"
        android:text="remove1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/remove2"
        android:text="remove2"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/replace"
        android:text="replace"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/show"
        android:text="show"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/hide"
        android:text="hide"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/attach"
        android:text="attach"/>

    <Button
        android: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 {

    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                addFragment1(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonadd2 = (Button) findViewById(R.id.add2);
        buttonadd2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addFragment2(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonremove1 = (Button) findViewById(R.id.remove1);
        buttonremove1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removefragment1(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonremove2 = (Button) findViewById(R.id.remove2);
        buttonremove2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removefragment2(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonreplace = (Button) findViewById(R.id.replace);
        buttonreplace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                replacefragment(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonshow = (Button) findViewById(R.id.show);
        buttonshow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showfragment(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonhide = (Button) findViewById(R.id.hide);
        buttonhide.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hidefragment(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttonattach = (Button) findViewById(R.id.attach);
        buttonattach.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                attachfragment(FragmentAdd.this.getCurrentFocus());
            }
        });

        Button buttondetach = (Button) findViewById(R.id.detach);
        buttondetach.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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.coloradmin.cn/o/1956292.html

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

相关文章

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…

动手学深度学习V2每日笔记(模型选择+过拟合和欠拟合)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.788.recommend_more_video.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&a…

Java之归并排序

归并排序 归并排序(Merge Sort)算法&#xff0c;使用的是分治思想。分治&#xff0c;顾名思义&#xff0c;就是分而治之&#xff0c;将一个大问题分解成小的子问题来解决。小的子问题解决了&#xff0c;大问题也就解决了。 核心源码: mergeSort(m->n) merge(mergeSort(m-&g…

对于500强企业来说,有比FTP好用的传输工具吗?

500强企业在进行文件传输时&#xff0c;会根据其业务需求、数据安全性要求以及技术架构的不同&#xff0c;选择多种文件传输方式&#xff0c;最常见的便是FTP。然而FTP在使用却存在较多的问题&#xff1a; 1&#xff09;安全性问题 缺乏安全策略&#xff1a;FTP本身不提供加密…

「百年孤独」

引言 《百年孤独》是加西亚马尔克斯创作的魔幻现实主义经典小说&#xff0c;刻画了布恩迪亚家族七代人的跌宕起伏和马孔多小镇的兴衰。是拉丁美洲文学中一部不朽的杰作。 故事概述 小说从布恩迪亚家族的始祖荷塞阿卡迪奥布恩迪亚和妻子乌尔苏拉开始&#xff0c;讲述了七代人…

DeiT III(Meta)论文解读

paper&#xff1a;DeiT III: Revenge of the ViT official implementation&#xff1a;https://github.com/facebookresearch/deit 出发点 本研究旨在重新审视ViT的监督训练方法&#xff0c;并提出一种基于ResNet-50训练方法的简化版新训练策略。与现有的自动数据增强方法不…

C++从入门到起飞之——友元内部类匿名对象对象拷贝时的编译器优化 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、友元 2、内部类 3、 匿名对象 4、对象拷⻉时的编译器优化 5、完结散花 1、友元 • 友元提供…

springAOP理解及事务

AOP&#xff1a; springAOP是什么&#xff1a; AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a; 比如你想统计业务中每个方法的执行耗时&#xff0c;那我们最…

基于bert的自动对对联系统

目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…

什么是婚恋聊天交友源码?今天大家讲解一下。源码交付,支持二开,可打包APP小程序H5。

婚恋交友APP开发前景 对于现代的年轻人来说&#xff0c;社恐已经是深入骨子里不可别除的&#xff0c;除了每天上班下班&#xff0c;许多人宁愿宅在家里&#xff0c;面对线下的相亲机构&#xff0c;家里长辈介绍的会都是饭度抗柜的。而这几年疫情的影响更是大大的限制了正常的社…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

7. 运行时数据区-栈

栈的分类 栈分为Java虚拟机栈还有本地方法栈&#xff1a; Java虚拟机栈&#xff1a;用于保存Java中的方法相关的内容本地方法栈&#xff1a;用于保存在Java中使用native 标记的用C来实现方法 由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容&#xff0c;所以在…

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比&#xff08;Peak Signal-to-Noise Ratio&#xff0c;简称PSNR&#xff09;是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量&#xff0c;可以用来评…

HttpClient初学

介绍&#xff1a; HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议。 这里阿里云的oss依赖底层是httpclient&#xff0c;所以这里不再重…

用f-string+sys.stdout.write定制“自己的writer”

f-stringsys.stdout.write&#xff0c;在python中“随意”我的输出。 (笔记模板由python脚本于2024年07月29日 08:09:35创建&#xff0c;本篇笔记适合喜欢python并有一定基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&am…

dotnet开发编译之争:Ahead-of-Time(AOT) vs Just-in-Time(JIT)谁才是未来最佳编译选择?

1. 前言 编译技术的选择对于现代应用程序的性能至关重要。在.Net开发平台下&#xff0c;选择合适的编译策略对于提升应用程序的响应速度、资源利用率以及最终用户体验有着不可忽视的影响。其中&#xff0c;Ahead-of-Time (AOT) 编译和 Just-in-Time (JIT) 编译是两种广泛采用的…

【编程工具使用技巧】VS如何显示行号

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《编程工具与技巧探索》 期待您的关注 目录 引言 一、VS编译器行号显示的基本步骤 1.打开VS与项目 2.进入选项设置 3.找到并…

Open3D 计算点到平面的距离

目录 一、概述 1.1原理 1.2实现步骤 1.3原理 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2计算距离后赋色的点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#…

【更新2022】省级农业科技活动人员数测算 2009-2022无缺失

省级农业科技活动人员数测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先&#xff0c;这些数据可用于分析省级农业科技活动的规模和结构变化&#xff0c;揭示不同地区在农业科技投入和产出方面的差异&#xff0c;为政府制定农业发展政策…