关闭

Fragment的简要介绍

标签: androidui
56人阅读 评论(0) 收藏 举报
分类:

什么是Fragment

官方文档是这样解释:

Fragment表现Activity中用户界面的一个行为或者是一部分。你可以在一个单独的activity上把多个fragment组合成为一个多区域的UI,并且可以在多个activity中再使用。你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入事件,并且可以在activity运行时添加或者删除。

Fragment必须总是被嵌入到一个activity之中,并且fragment的生命周期直接受其宿主activity的生命周期的影响。例如,一旦activity被暂停,它里面所有的fragment也被暂停,一旦activity被销毁,它里面所有的fragment也被销毁。然而,当activity正在运行时(处于resumed的生命周期状态),你可以单独的操控每个fragment,比如添加或者删除。当你执行这样一项事务时,可以将它添加到后台的一个栈中,这个栈由activity管理着——activity里面的每个后台栈内容实体是fragment发生过的一条事务记录。这个后台栈允许用户通过按BACK键回退一项fragment事务(往后导航)。

当你添加一个fragment作为某个activity布局的一部分时,它就存在于这个activity视图体系内部的ViewGroup之中,并且定义了它自己的视图布局。你可以通过在activity布局文件中声明fragment,用元素把fragment插入到activity的布局中,或者是用应用程序源码将它添加到一个存在的ViewGroup中。然而,fragment并不是一个定要作为activity布局的一部分;fragment也可以为activity隐身工作。

设计原理

Android在3.0这个版本中(API Level “Honeycomb”)引入了fragment的概念,主要是支持在大屏幕上更为动态和灵活的UI设计,比方说平板电脑。由于平板电脑的屏幕要比手持电话的大许多,这样就有更多的空间去组合和交换UI组件。有了fragment,你可以不必去管理视图体系的复杂变化。通过将activity的布局分割成若干个fragment,可以在运行时编辑activity的呈现,并且那些变化会被保存在由activity管理的后台栈里面。

例如,新闻应用程序将一个fragment放在左边显示文章列表,在右边用另一个fragment来显示一篇文章——两个fragment在同一个activity中并排着,并且每个fragment都有其自己的生命周期回调方法序列用以处理各自的用户输入事件。因此,用户可以在同一个activity中选择和阅读文章,而不是在一个activity中选择,在另一个activity中阅读。

这里写图片描述

应该将每一个fragment设计为模块化的和可复用化的activity组件。也就是说,你可以在多个activity中引用同一个fragment,因为fragment定义了它自己的布局,并且使用它本身生命周期回调的行为。这点尤为重要,因为它让你能够改变fragment组合以满足不同的屏幕尺寸。在设计同时支持平板电脑和手机的应用时,通过不同的布局配置可以复用fragments,基于可使用的屏幕空间优化用户体验。例如,在手机上,当同一个activity不能容纳更多的fragment时,可能需要通过分离fragments提供一个单区域的界面。

Fragment的生命周期

这里写图片描述
从上图可以看出Fragment比Activity生命周期多了几个回调函数,接下来详细讲解一下每个函数的作用:

onAttach(Activity);
当Activity与Fragment发生关联时调用

onCreate()
系统创建fragment的时候回调,在里面实例化一些变量,这些个变量主要是:当你暂停、停止的时候,你想保持的数据,如果我们要为fragment启动一个后台线程,可以考虑将代码放于此处。
参数是:Bundle savedInstance, 用于保存Fragment参数, Fragement也可以重写 onSaveInstanceState(BundleoutState) 方法, 保存Fragement状态; 可以用于文件保护,只调用一次。

onCreateView()
创建该Fragment的视图,第一次使用的时候 fragment会在这上面画一个layout出来,为了可以画控件 要返回一个布局的view,也可以返回null,当系统用到fragment的时候 fragment就要返回他的view,越快越好,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据显示listview,当然线程还是可以的。给当前的fragment绘制ui布局,可以使用线程更新UI,说白了就是加载fragment的布局的。这里一般都先判断是否为null。

onStart()
和activity一致 启动, Fragement 启动时回调, 此时Fragement可见;

onResume()
和activity一致 在activity中运行是可见的。激活Fragement进入前台, 可获取焦点时激活;

onPause()
和activity一致 其他的activity获得焦点,这个仍然可见。第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁),通常用于用户的提交(可能用户离开后不会回来了)

onStop()
和activity一致,fragment不可见的,可能情况:activity被stopped了 OR fragment被移除但被加入到回退栈中。

onActivityCreate(bundle);  
当Activity的onCreate();方法返回时调用

onDestoryView();  
与onCreateView相对应,当改Fragment被移除时调用

onDetach();  
与onAttach()相对应,当Fragment与Activity的关联被取消时调用

因为我自己的电脑不支持创建虚拟机,需要各种复杂的安装,所以就没有自己尝试去完成测试打印,但是网上很多人都测试过,生命周期体现的非常详细。下面运行一下效果,activity和fragment同时运行时候的生命周期:

开始启动:
05-07 05:55:08.553: I/Log(1990): oncreate
05-07 05:55:08.553: I/Log(1990): onAttach_Fragment
05-07 05:55:08.553: I/Log(1990): onCreate_Fragment
05-07 05:55:08.553: I/Log(1990): onCreateView_Fragment
05-07 05:55:08.553: I/Log(1990): onActivityCreated_Fragment
05-07 05:55:08.553: I/Log(1990): onStart
05-07 05:55:08.553: I/Log(1990): onStart_Fragment
05-07 05:55:08.553: I/Log(1990): onResume
05-07 05:55:08.553: I/Log(1990): onResume_Fragment

按下home按键
05-07 05:55:28.725: I/Log(1990): onPause_Fragment
05-07 05:55:28.725: I/Log(1990): onPause
05-07 05:55:29.221: I/Log(1990): onStop_Fragment
05-07 05:55:29.221: I/Log(1990): onStop

再回到界面
05-07 05:55:49.441: I/Log(1990): onRestart
05-07 05:55:49.441: I/Log(1990): onStart
05-07 05:55:49.441: I/Log(1990): onStart_Fragment
05-07 05:55:49.441: I/Log(1990): onResume
05-07 05:55:49.441: I/Log(1990): onResume_Fragment

销毁activity
05-07 05:59:02.293: I/Log(1990): onPause_Fragment
05-07 05:59:02.293: I/Log(1990): onPause
05-07 05:59:02.757: I/Log(1990): onStop_Fragment
05-07 05:59:02.757: I/Log(1990): onStop
05-07 05:59:02.757: I/Log(1990): onDestroyView_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy_Fragment
05-07 05:59:02.757: I/Log(1990): onDetach_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:755次
    • 积分:66
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档