android fragment

来源:互联网 发布:入职程序员感觉干不了 编辑:程序博客网 时间:2024/04/27 20:13

Fragment要点

  1. Fragment作为Activity界面的一部分组成出现
  2. 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用。
  3. 在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace())
  4. Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接被其所属的宿主activity的生命周期影响。

设计哲学      

      Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许这样的一种设计,而不需要你亲自来管理viewhierarchy的复杂变化。 通过将activity的布局分散到fragment中,你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化.(http://developer.android.com/guide/topics/fundamentals/fragments.html)  

 

        例如,一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章--2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输入事件。因此,取代使用一个activity来选择一篇文章而另一个activity来阅读文章的方式,用户可以在同一个activity中选择一篇文章并且阅读,如图所示:


   fragment在你的应用中应当是一个模块化和可重用的组件.即,因为fragment定义了它自己的布局,以及通过使用它自己的生命周期回调方法定义了它自己的行为,你可以将fragment包含到多个activity中. 这点特别重要,因为这允许你将你的用户体验适配到不同的屏幕尺寸.举个例子,你可能会仅当在屏幕尺寸足够大时,在一个activity中包含多个fragment,并且,当不属于这种情况时,会启动另一个单独的,使用不同fragment的activity.

     继续之前那个新闻的例子-- 当运行在一个特别大的屏幕时(例如平板电脑),应用可以在ActivityA中嵌入2个fragment。然而,在一个正常尺寸的屏幕(例如手机)上,没有足够的空间同时供2个fragment用, 因此,Activity A会仅包含文章列表的fragment, 而当用户选择一篇文章时,它会启动ActivityB,它包含阅读文章的fragment.因此,应用可以同时支持上图中的2种设计模式。


创建Fragment

     要创建一个fragment, 必须创建一个 Fragment 的子类(或者继承自一个已存在的它的子类). Fragment类的代码看起来很像 Activity。它包含了和activity类似的回调方法, 例如onCreate()、 onStart()、onPause()以及onStop()。事实上,如果你准备将一个现成的Android应用转换到使用fragment,可能只需简单的将代码从你的activity的回调方法分别移动到你的fragment的回调方法即可。
   

     通常,应当至少实现如下的生命周期方法:

  • onCreate()
    当创建fragment时,系统调用该方法. 
    在实现代码中,应当初始化想要在fragment中保持的必要组件,当fragment被暂停或者停止后可以恢复.
  • onCreateView()
    fragment第一次绘制它的用户界面的时候,系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view.如果fragment不提供UI, 可以返回null.
  • onPause()
    用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁.)在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回).


其生命周期图如下:


         大多数应用应当为每一个fragment实现至少这3个方法,但是还有一些其他回调方法你也应当用来去处理fragment生命周期的各种阶段.全部的生命周期回调方法将会在后面章节Handlingthe Fragment Lifecycle 中讨论.

     除了继承基类Fragment , 还有一些子类你可能会继承:

 

  • DialogFragment
    显示一个浮动的对话框.  
    用这个类来创建一个对话框,是使用在Activity类的对话框工具方法之外的一个好的选择,
    因为你可以将一个fragment对话框合并到activity管理的fragment backstack中,允许用户返回到一个之前曾被摒弃的fragment.
  • ListFragment
    显示一个由一个adapter(例如SimpleCursorAdapter)管理的项目的列表, 类似于ListActivity.
    它提供一些方法来管理一个list view, 例如 onListItemClick()回调来处理点击事件.
  • PreferenceFragment
    显示一个 Preference对象的层次结构的列表,类似于PreferenceActivity. 
    这在为你的应用创建一个"设置"activity时有用处.

添加一个用户界面  

       fragment通常用来作为一个activity的用户界面的一部分,并将它的layout提供给activity.为了给一个fragment提供一个layout,你必须实现 onCreateView()回调方法,当到了fragment绘制它自己的layout的时候,Android系统调用它.你的此方法的实现代码必须返回一个你的fragment的layout的根view. 
      注意: 如果你的fragment是ListFragment的子类,它的默认实现是返回从onCreateView()返回一个ListView,所以一般情况下不必实现它. 
      从onCreateView()返回的View,也可以从一个layout的xml资源文件中读取并生成. 为了帮助你这么做, onCreateView()提供了一个LayoutInflater 对象.

     举个例子, 这里有一个Fragment的子类, 从文件 example_fragment.xml加载了一个layout:

[java] viewplaincopy
  1. public static class ExampleFragment extends Fragment  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.                              Bundle savedInstanceState)  
  5.         // Inflate the layout for this fragment  
  6.         return inflater.inflate(R.layout.example_fragment, container, false);  
  7.      
  8.  

       传入onCreateView()的container参数是你的fragmentlayout将被插入的父ViewGroup(来自activity的layout) savedInstanceState 参数是一个Bundle,如果fragment是被恢复的,它提供关于fragment的之前的实例的数据,

inflate() 方法有3个参数:

  • 想要加载的layout的resourceID.
  • 加载的layout的父ViewGroup.
    传入container是很重要的, 目的是为了让系统接受所要加载的layout的根view的layout参数,
    由它将挂靠的父view指定.
  • 布尔值指示在加载期间,展开的layout是否应当附着到ViewGroup (第二个参数).
    (在这个例子中, 指定了false, 因为系统已经把展开的layout插入到container–传入true会在最后的layout中创建一个多余的view group.)

将fragment添加到activity

       通常地, fragment为宿主activity提供UI的一部分,被作为activity的整个viewhierarchy的一部分被嵌入. 有2种方法你可以添加一个fragment到activitylayout:

在activity的layout文件中声明fragment
      在这种情况下,你可以像为View一样,为fragment指定layout属性.例子是一个有2个fragment的activity的layout:

 

[html] viewplaincopy
0 0
原创粉丝点击