android学习笔记之Fragments

来源:互联网 发布:部落冲突巨人升级数据 编辑:程序博客网 时间:2024/06/07 22:17

   Fragments 诞生初衷

     自从Android3.0中引入fragments的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack中保存些变化。

 

      Fragments设计理念

     在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:

 

Fragments的生命周期 

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

 

 其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:

onCreate

   系统创建Fragments时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity中的onCreate相当。 

onCreateView

  用于首次绘制用户界面的回调方法,必须返回要创建的Fragments视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。 

onPause 

    当用户离开这个Fragments的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。

Fragments 的类别

    系统内置了三种Fragments,这三种Fragments 分别有不同的应用场景分别为:

DialogFragment

 对话框式的Fragments,可以将一个fragments 对话框并到activity管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.

ListFragments

   类似于ListActivity的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。

PreferenceFragments

   类似于PreferenceActivity.可以创建类似IPAD的设置界面。 

 

2、创建一个Fragment

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。
创建一个Fragment
创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:

2012082809200966.png

Fragment的生命周期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。

更多的内容请参照类Fragment。
使用XML添加Fragment到Activity
尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。
说明:上面的所说的FragmentActivity适用在API在3.0以下的版本,3.0及以上的版本可以使用普通的Activity。
例子:

2012082809205379.png

上面使用fragment标签,android:name=””指定一个添加到xml中的Fragment。对于创建不同的屏幕尺寸布局的更多信息,请阅读支持不同的屏幕尺寸。

2012082809212926.png

当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。

3、构建一个灵活的UI

FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

在Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。

如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。例子:

2012082809233338.png

在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。
一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。例子:

2012082809243379.png

2012082809245182.png

由于不是定义在XML布局中的,所有可以转型删除和修改的操作。
如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。例子:

2012082809254119.png

4、与其他Fragment的交互

两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信。例子:

定义接口并调用方法:

2012082809265161.png

实现接口,在这个方法中可以进行与其他Fragment的数据的交互:

2012082809273598.png

可以通过FragmentManager的findFragmentById()来查找一个Fragment。
2012082809282554.png
2012082809284270.png

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: ∞_小低调的过日

原文地址: http://my.eoe.cn/wxjlovezsy/archive/1090.html

0 0
原创粉丝点击