android之Fragment(官网资料翻译)三
与Activity通信
尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的. 特别的,fragment可以使用 getActivity() 访问Activity实例, 并且容易地执行比如在activity layout中查找一个view的任务
- View listView =getActivity().findViewById(R.id.list);
同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法, 使用findFragmentById() 或 findFragmentByTag().
- ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
为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 获取文章.
添加项目到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的回调.
这个规则适用于选项菜单和环境菜单.
处理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的生命.
与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的推入它自己的生命周期过程.
转载于:https://blog.51cto.com/whatandroid/1141676
android之Fragment(官网资料翻译)三相关推荐
- android之Fragment(官网资料翻译)二
添加一个用户界面 fragment通常用来作为一个activity的用户界面的一部分,并将它的layout提供给activity.为了给一个fragment提供一 个layout,你必须实现 onCr ...
- 【考公人的福利】Python爬取中公官网资料
[考公人的福利]Python爬取中公官网资料 一.简述 二.代码 三.运行结果 一.简述 写这个代码的目的是能够高效率提取中公官网的资料,例如:申论.行测.面试热点.公安基础知识等.大家可以根据个人需 ...
- 恩智浦NXP I.MX6ULL芯片介绍下载官网资料
参考:NXP I.MX6ULL芯片介绍以及资料的获取 作者:一只青木呀 发布时间:2020-09-26 10:54:26 网址:https://blog.csdn.net/weixin_4530991 ...
- Android Dev Tools官网地址:http://www.androiddevtools.cn/
AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...
- Away3D 4.0官网教程(翻译)
使用Away3D 4.Stage3D 创建3D游戏和应用程序 (此帖每天都会更新,一定让大家完全的搞明白) 补充区: 'vase.awd' 可以使用 Prefab3D打开(在帖子后面回复 ...
- Godot官网新闻翻译 - 2014年
本文是"Godot官网新闻翻译"系列的第1篇,该系列旨在翻译和汇总Godot官网所发布的所有新闻.让更多英文不好的童鞋可以领悟官方新闻中的重要信息和真谛. 官网新闻地址:https ...
- ES基本概念及废除type 官网资料 - 阅读有困难的加了翻译 - 我只是官网的搬运工
ES官网: https://www.elastic.co/ Basic Concepts There are a few concepts that are core to Elasticsearch ...
- Spring官网阅读(三)自动注入
上篇文章我们已经学习了1.4小结中关于依赖注入跟方法注入的内容.这篇文章我们继续学习这结中的其他内容,顺便解决下我们上篇文章留下来的一个问题-----注入模型. 前言: 在看下面的内容之前,我们先要对 ...
- NVIDIA Jetson官网资料整理
可看到,对比树莓派相关方面的资料,NVIDIA Jetson的资料不多,特别是一些国内的培训机构,这方面系统性的介绍也几乎没有,所以我们应该围绕官网转.博主之前学习TensorRT以及OpenVINO ...
最新文章
- C#自定义异常 统一异常处理
- 客户提的功能(需求),不能随口一说就当做,要分析其实质价值,多思考。
- canvas离屏技术与放大镜实现
- .NetCore上传多文件的几种示例
- 网络节点是计算机与网络的什么,网络节点是什么意思?
- 快手小视频批量下载高清无水印软件 快手短视频批量下载高清无水印软件
- 苹果手机投影到墙上_针对商业用户倾情打造,明基E582智能无线投影仪体验
- Renesas:RH850的FCL库移植与使用
- linux下文件恢复方法,Linux下误删文件恢复办法
- php合成flv,用php将任何格式视频转为flv
- excel常用快捷键详解
- u-boot编译构成之 MLO(2)
- 花洒水龙头加州节水认证CEC
- python七段数码管绘制实验报告_Python绘制七段数码管实例代码
- Java 内存模型如何保证多线程安全
- 2021年初oracle最新版本是多少_Oracle升级该怎么选版本
- html img素材,html使用img标签和背景图片之间的区别
- 阿里云视觉智能API,核心技术一站共享!
- Excel:12 个操作小技巧
- EBox3300开发简明流程
热门文章
- 源码来袭:bind手写实现
- Linux命令(三) 移动文件 mv
- C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
- c++正确处理 is-a has-a关系
- 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败 的解决方法(转)
- http有哪些请求方法
- FineUICore(基础版)v5.4.0已发布!
- CSS3展开带弹性动画的手风琴菜单
- hibernate课程 初探单表映射1-4 hibernate开发前准备
- Project Euler Problem 9-Special Pythagorean triplet