API拾遗录之Fragment
Fragment必须内嵌到activity中,它不能单独使用,并且它的生命周期受到activity生命周期的制约——当activity暂停时,所有的fragment暂停,当activity停止时,所有的fragment停止。只有当activity处于运行态(resumed in lifecycle state)时,才可以单独操作各个fragment,比如添加或删除。在fragment事件中,activity管理着一个fragment返回栈。
在activity的layout中,fragment存在于activity的一个ViewGroup内。并且fragment定义了自己的view布局。有两种方式添加fragment布局——一是在activity layout中使用<fragment>标签。或者在代码中添加到一个ViewGroup中。当然,fragment也可以以没有UI的方式存在。
Creating a Fragment
创建一个Fragment的方法,同创建activity一样,需要创建一个继承自Fragment类或其子类的一个类,并实现onCreate(),onStart()等必要的回调方法。
Fragment生命周期和其对应的生命周期回调方法以及它和activity生命周期的关系图如下:
同activity一样,fragment也有三种存活状态。
Resumed fragment在activity运行时处于可见位置
Paused 另一个activity处于前台获得焦点,但fragment所在的activity仍是可见的,未被完全覆盖。
Stopped fragment完全不可见。出现这种情况有两种可能,一是activity处于停止状态,二是fragment从activity中删除掉加入到返回栈中。一个停止态的fragment仍处于激活态(它的所有状态和成员信息由系统保留)。
同activity一样,当activity进程被系统杀死,重新创建fragment后,我们想恢复之前保存的状态,做法是在onSaveInstanceState()中保存相关的数据,而在onCreate(),onCreateView()或者onActivityCreated()中恢复保存的数据。
当activity停止时,它被自动保存在一个由系统管理的返回栈中,用户可以点击返回按钮回到这个activity。然而,fragment被保存在一个由activity管理的返回栈中,当去除fragment时,我们必须显式的调用addToBackStack()才能把它保存在返回栈中。
fragment的生命周期受到activity生命周期的直接影响。比如,当activity接收onPause()时,该activity中的每个fragment都会接收onPause()。需要指出的是fragment中新有的几个回调函数。
onAttach() fragment被绑定到activity时调用。
onCreateView() 创建fragment布局视图时调用。
onActivityCreated() 当activity的onCreate()方法返回时调用。
onDestroyView() fragment视图删除时调用。
onDetach() fragment从activity中解除绑定时调用。
Communicating with the Activity
尽管Fragment对象独立于activity对象,它可以被使用于多个activity中,一个给定的fragment实例还是直接被绑定到包含它的activity实例中的。
在fragment中通过getActivity()可以获取activity实例,然后与activity中的成员进行交互操作。
比如:
View listView = getActivity().findViewById(R.id.list);
同样的,activity可以通过FragmentManager获取fragment的引用,例如:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
Creating event callbacks to the activity
在一些实例中,可能需要fragment和activity共享events。一个好的方法是在fragment中定义回调接口,而在activity中实现它。当activity通过接口获得回调时,它就可以与其它fragment在必要的时候共享信息。
例如:一个activity中有两个fragment。一个显示文章列表(fragment A),一个显示具体的文章内容(fragment B)。A必须告知activity用户选取了哪一篇文章,然后B从activity中获知这一信息以显示对应的文章内容。在这一实例中,OnArticleSelectedListener接口在A中声明:
public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
} 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中我们需要实现这个OnArticleSelectedListener接口,并复写onArticleSelected()函数通知B响应响应的事件。为了保证activity实现了这一接口,A的onAttach()回调初始化了OnArticleSelectedListener接口把activity传递过来。
Adding items to the Action Bar
通过onCreateOptionsMenu(),fragment可以为activity的Options Menu提供菜单项。为了确保这一方法成功实现回调。必须在onCreate()期间调用setHasOptionsMenu()告知Options Menu fragment要添加菜单项。
通过fragment添加的菜单会添加在已有菜单之后。选中菜单项时,fragment也会接收onOptionsItemSelected()回调。
通过registerForContextMenu()注册,onCreateContextMenu()接收用户打开信息,onContextItemSelected()接收用户点击信息可以实现Context Menu。
用户点击菜单的信息首先传递给activity,如果activity不处理,则传递给fragment。
API拾遗录之Fragment的更多相关文章
- 新手学习FFmpeg - 调用API完成录屏
调用FFMPEG Device API完成Mac录屏功能. 调用FFMPEG提供的API来完成录屏功能,大致的思路是: 打开输入设备. 打开输出设备. 从输入设备读取视频流,然后经过解码->编码 ...
- 新手学习FFmpeg - 调用API完成录屏并进行H.264编码
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...
- Android面试收集录4 Fragment详解
1.什么是Fragment? 你可以简单的理解为,Fragment是显示在Activity中的Activity. 它可以显示在Activity中,然后它也可以显示出一些内容. 因为它拥有自己的生命周期 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
- 面试 -- fragment生命周期
Android 3.0 (Api 11)引入: Fragment具有重用,易适配(平板和手机之间的)优点: 依赖Activity,生命周期受到Activity的生命周期影响: fragment生命周期 ...
- Fragment的详细使用
一直在用Fragment,但是没有系统的整理过,Google了一下相关文章,看到了几篇,将几篇还不错的文章重点整理了下,很多是直接Copy的,只为做个笔记,以后翻来看比较方便,建议大家看一下下面几篇, ...
- Android Fragment(一)
一.为什么要引入Fragments? 自从Android 3.0中引入fragments 的概念,可以译为:碎片.片段.其上的是为了解决不同屏幕分辩率的动态和灵活UI设计.大屏幕如平板小屏幕如手机,平 ...
- Fragment 生命周期 事务 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 在Android中开源类库使用过程中兼容性等问题的讨论
1.在Android4.0环境下编译的actionbarsherlock.slidingmenu类库,能不能在4.0以下的版本中使用 相信很多人跟我一样,都以为在低版本(如Android2.1或2.3 ...
随机推荐
- jsonp与cors跨域的一些理解
浏览器的同源策略,即是浏览器之间要隔离不同域的内容,禁止互相操作. 比如,当你打开了多个网站,如果允许多个网站之间互相操作,那么其中一个木马网站就可以通过这种互相操作进行一系列的非法行为,获取你在各个 ...
- GreenDao数据库结构升级
1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- 火炬之光模型导出(Unity载入火炬之光的模型)
先说明几点.导出方案可行,測试通过. python和blender的版本号一定要用下文中所说的.新的Python或者是新的Blender版本号都无法完美导入. 导入导出脚本能够选择 (http://c ...
- (原创)优酷androidclient 下载中 bug 解决
在网络情况不好的情况下,优酷androidclient下载视频会终止,用户放弃下载点击 删除该任务以后,切换到网络好的情况下进行下载,会显示该视频已在下载队列里,然后clientUI界面却什么都看不到 ...
- Flex上传文件
前几天写了一篇jsp页面利用ajaxFileUpload上传文件.如今把flex上传页面也分享出来: 前台页面 <?xml version="1.0" encoding=&q ...
- Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)
下面是生成一个“围住神经猫”游戏的初始场景: 1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引 2,默认圆点为灰色,每行随机取两个点变为红色 3,奇数行和偶数行有一定的错位,错位 ...
- JS - 循环添加 DropDownList(Select)
代码: <td style="padding-left: 10px;"> <select id="ddl_picture_3"> < ...
- 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API
原文:[ASP.NET Web API教程]2.3 与实体框架一起使用Web API 2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web ...
- spring mvc ModelAndView向前台传值
今天在做项目的时候遇到一个问题,把第一个页面保存的id传到第三个页面中去用,原来是在controller层加了一个全局变量控制的,但是后来发现这个变量实现不了我要的功能,于是查了一下,原来ModelA ...