简述Android Fragment

目录:
[TOC]

Fragment的生命周期

  • onAttach()
    当Fragment与Activity发生关联时调用。

  • onCreate()
    当创建Fragment实例时,系统回调的方法。在该方法中,需要对一些必要的组件进行初始化,以保证这个组件的实例在Fragment处于pause或stop状态时仍然存在。

  • onCreateView()
    当第一次在Fragment上绘制UI时,系统回调的方法。该方法返回一个View对象,该对象表示Fragment的根视图;若Fragment不需要展示视图,则该方法可以返回null。

  • onActivityCreated()
    当Activity的onCreate()返回时调用。

  • onStart()

  • onResume()

  • onPause()
    当用户离开Fragment时回调的方法(并不意味着该Fragment被销毁)。在该方法中,可以对Fragment的数据信息做一些持久化的保存工作,因为用户可能不再返回这个Fragment。

  • onShop()

  • onDestoryView()
    与onCreateView想对应,当该Fragment的视图被移除时调用。

  • onDestory()
    当Fragment销毁时调用。

  • onDetach()
    与onAttach相对应,当Fragment与Activity关联被取消时调用。

注意:除了onCreateView(),其他的所有方法如果你重写了,必须调用父类对于该方法的实现。

将Fragment加入Activity的两种方式

  • 静态使用
    使用fragment标签,将Fragment当成普通的控件,直接写在Activity的布局文件中,用布局文件调用Fragment。

    1. 继承Fragment,重写onCreateView设置Fragemnt的布局文件;
    2. 在Activity的布局文件中,使用标签,属性android:name指定Fragment的全限定类名;
    3. 在Activity中声明此Fragment,就当和普通的View一样。
  • 动态使用

    1. 继承Fragment,重写onCreateView设置Fragemnt的布局文件;
    2. 在Activity的布局文件中,使用标签
    3. 在Activity中实例化此Fragment;
    4. 获取FragmentManager对象,并通过FragmentManager对象获取FragmentTransaction对象;
    5. 通过FragmentTransaction对象的方法将实例化Fragment,添加到在Activity的布局文件的标签容器中。

FragmentManager

主要用于在Activity中操作Fragment。

  • 获取方式

    • Android 3.0以上版本:getFragmentManager()
    • Android 3.0以下版本:getSupportFragmentManager()
    • 注意:
      使用Android3.0以下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager获得FragmentManager。
    • 建议:
      将Menifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了。**
  • fragmentManager.beginTransaction()

    • add()
      往Activity中添加一个Fragment。

    • remove()
      从Activity中移除一个Fragment,remove会销毁整个Fragment实例。

    • replace()
      使用另一个Fragment替换当前的,实际上就是先执行remove()然后执行add()。

    • hide()
      隐藏当前的Fragment,仅设为不可见,并不会销毁。

    • show()
      显示之前隐藏的Fragment。

    • detach()
      会将View从UI中移除,和remove()不同,此时Fragment的状态依然由FragmentManager维护。

    • attach()
      重建View视图,附加到UI上并显示。只是销毁其视图结构,实例并不会被销毁。

    • commit()
      一定要在Activity.onSaveInstance()之前调用。

    • 注意:
      当使用add(),show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),这点要切记。

Fragment回退栈

  • 入栈
    FragmentTransaction.addToBackStack(String)

  • 栈顶出栈
    getFragmentManager().popBackStack()

  • 获取栈内数目
    getFragmentManager().getBackStackEntryCount()

  • 场景1:
    Fragment_A add() 启动 Fragment_B add()
    Fragment_A replce() 启动 Fragment_B add()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键: 退出应用
      • Fragment_A: onPause()
        Fragment_B: onPause()
        Fragment_A: onStop()
        Fragment_B: onStop()
        Fragment_A: onDestoryView() onDestory() onDetach()
        Fragment_B: onDestoryView() onDestory() onDetach()
  • 场景2:
    Fragment_A add() 启动 Fragment_B replce()
    Fragment_A replce() 启动 Fragment_B replce()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView() onDestory() onDetach()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键: 退出应用
      • Fragment_B: onPause() onStop() onDestoryView() onDestory() onDetach()
  • 场景3:Fragment_A add() 启动 Fragment_B replce() addToBackStack()

    • Fragment_A: onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
    • Fragment_B: onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键: 回退到Fragment_A
      • Fragment_B: onPause() onStop() onDestoryView() onDestory() onDetach()
        Fragment_A: onCreateView() onActivityCreate() onStart() onResume()
  • 场景4:Fragment_A add() addToBackStack() 启动 Fragment_B add()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键:
      • 第一次:回退到Fragment_A
        • Fragment_A:
          onPause() onStop() onDestoryView() onDestory() onDetach()
      • 第二次:退出应用
        • Fragment_B:
          onPause() onStop() onDestoryView() onDestory() onDetach()
  • 场景5:Fragment_A add() addToBackStack() 启动 Fragment_B replce()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键:
      • 第一次:销毁Fragment_A
        • Fragment_A:
          onDestory() onDetach()
      • 第二次:退出应用
        • Fragment_B
          onPause() onStop() onDestoryView() onDestory() onDetach()
  • 场景6:Fragment_A add() addToBackStack() 启动 Fragment_B add() addToBackStack()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart()
    • Back键:
      • 第一次:销毁Fragment_B
        • Fragment_B:
          onPause() onStop() onDestoryView() onDestory() onDetach()
      • 第二次:销毁Fragment_A
        • Fragment_A:
          onPause() onStop() onDestoryView() onDestory() onDetach()
      • 第三次:退出应用
  • 场景7:Fragment_A replce() addToBackStack() 启动 Fragment_B replce()

    • Fragment_A:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume() onPause() onStop() onDestoryView()
    • Fragment_B:
      onAttch() onCreate() onCreateView() onActivityCreate() onStart() onResume()
    • Back键:
      • 第一次:销毁Fragment_A
        • Fragment_A:
          onDestory() onDetach()
      • 第二次:销毁Fragment_B并退出应用
        • Fragment_B:
          onPause() onStop() onDestoryView() onDestory() onDetach()

Fragment通信

  • Fragment获取Activity的数据

    • getActivity()
      在Fragment中可以通过getActivity()得到当前绑定的Activity的实例,然后进行操作。
      注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

    • newInstance()
      使用newInstance(参数)创建Fragment对象,优点是调用者只需要关系传递的哪些数据,而无需关心传递数据的Key是什么。

    • setArguments()
      创建Fragment对象,使用setArguments()方法存入数据,在onCreateView()中通过getArguments()取出数据。

  • Activity获取Fragment的数据

    • public方法
      如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法。

    • TAG或者ID
      如果Activity中未保存任何Fragment的引用,但每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

  • Fragment和Fragment

    • 同宿主
      setTargetFragment()

      • 使用场景:
        当前A_Fragment启动B_Fragment,B_Fragment在完成操作后返回数据的。
      • 执行流程:
        A_Fragment使用setTargetFragment()方式启动B_Fragment,完成操作,B_Fragment通过 getTargetFragment().onActivityResult(),调用A_Fragment的onActivityResult()获取返回值。
    • 不同宿主
      startActivityForResult()

      • 使用场景:
        存在于不同Activity中的Fragment,A_Fragment点击跳转到B_Fragment中,B_Fragment操作结束并且希望它将结果返回,在A_Fragment显示。
        在Fragment中存在startActivityForResult()以及onActivityResult(),没有setResult(),用于设置返回的intent,需要通过调用getActivity().setResult()。
        Fragment能够从Activity中接收返回结果,但是自身无法返回结果,只有Activity拥有返回结果。
      • 执行流程:
        首先,A_Fragment的startActivityForResult()跳转到B_Fragment;
        其次,B_Fragment中获取A_Fragment传递的参数,执行一些操作;
        然后,B_Fragment调用getActivity().setResult(),进行设置返回的数据;
        最后,在A_Fragment的onActivityResult()拿到返回结果进行回显。

FragmentActivity和Activity的区别

Fragment是Android 3.0以后推出的,为了在低版本中使用Fragment就需要用到android-support-v4.jar兼容包,而FragmentActivity就是这个兼容包里面的,它提供了操作Fragment的一些方法,其功能跟Android 3.0及以后的版本的Activity的功能一样。

Fragment设置唯一标识的方式

  1. 通过android:id属性为fragment指定唯一ID;
  2. 通过android:tag属性为fragment指定唯一字符串标识;
  3. 若上述两种凡是均未指定,则该fragment的标识为其父容器控件的ID。

FragmentPagerAdapter与FragmentStatePagerAdapter

  • FragmentPagerAdapter
    对于不再需要的Fragment,选择调用detach方法,仅销毁视图,并不会销毁Fragment实例。
  • FragmentStatePagerAdapter
    销毁不再需要的Fragment,当当前事务提交以后,会彻底的将Fragment从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState()中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的Fragment,可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。

你可能感兴趣的:(简述Android Fragment)