Fragment详解

1,303 阅读2分钟

1 Fragment为什么被称为第五大组件

1.1 Fragment为什么被称为第五大组件

Fragment使用频率不低于四大组件,有自己的生命周期,可动态灵活的加载到Activity中,实现与用户的交互,所以Fragment可以被称为第五大组件。 Fragment与Activity又有不同之处:Fragment并不是像Activity一样完全独立,它虽然有独立的生命周期,但它必须依附于Activity,并加载到Activity中。 Fragment比Activity更加节省内存,UI切换更加舒适。

1.2 Fragment加载到Activity中的两种方式

  • 静态加载 Activity布局中添加Fragment标签,Fragment类加载fragment布局。
  • 动态加载 使用FragmentManager管理添所有要启动的Fragment,使用FragmentTransaction添加和替换对应的Fragment,使用容器id作为标志位,设置Fragment要显示在Activity的位置, 调用add()方法,添加fragment对象。最后调用commit()方法使FragmentTransaction实例生效。

FragmentPagerAdapter与 FragmentStatePagerAdapter的区别

VIewPager

  • FragmentStatePagerAdapter切换页面的时候,释放内存,适合页面较多的情况,节省内存; destroyItem()->FragmentTransaction.remove(fragment)
  • FragmentPagerAdapter页面切换的时候,不释放内存,适合页面较少的情况,保持流畅度。 destroyItem()->FragmentTransaction.detach(fragment),使Fragment的UI和Activity的UI分离。

2 Fragment生命周期

onAttach()(Activity、Fragment关联)-> onCreate()(初次创建Fragment时调用,开始创建Fragment)-> onCreateView()(解析布局文件,首次绘制Fragment UI时调用)-> Activity.onCreate()(初始化Activity的UI、资源)-> onActivityCreated()(Activity绘制渲染完成后调用)-> Activity.onStart()(Activity可见)-> onStart()(Fragment可见)-> Activity.onReasum()(Activity可与用户交互)-> onResume()(Fragment创建完成,可与用户交互)-> onPause()(Fragment不可与用户交互)-> Activity.onPause()(Activity不可与用户交互)-> onStop()(Fragment不可见,进入后台)-> Activity.onStop()(Activity不可见,进入后台)-> onDestoryView()(Fragment中的视图被移除时调用)-> onDestory()->(销毁Fragment) onDetach()->(Fragment 和 Activity 取消关联时调用) Activity.onDestory()

7d6c4bb332de49da8f5a36fe5809182b.png

3 Fragment之间的通信

  • Fragment调用Activity方法 调用getActivity(),获取Activity,调用Activity方法。
  • Activity调用Fragment方法 接口回调,Fragment创建接口,Activity中实现。
  • Fragment中调用Fragment方法 getActivity()->findFragmentById()获取目标Fragment对象,调用其方法。

4 Fragment管理器FragmentManager

  • replace:Activity最上层Fragment替换成目标Fragment。
  • add:将一个Fragment实例添加到Activity最上层。
  • remove:将Fragment实例从Activity的Fragment队列中删除。