谷歌在Android 3.0(API level 11)中引入fragment,主要是为了支持大屏幕(如平板电脑)上动态和灵活的UI设计。3.0系统之前的设备可以通过android.support.v4.app.Fragment来使用其功能特性。
Fragment表示Activity中的行为或用户界面部分。可以通过多个Fragment组合在一个Activity中,以及在多个Activity中重复使用某个Fragment。 我们可以将Fragment看作Activity的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且可以在Activity运行时添加或移除Fragment。
Though Fragment defines its own lifecycle, that lifecycle is dependent on its activity: if the activity is stopped, no fragments inside of it can be started; when the activity is destroyed, all fragments will be destroyed.
所有Fragment的子类都必须包含一个public的无参构造方法。framework在需要时会重新实例化fragment类,尤其是在恢复状态时(eg后台的Activity被系统回收,返回时系统重建Activity)。如果没有无参构造方法,状态恢复时会抛出运行时异常。
Fragment必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。必须使用FragmentManager来与Fragment进行交互。
要想为Fragment提供布局,您必须实现 onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
回调方法,Android 系统会在Fragment需要绘制其布局时调用该方法。您对此方法的实现返回的View必须是片段布局的根视图。
Fragment作为Activity布局的一部分添加时,一般有两种方法。一是在Activity的布局文件中使用<fragment>元素;二是通过代码将其插入到某个现有的ViewGroup。针对第二种方法,要想在您的 Activity 中执行片段事务(如添加、移除或替换片段),您必须使用 FragmentTransaction
中的 API。
FragmentManager被用来管理Activity中的Fragment,它可执行的操作包括:
- 通过findFragmentById()(对于在 Activity 布局中提供 UI 的片段)或findFragmentByTag()
(对于提供或不提供 UI 的片段)获取 Activity 中存在的片段。 - 通过popBackStack()(模拟用户发出的返回命令)将片段从返回栈中弹出。
- 通过addOnBackStackChangedListener()注册一个侦听返回栈变化的侦听器。
- 打开一个FragmentTransaction,通过它来执行某些事务,如添加和移除片段
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
建议为每个片段设置一个唯一的标识符,重启 Activity 时,系统可以使用该标识符来恢复片段(您也可以使用该标识符来捕获片段以执行某些事务,如将其移除)。
Fragment生命周期
Activity 生命周期与片段生命周期之间的最显著差异在于它们在其各自返回栈中的存储方式。 默认情况下,Activity 停止时会被放入由系统管理的 Activity 返回栈(以便用户通过返回按钮回退到 Activity,任务和返回栈对此做了阐述)。不过,仅当您在移除片段的事务执行期间通过调用 addToBackStack()
显式请求保存实例时,系统才会将片段放入由宿主 Activity 管理的返回栈
注意,Fragment的生命周期流受宿主Activity的影响,可参考下图看到 Activity 的每个连续状态如何决定片段可以收到的回调方法。
startActivityForResult
直接使用Fragment自身的startActivityForResult方法,而不是getActivity. startActivityForResult方法。这样Fragment的onActivityResult才能收到回调信息。
v4和app包的区别
Fragment有android.support.v4.app.fragment和android.app.fragment两种,二者有一定区别。一般建议使用android.support.v4.app.fragment包。
1.最低支持版本不同
android.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版
android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion="4" 即1.6版2.需要导jar包
fragment android.support.v4.app.Fragment 需要引入包android-support-v4.jar3.获取FragmentManager的方法不同
android.app.Fragment使用 getFragmentManager()获得,继承Activity
android.support.v4.app.Fragment使用getSupportFragmentManager() 获得4.继承的Activity不同
android.app.Fragment所在activity需继承Activity
android.support.v4.app.Fragment所在activity需继承FragmentActivity
参考文档:
Fragments Developer Guide