Fragment是Android3.0引入的新API,Fragment代表Activity子模块,可以理解为Activity的片段,Fragment本身即为片段的意思。
Fragment的生命周期受它所在的Activity的生命周期的控制。
Android3.0引入Fragment的初衷是为了适应大屏幕的平板电脑,开发者用Fragment对UI组件进行分组、模块化管理,可以方便的在运行过程中动态更新Activity的用户界面。
Fragment的生命周期:
下图展示了Fragment的生命周期和其与Activity的关系
其中:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreate(BundlesavedStatus)
创建Fragment时回调。
onCreateView(LayoutInflater,ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onStart()
启动Fragment时回调
onResume()
恢复Fragment时调用,onStart()方法后一定会回调onResume()方法
onPause()
暂停Fragment时回调
onStop()
停止Fragment时回调
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDestroy()
销毁Fragment时回调
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用,在onDestroy()方法后一定会调用onDetach()方法
创建Fragment:
1. 继承Fragment,重写onCreateView决定Fragemnt的布局
2. 将Fragment添加到Activity。
将Fragment添加到Activity有两种方法:
1. 在布局文件中使用<fragment…/>元素添加Fragment,<fragment…/>元素的android:name属性指定Fragment的实现类。
2. 在Java代码中通过FragmentTransaction对象的add()方法来添加Fragment。
Activity的getFragmentManager()方法可以返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。
Fragment与Activity的相互获取:
1. Fragment获取它所在的Activity:调用Fragment的getActivity()方法。
2. Activity获取它包含的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(Stringtag)方法。
Fragment与Activity之间传递数据:
1. Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法。
2. Fragment向Activity传递数据或Activity需要在Fragment运行中进行实时通信:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity。
Fragment的管理:
FragmentManager的功能:
1. findFragmentById(int id)或findFragmentByTag(String tag)方法获取指定Fragment。
2. popBackStack()将Fragment从后台栈中弹出(模拟用户按下Back按键)。
3. addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化。
4. 获取FragmentTransaction对象
FragmentTransaction的方法:
transaction.add()
往Activity中添加一个Fragment
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transatcion.commit()
提交一个事务,commit方法一定要在Activity.onSaveInstance()之前调用。