一、Fragment的生命周期
1.Fragment生命周期执行的顺序
onAttach():
当Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArgument()获取参数。
onCreate():
当Fragment被创建时调用。
onCreateView():
当Fragment的布局被创建时调用。
onActivityCreated():
当Activity完成onCreate()时调用。
onStart():
当Fragment可见时调用。
onResume():
当Fragment可见且可交互时调用。
onPause():
当Fragment不可交互但可见时调用。
onStop():
当Fragment不可见时调用。
onDestroyView():
当Fragment从视图结构中移除时调用。
onDestroy():
当销毁Fragment时调用。
onDetach():
当Fragment和Activity解除关联时调用。
二、FragmentTransaction的主要方法
注意:我们操作的fragment会被增加到一个队列中,然后根据顺序显示该队列中已 经创建视图的fragmet(调用了onCreateView(……))。
入队的标准是:该fragment的onCreateView(……)被调用。
出队的标准是:该fragment的onDetach()被调用。
易错点:在执行show()之前需要先执行add()方法,将Fragment入队列,也就是执行关于Fragment的OnCreateView()
- add(id, fragment) —— 增加framgent到队列中,并显示该fragment到指定布局中。 生命周期调用:
当fragment与activity连接并被建立时(onAttach()、onCreate()被调用过)
onCreateView()、onActivityCreated()、onStart()、onResume()。
当fragment与activity未连接并未被建立时(onAttach()、onCreate()未被调用过)
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()。
注意:同一个Fragmen不能增加到队列两次或多次。 - show(fragment) —— 显示队列中的指定framgent。 生命周期的调用:
当队列中不存在该fragment时,回调onAttach()、onCreate()。
当队列中存在该fragment时并被调用过hide(fragment)时,回调onHiddenChange(boolean)。
其他情况没有回调函数。 - replace(id, fragment) ——先检查队列中是否已经存在,存在就会崩溃,不存在就会进入队列并把其他fragment清出队列,最后显示该fragment到指定布局中。
生命周期的调用:同add(id, fragment)。 - remove(fragment) —— 销毁队列中指定的fragment。 生命周期调用:
当队列中不存在该fragment时,不会有任何反应。
当队列中存在该fragment时,fragment的生命周期执行情况主要依赖是否当前fragment进入到返回栈。 - hide(fragment) —— 隐藏队列中指定的fragment,相当于调用视图的.setVisibility(View.GONE)
生命周期的调用: 当队列中存在该fragment时,回调onHiddenChange(boolen)
当队列中不存在该fragment时,回调onAttach()、onCreate()、onHiddenChange(boolen)。 - detach(fragment) ——销毁指定frament的视图,并且该fragment的onCreateVieew(……)不能再被调用(除非调用attach(fragment)重新连接)
生命周期的调用: 当队列中存在该fragment时,回调onDestroyView()
当队列中不存在该fragment时,回调onAttach()、onCreate()。 - attach(fragment) —— 创建指定fragment的视图。标识该fragment的onCreateView(……)能被调用。 生命周期的调用:
当队列中存在该fragment时且被调用detach(fragment)时,回调createView()、onActivityCreated()、onResume()。
当队列中不存在该fragment时,回调onAttach()、onCreate()。 其他情况没有用。 - addToBackStack(string) ——使本次事务增加的fragment进入当前activity的返回栈中。当前参数是对返回栈的描述,没什么实际用途。传入null即可。
- commit() —— 提交本次事务,可在非主线程中被调用。主要用于多线程处理情况。
- commitNow() —— 提交本次事务,只在主线程中被调用。 这时候addToBackStack(string)不可用。
三、案例:
// 初始化整个Fragment的布局情况,后续切换只需调用show()方法即可
private void setDefaultFragment() {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fl_room_list, roomListFragment);
transaction.add(R.id.fl_room_list, contactsFragment);
transaction.add(R.id.fl_room_list, settingFragment);
transaction.hide(contactsFragment);
transaction.hide(settingFragment);
transaction.commit();
}
// 切换Fragment的布局,只需调用show()即可
private void turnToSettingFragment() {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
if (roomListFragment != null) {
transaction.hide(roomListFragment);
}
if (contactsFragment != null) {
transaction.hide(contactsFragment);
}
transaction.show(settingFragment);
transaction.commit();
}