Fragment和Activity

Android面试专题系列(五):说一下Fragment与Activity的关系 不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨—https://blog.youkuaiyun.com/cjm2484836553/article/details/105150473 如果面试官问:“来,说一下什么是Fragment吧,它和Activity有什么关系呢?” 不要觉得Fragment有什么好说的,然后就尬出几个字来。 大家不妨参考一下以下几点,说出个几条来也是不错的呀~ ... 阅读详情

Fragment和Activity的交互

  一个Fragment的实例总是和包含它的Activity直接相关。

  fragment可以通过getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。

  如:

  View listView = getActivity().findViewById(R.id.list);

  但是注意调用getActivity()时,fragment必须和activity关联(attached to an activity),否则将会返回一个null。

 

  相似的,activity也可以获得一个fragment的引用,从而调用fragment中的方法。

  获得fragment的引用要用FragmentManager,之后可以调用findFragmentById() 或者 findFragmentByTag().

  比如:

  ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

 

创建事件回调

  一些情况下,可能需要fragment和activity共享事件,一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现它。

  当activity通过这个接口接收到一个回调,它可以同布局中的其他fragment分享这个信息。

  例如,一个新闻显示应用在一个activity中有两个fragment,一个fragment A显示文章题目的列表,一个fragment B显示文章。

  所以当一个文章被选择的时候,fragment A必须通知activity,然后activity通知fragment B,让它显示这篇文章。

  这个情况下,在fragment A中声明一个这样的接口OnArticleSelectedListener:

复制代码
public static class FragmentA extends ListFragment {
    ...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    ...
}
复制代码

 

  之后包含这个fragment的activity实现这个OnArticleSelectedListener接口,用覆写的onArticleSelected()方法将fragment A中发生的事通知fragment B。

  为了确保宿主activity实现这个接口,fragment A的onAttach() 方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的activity强制类型转换,实例化一个OnArticleSelectedListener对象:

复制代码
public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    ...
}
复制代码

 

  如果activity没有实现这个接口,fragment将会抛出ClassCastException异常,如果成功了,mListener将会是activity实现OnArticleSelectedListener接口的一个引用,所以通过调用OnArticleSelectedListener接口的方法,fragment A可以和activity共享事件。

  比如,如果fragment A是ListFragment的子类,每一次用户点击一个列表项目,系统调用fragment中的onListItemClick() 方法,在这个方法中可以调用onArticleSelected()方法与activity共享事件。

复制代码
public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;
    ...
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Append the clicked item's row ID with the content provider Uri
        Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
        // Send the event and Uri to the host activity
        mListener.onArticleSelected(noteUri);
    }
    ...
}
复制代码

 

 

处理Fragment的生命周期

三种停留状态

  管理fragment的生命周期和管理activity的生命周期类似,和activity一样,fragment可以在三种状态下停留:

  Resumed

  fragment在running的activity中可见。

  Paused

  另一个activity在前景运行,并且享有焦点,但是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。

  Stopped

  fragment不可见。可能是因为宿主activity处于stopped状态,或者fragment被remove掉,然后加在了back stack中。

  一个处于stopped状态的activity还是存活状态的,所有的状态和成员信息会被系统保持。但是,它不再被用户可见,并且如果宿主activity被kill掉,它也会被kill掉。

 

数据存储和恢复

  和Activity类似,可以用Bundle类对象保存fragment的状态,当activity的进程被kill之后,需要重建activity时,可以用于恢复fragment的状态。

  存储时利用onSaveInstanceState()回调函数,恢复时是在 onCreate(), onCreateView(), 或者onActivityCreated()里。

 

Back Stack

  activity和fragment生命周期最重要的不同之处是它们如何存储在各自的back stack中。

  Activity停止时,是存在一个由系统维护的back stack中,但是当fragment停止(被remove)时,需要程序员显示地调用addToBackStack() ,并且fragment是存在一个由宿主activity掌管的back stack中。

 

Fragment和Activity的生命周期

  宿主activity的声明周期直接影响到fragment的生命周期,比如activity生命周期的回调函数调用时,所有在其中的fragment的相同的回调函数会同时被调用。

  Fragment还有一些额外的生命周期回调函数:

onAttach()

  当fragment和activity被关联时调用。

onCreateView()

  当创建fragment的UI被初始化时调用。

onActivityCreated()

  当activity的onCreate()方法返回时调用。

onDestroyView()

  当fragment的UI被移除的时候调用。

onDetach()

  当fragment和activity去关联时调用。

如图:

 

 

 

  从这个图上可以看出activity的状态决定了fragment可能接收到的回调函数。

  比如说,当activity接收到它的onCreate()回调函数,那么这个activity中的fragment最多接收到了onActivityCreated()。

  当activity处于Resumed状态时,可以自由地添加和移除fragment,也即是说,只有activity在Resumed状态时,fragment的状态可以独立改变。

  但是,当activity离开Resumed状态,fragment的生命周期被activity控制。

Android进阶(十二)Fragment VS Activity_android activity和fragment 使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。如果Activity被销毁,那么它其中的所有Fragment都会被销毁。当创建包含Fragment的Activity时,如果用的是Support Library,那么继承的就应该是FragmentActivity而不是Activity。 阅读详情

相关推荐

【Android】Fragment与Activity间通信知识总结

就是在MainActivity进行动态注册时,把data通过构造方法传参的形式传给fragment,所以要对fragment类进行修改。我这里有两个碎片在MainActivity上放着,并且他们各自都有一个按钮和文本,按钮用来发送数据,文本用来接收显示数据。这样,当数据发生变化时,我们可以通过这个变量来调用对应的实现,以通知数据变化。是一个用于携带数据的键值对集合,它可以保存各种类型的数据,本身是一个实现了。接口的类,因此它可以被序列化以便在组件之间传递。方法则是在视图创建完成后调用的,使用。

Patrick_yuxuan的博客 2371

Android Fragment和Activity详细解答

一、Fragment的定义 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或删除片段(有点像您可以在不同 Activity

FeiPeng_的博客 2815

Ollama+FAISS+Embedding+Rerank+LLM 详细部署指南

下载安装Ollama 双击运行安装程序 安装完成后会自动启动服务 修改默认安装路径(避免C盘爆满) 或使用PowerShell: 验证安装 Linux系统部署: (二)准备模型 1. 拉取Embedding模型 2. 拉取LLM模型 注意:原文中提到的可能需要从自定义仓库拉取: 3. 下载Rerank模型 (三)安装依赖库 创建项目目录和虚拟环境: 二、主要功能实现 项目结构 (一)配置文件(config/config.yaml) (二)文本分块策略实现 创建 : (三)文档读取

AI技术改变世界 1580

Android Fragment和Activity

Fragment和Activity   Fragment和Activity的交互   一个Fragment的实例总是和包含它的Activity直接相关。   fragment可以通过getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。   如:   View listView = getActivity().f...

weixin_34413357的博客 387

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5464

Vivado FFT IP核配置与实战:FPGA信号处理硬件加速指南

快速傅里叶变换(FFT)是数字信号处理(DSP)中的核心算法,用于将时域信号转换到频域进行分析。其原理基于离散傅里叶变换(DFT),通过蝶形运算的分解与复用,大幅降低了计算复杂度。在工程实践中,软件实现的FFT难以满足高速实时处理的需求,因此硬件加速方案至关重要。FPGA凭借其并行架构和可定制性,成为实现高性能FFT的理想平台。通过集成专用的FFT IP核,如Vivado中的Pipelined Streaming I/O架构,可以构建流水线化的计算引擎,实现极低延迟和高吞吐量的连续数据流处理。这种硬件方案特

weixin_42536863的博客 646

Activity和Fragment之间的五种跳转方式

自己本次安卓作业中用到的几种跳转就是以上这五种类型了,对于像我这种初学者一口气学这五中跳转难免会被搞的晕头转向,但是一旦自己多写几个案例,多用几次就会发现其实也不难。**ps:**这是本人第一次写博客,由于以前都没有经验,故参考了开头注解的那个链接作者的文章,也是根据自己学的课程来写了更适合初学者来学习的跳转文章,如果有写的不好的地方还望各位多多指教。

m0_73970285的博客 2547

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1359

Activity和Fragment的区别

Activity与Fragment 区别

l531798151的博客 2181

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

CMOS中的 latch-up 闩锁效应、添加tap解决latch-up、使用combained area绘制TAP TAP的作用 IC后端版图【VLSI】

本文详细阐述了闩锁效应latch-up问题、如何通过添加Tap来解决。详细讲述了如何通过combained area来绘制TAP

Jie_MSD的博客 1万+

通过 回调让Activity和Fragment及时交互

Fragment 一经推出,就广泛的使用在项目中,在适配方面,减少代码冗余方面大有助益,那么Fragment和Activity如何交互呢,我所知道的,通过fragment.setxxx(),((类型转换)getActivity).setxxx(),eventbus等等,那么是否可以通过回调让Activity和 Fragment及时交互呢? 首先讲一下我理对回调的理解,A要完成某件事情,但是他没法

why200981317的专栏 4185

【CASS精品教程】006:CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示: 道路设计参数文件 解决办法有三种 第一种方法:Win+R (1)64位系统:输入regsvr32 C:\Windows\SysWOW64\CellCtrl5.ocx,回车 (2)32位系统输入regsvr32 C:...

智慧空间实验室 1万+

Activity和fragment的数据交互(Activity向fragment传数据)

Activity向fragment传数据 先上图 activity与fragment之间进行数据传递:在Activity中将要传递的数据封装在Bundle中,使用setArgument(Bundel bundel)方法传递数据,在要传递到的Fragment中 使用getArgment(),得到传递到的Bundle。 我这放了两个fragment,只需要看懂一个就行了。 具体代码如下: MainA...

南风子的博客 2202

已经下载了WSL2但Docker依然显示版本过旧无法使用,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2906

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android fragment activity 区别,activity和fragment的区别

DIEA1.fragment显得更加灵活。可以直接在XML文件中添加,Activity则不能。eg:2.可以在一个界面上灵活的替换一部分页面,活动不可以,做不到。替换的时候注意要将这个fragment放在返回栈上。3.fragment和Activity之间的通信:(也就是控件的相互操控)fragment控制fragment:得到一个Activity,然后通过这个Activity的getFragme...

weixin_33328904的博客 1789

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

136.Activity和Fragment的通信

当 Activity 直接调用 Fragment 的方法时,Activity 就需要了解 Fragment 的内部实现细节。Activity 和 Fragment 经常需要互相传递数据或者通知对方发生了某些事件。Fragment 不依赖于特定的 Activity,方便复用,解耦合。Fragment 中发生了某些事件,需要通知 Activity。(Activity 向 Fragment 传递数据)

2303_79132118的博客 1259

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android fragment和activity的区别

Fragments基础          到 Android3.0+ 以后,Android新增了Fragments,在没有 Fragment 之前,一个屏幕只能放一个 Activity,Fragment 从功能上讲相当于一个子活动(Activity),它可以让多个活动放到同一个屏幕上,也就是对用户界面和功能的重用,因为对于大屏设备来说,纯粹的 Activity 有些力不从心  Fragme

倾听雨落 1万+

Fragment和Activity的交互

Fragment和Activity   Fragment和Activity的交互   一个Fragment的实例总是和包含它的Activity直接相关。   fragment可以通过getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。   如:   View listView = getActivity().

qq_25474979的博客 469

Activity和Fragment

在SecondActivity中启动FirstActivity时,会发现返回栈中已经存在一个FirstActivity的实例,并且是在SecondActivity的下面,于是SecondActivity会从返回栈中出栈,而FirstActivity重新成为了栈顶Activity,因此FirstActivity的onRestart()方法和SecondActivity的onDestroy()方法会得到执行。系统最不愿意回收的就是处于运行状态的Activity,因为这会带来非常差的用户体验。

jemo的博客 1359

Activity和Fragment有什么区别

Activity和Fragment是 Android 应用开发中两个非常重要的组件,它们都有各自的生命周期方法,包括onCreate。

m0_57236802的博客 1819

Activity和Fragment区别、联系

①生命周期: 生命周期描述 Activity: OnCreate()->OnStart()->OnResume->OnPause()->OnStop()->OnDestory() Fragment: OnAttach()->OnCreate()->OnCreateView()->OnActivityCreate()->OnStart()->OnResume()->OnPause()->OnStop()->OnDestoryView

MagicSound的博客 2927

android fragment和activity通信,Fragment 与 Activity 之间的通信

一、前言在 Fragment 的创建、替换与移除 我们已经讲了 Fragment 的静态添加和动态添加,今天我们来讲 Fragment 的生命周期 和 Fragment 与 Activity 之间的通信。二、Fragment 的生命周期和 Activity 一样,Fragment 也有自己的生命周期,并且和 Activity 的生命周期非常相似。具体如下图所示:这里我们选择几个比较重要的状态来讲解...

weixin_39967405的博客 936

【安卓开发】Activity和Fragment

复用已有实例时调用(SingleTop/SingleTask 模式)Fragment → Activity:通过接口回调。Fragment的生命周期受宿主Activity影响。Activity → Fragment:通过。:视图销毁(Fragment仍存在):初始化界面和数据(只调用一次)会先于其内部Fragment的。:创建视图(返回View):界面可交互(获取焦点):关联到Activity。:与Activity解绑。:失去焦点(部分可见):通过Action匹配。:界面可见但不可交互。

weixin_46896210的博客 731

Android 中 Activity 和 Fragment 的区别

【代码】Android 中 Activity 和 Fragment 的区别。

qq_39460057的博客 914
上一篇: 技术网站
下一篇: android 文件读取(assets,raw)
stonenotes123
博客等级 码龄15年 30粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值