Fragment的生命周期以及用法

mac2024-04-19  5

一、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(); }
最新回复(0)