浅谈Android App开发中Fragment的创建与生命周期

 更新时间:2016年02月27日 09:35:46   作者:时之沙  
这篇文章主要介绍了Android App开发中Fragment的创建与生命周期,文中详细地介绍了Fragment的概念以及一些常用的生命周期控制方法,需要的朋友可以参考下

Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除。
Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影响。例如:当activity暂停时,它拥有的所有的Fragment们都暂停了,当activity销毁时,它拥有的所有Fragment们都被销毁。然而,当activity运行时(在onResume()之后,onPause()之前),你可以单独地操作每个Fragment,比如添加或删除它们。当你在执行上述针对Fragment的事务时,你可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。
当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在activity的界面中,它可以隐藏在后台为actvitiy工作。
接下来讲如何使用fragment,包括fragment在加入activity的后退棧中时如何保持自己的状态,如何与activity以及其它fragment们共享事件,如何显示在activity的动作栏,等等。


Android从3.0开始引入fragment,主要是为了支持更动态更灵活的界面设计,比如在平板上的应用。平板机上拥有比手机更大的屏幕空间来组合和交互界面组件们。Fragment使你在做那样的设计时,不需应付view树中复杂的变化。通过把activity的layout分成fragment,你可以在activity运行时改变它的样子,并且可以在activity的后退栈中保存这些改变。
例如:写一个读新闻的程序,可以用一个fragment显示标题列表,另一个fragment显示选中标题的内容,这两个fragment都在一个activity上,并排显示。那么这两个fragment都有自己的生命周期并响应自己感兴趣的事件。于是,不需再像手机上那样用一个activity显示标题列表,用另一个activity显示新闻内容;现在可以把两者放在一个activity上同时显示出来。

Fragment必须被写成可重用的模块。因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以你可以在多个activity中包含同一个Fragment的不同实例。这对于让你的界面在不同的屏幕尺寸下都能给用户完美的体验尤其重要。比如你可以在程序运行于大屏幕中时启动包含很多fragment的activity,而在运行于小屏幕时启动一个包含少量fragment的activity。
举个例子--还是刚才那个读新闻的程序-当你检测到程序运行于大屏幕时,启动activityA,你将标题列表和新闻内容这两个fragment都放在activityA中;当检测到程序运行于小屏幕时,还是启动activityA,但此时A中只有标题列表fragment,当选中一个标题时,activityA启动activityB,B中含有新闻内容fragment。

Fragments的生命周期 
    每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。 对应生命周期可参考下图:

201622793816751.jpg (327×857)

创建片元(Creating a Fragment)

要创建一个fragment,必须创建一个fragment的子类(或是继承自它的子类)。fragment类的代码看起来很像activity。它与activity一样都有回调函数,例如onCreate(),onStart(),onPause(),和onStop()。事实上,如果你正在将一个现成的Android应用转而使用Fragment来实现,可以简单的将代码从activity的回调函数移植到各自的fragment回调函数中。
一般情况下,你至少需要实现以下几个生命周期方法:

onCreate()
在创建fragment时系统会调用此方法。在实现代码中,你可以初始化想要在fragment中保持的那些必要组件(这里的组件是指除了view之外的东西,比如需要进行界面展示的关键数据),当fragment处于暂停或者停止状态之后可重新启用它们。

onCreateView()
在第一次为fragment绘制用户界面时系统会调用此方法。为fragment绘制用户界面,这个函数必须要返回所绘出的fragment的根View。如果fragment没有用户界面可以返回空。

onPause()
系统回调用该函数作为用户离开fragment的第一个预兆(尽管这并不总意味着fragment被销毁)。在当前用户会话结束之前,通常要在这里提交任何应该持久化的变化(因为用户可能不再返回)。

大部分应用程序都应该至少为每个fragment实现这三个方法,但是还有许多其他用以操纵fragment生命周期中各个阶段的回调函数。所有生命周期中的回调函数在操纵fragment生命周期一节中稍后再做讨论。

除了基类fragment,这里还有几个你可能会继承的子类:

DialogFragment
显示一个浮动的对话框。使用这个类创建对话框是使用Activity类对话框工具方法之外的另一个不错的选择,因为你可以把fragment对话框并入到由activity管理的fragments后台栈中,允许用户返回到一个已经摒弃的fragment。

ListFragment
显示一个由适配器管理的条目列表(例如SimpleCursorAdapter),类似于ListActivity。并且提供了许多管理列表视图的函数,例如处理点击事件的onListItemClick()回调函数。

PreferenceFragment
显示一个Preference对象的体系结构列表,类似于preferenceActivity。这在为应用程序创建“设置”activity时是很实用的。

相关文章

  • 让Android中RadioGroup不显示在输入法上面的办法

    让Android中RadioGroup不显示在输入法上面的办法

    在Android开发中,发现一个问题,打开输入法导致下面的radioGroup的位置发生了变化,被顶到了输入法的上面,那么该如何解决呢?下面来看看。
    2016-08-08
  • Android的分辨率和屏幕适配详解

    Android的分辨率和屏幕适配详解

    对于刚接触Android的新人和刚走上Android技术岗位的开发者们来说,在熟悉了相关之后,在项目完成后,就会面临着一个重大的挑战,那么就是屏幕适配的问题。当然我们所说的屏幕适配指的是适配各种手机不同的分辨率。
    2016-09-09
  • 一步步教你写Slack的Loading动画

    一步步教你写Slack的Loading动画

    这篇文章主要为大家详细手摸手教你写Slack的Loading动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • AndroidStudio实现能在图片上涂鸦程序

    AndroidStudio实现能在图片上涂鸦程序

    这篇文章主要为大家详细介绍了AndroidStudio实现能在图片上涂鸦程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android百度地图应用之图层展示

    Android百度地图应用之图层展示

    这篇文章主要为大家详细介绍了Android百度地图应用之图层展示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android事件分发的事件由来原理分析

    Android事件分发的事件由来原理分析

    这篇文章主要为大家介绍了Android事件分发的事件由来原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android自定义View实现数字雨效果的全过程

    Android自定义View实现数字雨效果的全过程

    小时候看时印象最深的就是数字雨了,导致我现在写代码也要是黑屏,下面这篇文章主要给大家介绍了关于Android自定义View实现数字雨效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Android中TabLayout结合ViewPager实现页面切换

    Android中TabLayout结合ViewPager实现页面切换

    这篇文章主要为大家详细介绍了Android中TabLayout结合ViewPager实现页面切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Flutter实现底部导航栏效果

    Flutter实现底部导航栏效果

    这篇文章主要为大家详细介绍了Flutter实现底部导航栏效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • android提取视频多张图片和视频信息实例

    android提取视频多张图片和视频信息实例

    本篇文章主要介绍了android提取视频多张图片和视频信息实例,具有一定的参考价值,有兴趣的可以了解一下
    2017-05-05

最新评论