欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment的生命周期以及用法

程序员文章站 2022-05-14 08:10:15
...

一、Fragment的生命周期

1.Fragment生命周期执行的顺序

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();
    }