今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起。下面我们看看Fragment跟Activity的关系。

1、为Activity创建事件回调方法在一些情况下, 你可能需要一个fragment与activity分享事件。 一个好的方法是在fragment中定义一个回调的interface, 并要求宿主activity实现它。当activity通过interface接收到一个回调, 必要时它可以和在layout中的其他fragment分享信息。例如, 如果一个新的应用在activity中有2个fragment – 一个用来显示文章列表(framgent A), 另一个显示文章内容(fragment B) – 然后 framgent A必须告诉activity何时一个list item被选中,然后它可以告诉fragmentB去显示文章。

在这个例子中, OnArticleSelectedListener 接口在fragment A中声明:

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 B,从fragment A到来的事件。为了确保宿主activity实现这个接口, fragment A的 onAttach() 回调方法(当添加fragment到activity时由系统调用) 通过将作为参数传入onAttach()的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 implementOnArticleSelectedListener");

}

}

//...

}

如果activity没有实现接口,fragment会抛出 ClassCastException 异常。正常情形下,mListener成员会保持一个到activity的OnArticleSelectedListener实现的引用,因此fragment A可以通过调用在OnArticleSelectedListener接口中定义的方法分享事件给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);

//...

}

传给 onListItemClick() 的 id 参数是被点击的项的行ID,activity(或其他fragment)用来从应用的 ContentProvider 获取文章。

2、添加项目到ActionBar你的fragment可以通过实现 onCreateOptionMenu() 提供菜单项给activity的选项菜单(以此类推, Action Bar也一样)。为了使这个方法接收调用,无论如何,你必须在 onCreate() 期间调用 setHasOptionsMenu() 来指出fragment愿意添加item到选项菜单(否则, fragment将接收不到对 onCreateOptionsMenu()的调用)。

随后从fragment添加到Option菜单的任何项,都会被追加到现有菜单项的后面。当一个菜单项被选择,fragment也会接收到 对 onOptionsItemSelected() 的回调。也可以在你的fragment layout中通过调用registerForContextMenu() 注册一个view来提供一个环境菜单。当用户打开环境菜单,fragment接收到一个对 onCreateContextMenu() 的调用.当用户选择一个项目, fragment接收到一个对onContextItemSelected() 的调用。

注意: 尽管你的fragment会接收到它所添加的每一个菜单项被选择后的回调,但实际上当用户选择一个菜单项时,activity会首先接收到对应的回调。如果activity的on-item-selected回调函数实现并没有处理被选中的项目,然后事件才会被传递到fragment的回调。

这个规则适用于选项菜单和环境菜单。

3、处理fragment的生命周期管理fragment的生命周期, 大多数地方和管理activity生命周期很像.和activity一样, fragment可以处于3种状态:

Resumed        在运行中的activity中fragment可见。

Paused        另一个activity处于前台并拥有焦点,但是这个fragment所在的activity仍然可见(前台activity局部透明或者没有覆盖整个屏幕)。

Stopped        要么是宿主activity已经被停止, 要么是fragment从activity被移除但被添加到后台堆栈中。

停止状态的fragment仍然活着(所有状态和成员信息被系统保持着)。然而,它对用户不再可见,并且如果activity被干掉,他也会被干掉。

其对应关系图如下:

和activity一样, 你可以使用Bundle保持fragment的状态,万一activity的进程被干掉,并且当activity被重新创建的时候, 你需要恢复fragment的状态时就可以用到. 你可以在fragment的 onSaveInstanceState() 期间保存状态,并可以在 onCreate(),onCreateView() 或 onActivityCreated() 期间恢复它。

生命周期方面activity和fragment之间最重要的区别是各自如何在它的后台堆栈中储存。 在默认情况下,activity在停止后,它会被放到一个由系统管理的用于保存activity的后台堆栈。(因此用户可以使用BACK按键导航回退到它)。

然而,仅当你在一个事务期间移除fragment时,显式调用addToBackStack()请求保存实例时,才被放到一个由宿主activity管理的后台堆栈。

另外,管理fragment的生命周期和管理activity生命周期非常类似。因此, "managing the activitylifecycle"中的相同实践也同样适用于fragment。你需要理解的是,activity的生命如何影响fragment的生命。

4、与activity生命周期的协调工作fragment所生存的activity的生命周期,直接影响fragment的生命周期,每一个activity的生命周期的回调行为都会引起每一个fragment中类似的回调。

例如,当activity接收到onPause()时,activity中的每一个fragment都会接收到onPause()。

Fragment 有一些额外的生命周期回调方法,那些是处理与activity的唯一的交互,为了执行例如创建和销毁fragment的UI的动作。这些额外的回调方法是:

•onAttach()

当fragment被绑定到activity时被调用(Activity会被传入)

•onCreateView()

创建和fragment关联的view hierarchy时调用

•onActivityCreated()

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

•onDestroyView()

当和fragment关联的view hierarchy正在被移除时调用

•onDetach()

当fragment从activity解除关联时被调用

fragment生命周期的流程,以及宿主activity对它的影响,在图3中显示。在这个图中,可以看到activity依次的每个状态是如何决定fragment可能接收到的回调方法。例如,当activity接收到它的onCreate(),activity中的fragment接收到最多是onActivityCreated()。

一旦activity到达了resumed状态,你可以自由地在activity添加和移除fragment。因此,仅当activity处于resumed状态时, fragment的生命周期才可以独立变化。

无论如何,当activity离开resumed状态,fragment再次被activity的推入它自己的生命周期过程。

5、总结Fragment的相关知识暂时就讲到这里,例子Demo可以直接看APIDEMO里面的程序,如果不知道API Demo在哪里,请百度!学编程需要自己学会找答案。

android fragment activity 交互,Android基础之Fragment与Activity交互详解相关推荐

  1. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)

    文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...

  2. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)

    文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...

  3. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  4. Sniff网络基础原理和软件实现技巧详解

    Sniff网络基础原理和软件实现技巧详解 前言 SNIFF真是一个古老的话题,关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFF究竟是什么呢? SNIF ...

  5. Python基础之格式化输出函数format()功能详解

    之前发过一篇文章:Python基础之常用格式化输出字符详解 但是呢,有时候我们需要用到多个%的时候,用这个就很不方便了,比如数错%数量或者一 一对应的时候... 这里补充一个字典方式的格式化输出字符的 ...

  6. basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中"获得连接"或"释放资源 ...

  7. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  8. 基础才是王道——TCP/IP详解学习笔记 这位仁兄写得太好了

    TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.as ...

  9. 3dmax基础知识:3dmax常用功能详解,零基础小白的福音

    你收藏了那么多教程,却不知道3dmax怎么入门?掌握3dmax常用功能是3dmax入门的基础之一,今天就为您盘点了一些3dmax最常用到的功能和使用方法,快来和小编一起学习3dmax入门基础知识吧! ...

  10. 从基础到进阶,一文详解RocketMQ事务消息,看完不会跪键盘

    本文转载自:从基础到进阶,一文详解RocketMQ事务消息,看完不会跪键盘 事务消息是RocketMQ提供的非常重要的一个特性,在4.x版本之后开源,可以利用事务消息轻松地实现分布式事务.本文对Roc ...

最新文章

  1. 机器学习必知的8大神经网络架构和原理
  2. WebSocket——stomp连接错误[Whoops! Lost connection to XXX]解决方案
  3. 牛客练习赛36 F-Rabbit的蛋糕 (叉积求面积, 记录前缀)
  4. IOS之学习笔记四(类的实现和对象和id)
  5. CleanMyMac优化教程,使用CleanMyMac延长Mac的使用寿命
  6. python三大神器装饰器_Python2.x
  7. [HNOI2012 Matrix]
  8. Java常用数据类型
  9. Maven 入门——认识Maven结构
  10. 2021年通达信指标公式大全,值得收藏!
  11. 微信小程序-获取微信用户手机号码
  12. 求解一元二次方程的根
  13. 【git】小甲鱼Git教程《极客Python之Git实用教程》笔记一
  14. 如何搭建免费的网络验证系统
  15. python对excel筛选提取文本中数字_Python,从Excel列中提取数字并作为outpu写入
  16. 大话循环神经网络(RNN)
  17. Photoshop教程|ps渐变如何使用?如何给图片制作出渐变效果?
  18. 我的发明20220723
  19. Goby内测版1.8.292|后台扫描、导出截图等功能上线(文末福利等你~)
  20. 分享一些实用的小工具(Windows版)

热门文章

  1. 图像分类:CVPR2020论文解读
  2. 道路场景语义分割算法
  3. TypeError: cannot concatenate ‘str‘ and ‘list‘ objects
  4. 网站项目必备——12款白富美型 jQuery 图片轮播插件
  5. Python中按值来获取指定的键
  6. PyTorch 笔记(20)— torchvision 的 datasets、transforms 数据预览和加载、模型搭建(torch.nn.Conv2d/MaxPool2d/Dropout)
  7. JS中的call()方法和apply()方法用法总结
  8. BNUOJ 52305 Around the World 树形dp
  9. ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
  10. [翻译]自动维护索引重新生成组织的SQL批处理语句