Fragment(碎片)是一种可以嵌入Activity中的UI片段,与Activity非常相似,不仅包含布局,同时也具有自己的生命周期。Fragment是专门针对大屏幕移动设备而推出的,它能让程序更加合理地利用屏幕空间,因此在平板电脑上应用广泛。
一、Fragment的生命周期
Fragment不能独立存在,必须嵌入到Activity中使用,因此Fragment的生命周期直接受所在的Activity影响。当Activity暂停时,它拥有的所有Fragment都暂停;当Activity销毁时,它拥有的所有Fragment都销毁。然而,当Activity运行时(在onResume()之后,onPause()之前),却可以单独地操作每个Fragment,如添加或删除Fragment等。
(1)onAttach()方法:当Fragment和Activity建立关联的时候调用。
(2)onCreateView()方法:为Fragment创建视图(加载布局)时调用。
(3)onActivityCreated()方法:当Activity的onCreate()方法返回时调用。
(4)onDestroyView()方法:当该Fragmnet 的视图被移除时调用。
(5)onDetach()方法:当Fragment和Activity解除关联时调用。
二、Fragment的派生类
(1)DialogFragment
显示一个浮动的对话框。使用这个类创建对话框是替代activity创建对话框的最佳选择。因为可以把fragmentdialog放入到activity的返回栈中,使用户能再返回到这个对话框。
(2)ListFragment
显示一个列表控件,就像ListActivity类,它提供了很多管理列表的方法,比如onListItemClick()方法响应click事件。 注意:如果fragment是从ListFragment中派生的,就不需要实现onCreateView()方法了,因为默认的实现已经返回了ListView控件对象。
(3)PreferenceFragment
显示一个由Preference对象组成的列表,与PreferenceActivity相同。它用于为程序创建“设置”activity。
三、Fragment的管理
要管理fragment,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager()。可以用FragmentManager来做以下事情:
(1)使用方法findFragmentById()或findFragmentByTag(),获取activity中已存在的fragment;
(2)使用方法popBackStack()从activity的后退栈中弹出fragment(这可以模拟后退键引发的动作),用方法addOnBackStackChangedListenner()注册一个侦听器以监视后退栈的变化;
(3)还可以使用FragmentManager打开一个FragmentTransaction来执行fragment的事务,比如添加、替换或删除fragment。
我们用FragmentTransaction来提交事务,每一组Fragment的变化称为事务。add()和replace()都是FragmentTransaction的方法。除这两个方法,其中还有remove(),hide()和show()方法。
add(int containerViewId, Fragment fragment, String tag);
remove(Fragment fragment);
replace(int containerViewId, Fragment fragment);
hide(Fragment fragment);
show(Fragment fragment);
Fragment和Activity通讯,Fragment可以调用getActivity()方法(getContext()亦可)很容易的得到它所在的activity的对象;FragmentManager可以调用getFragments()获取所有被add进Activity中的Fragment 。
FragmentManager与FragmentTransaction的获取:
FragmentManager frgmentManager = getFragmentManager();
FragmentTransaction transaction = frgmentManager.benginTransatcion();
四、add()和replace()区别
add()和replace()都是FragmentTransaction的方法,用于对Fragment的操作。下面是两者的的区别及应用:
(1)add()方法用于添加新的Fragment;而replace()方法用于替换Fragment。
(2)replace()方法替换Fragment,其会先将存在的Fragment删除再添加新的Fragment;而add()方法是直接添加Fragment。
(3)replace()方法内存波动比较大,网络请求消耗大;add()方法反之。
(4)add()方法常与hide()和show()方法配合使用,add()方法添加Fragment管理后,需要显示时用show()方法显示操作,而不需要时使用hide()方法进行隐藏操作。(注意:使用add()方法常会遇到Ativity被系统回收后重启app导致Fragment重叠现象,之后的动态实现Fragmen会详细说明解决。)
Fragment的静态实现、动态实现和解决重叠问题请看接下来的文章。。。。。。