您的位置:首页 > 其它

关于Fragment

2016-03-05 10:40 232 查看
Fragment优点
  Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。

  Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

  Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。

  Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。

  Fragment 解决Activity间的切换不流畅,轻量切换。

  Fragment 替代TabActivity做导航,性能更好。

  Fragment 在4.2.版本中新增嵌套fragment使用方法,能够生成更好的界面效果。

  Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能。

  可以从startActivityForResult中接收到返回结果,但是View不能。

  

  Fragment的生命周期

  你可以把fragment看作是activity的模块化组件,它拥有自己的生命周期

  

  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级支持“返回”键(向后导航)。

  

  显示Fragment时(跟用户交互)要调用的核心的生命周期方法如下:

  1. 把Fragment对象跟Activity关联时,调用onAttach(Activity)方法;

  2. Fragment对象的初始创建时,调用onCreate(Bundle)方法;

  3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用于创建和返回跟Fragment关联的View对象;

  4. onActivityCreate(Bundle)方法会告诉Fragment对象,它所依附的Activity对象已经完成了Activity.onCreate()方法的执行;

  5. onStart()方法会让Fragment对象显示给用户(在包含该Fragment对象的Activity被启动后);

  6. onResume()会让Fragment对象跟用户交互(在包含该Fragment对象的Activity被启恢复后)。

  

  Fragment对象不再使用时,要反向回调的方法:

  1. 因为Fragment对象所依附的Activity对象被挂起,或者在Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再跟用户交互时,系统会调用Fragment对象的onPause()方法;

  2. 因为Fragment对象所依附的Activity对象被终止,或者再Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再显示给用户时,系统会调用Fragment对象的onStop()方法。

  3. onDestroyView()方法用于清除跟Fragment中的View对象关联的资源;

  4. Fragment对象的状态被最终清理完成之后,要调用onDestroy()方法;

  5. 在Fragment对象不再跟它依附的Activity关联的时候,onDetach()方法会立即被调用

代码展示:

1、使用支持库

如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。
如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。
使用支持库的步骤:
使用SDK下的SDK Manager工具下载Android Support Package



2. 在您的Android工程的顶级目录下创建一个libs目录
3. 找到您的SDK下的/extras/android/support/v4/android-support-v4.jar,并且拷贝到您的项目的libs下,选中这个jar包
→ 右键 → Build Path → Add to Build Path
4.在您的项目的
Manifest.xml
文件的
<manifest>
标签下添加:

<
uses-sdk
android:minSdkVersion
=
"4"

  android:targetSdkVersion="8"/>
  其中
targetSdkVersion
是您的软件最小支持的版本

5.如果您的项目支持3.0以下的版本,请导入如下的包:android.support.v4.*;
在使用Fragment的Activity请继承FragmentActivity而不是Activity。如果您的系统是3.0或以上版本,同样需要导入类似的包,但是可以使用普通的Activity。

2、创建一个Fragment

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



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

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



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



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

3、构建一个灵活的UI

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

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

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

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



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





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



4、与其他Fragment的交互

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

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

定义接口并调用方法:



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



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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: