Fragment 是一个历史悠久的组件,从 API 11 引入至今,已经成为 Android 开发中最常用的组件之一,被戏称为Android的第五大组件,可见其地位之举足轻重。本文会从Fragment的由来,Fragment的生命周期,Fragment的基本使用,Fragment和Activity的数据交互四个方面来细说Fragment,并在文后罗列一些常见的面试题作为思考和回顾。
一、Fragment的由来
Fragment是在android 3.0中新增的,其中文可以理解为碎片,最初是为了满足平板的大屏而推出的。由于平板屏幕较大,所以可以放置的内容会比较多,传统的Activity并不能很好的处理大屏问题,所以急需一个碎片化的东西能够划区域的展示内容,且有属于自己的独立可操作空间,所以就出现了Fragment。
Fragment的优势在于:
1)模块化:我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
2)可重用:多个Activity可以重用一个Fragment。
3)可适配:根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,用户体验更好。
二、Fragment的生命周期
用一个流程图来展示一下fragment的生命周期流程,如下图:
fragment的生命周期简述一下Fragment的各个生命周期方法:
(1) onAttach:Fragment和Activity相关联时调用,可以通过该方法获取Activity引用。
(2) onCreate:Fragment被创建时调用。
(3) onCreateView:创建Fragment的布局。
(4) onActivityCreated:当关联的Activity完成onCreate方法后调用。
(5) onStart:当Fragment可见时调用。
(6) onResume:当Fragment可见且可交互时调用。
(7) onPause:当Fragment可见但不可交互时调用。
(8) onStop:当Fragment不可见且不可交互时调用。
(9) onDestroyView:当Fragment的视图结构从Fragment中移除时调用。
(10) onDestroy:销毁Fragment时调用。
(11) onDetach:移除与Activity时调用。
看着是不是有点眼熟?没错!fragment的生命周期和activity生命周期相似,其实fragment的生命周期和activity生命周期是有关联的,来一张官方图说明一下:
fragment和activity生命周期的关联性那么,理一下Fragment与Activity的关系:
(1) Fragment是依赖于Activity的,不能独立存在的。
(2)一个Activity里可以有多个Fragment。
(3)一个Fragment可以被多个Activity重用。
(4)Fragment有自己的生命周期,并能接收输入事件。
(5)能在Activity运行时动态地添加或删除Fragment。
三、Fragment的基本使用
1、fragment的加载方式
1)静态加载:会执行Fragment的onInflate方法
2)动态加载:
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.add(R.id.container,BlankFragment.newInstance("data1","data2"),"blankFragment")
transaction.addToBackStack("")
transaction.commit()
备注:采用静态加载的方式一旦添加就不能在运行时动态删除,灵活性和扩展性较差,所以大多数情况下我们采用动态加载的方式。
2、在使用Fragment时的注意事项:
1)所有的Fragment都是通过FragmentManager来进行管理的,获取FragmentManager的方式为直接在activity里面调用getSupportFragmentManager()。
2)在Fragment的使用过程中,对Fragment进行的add()、hide()、replace()、show()、remove()等操作都是通过FragmentTransaction来完成的。
3)transaction.add():往Activity里面添加一个片段。
4)transaction.remove():从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。
5)transaction.replace():使用另一个Fragment替换当前的,实际上是remove()然后add()的合体。
6)transaction.hide():隐藏当前Fragment,仅不可见,不会销毁。
7)transaction.show():显示之前隐藏的Fragment。
8)detach():会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
9)attach():重建view视图,附加到UI上并显示。
四、Fragment和Activity的数据交互
这里我们分成几种情况,Activity调用Fragment,Fragment调用Activity,Fragment调用Fragment
1、Activity调用Fragment
这个其实有很多种方式,通过Bundle进行初始传值,通过Fragment的实例调用Fragment的方法,甚至还可以通过Fragment的构造函数直接传值(这里不建议,因为Fragment重建时调用的是无参构造函数,传递的数据可能丢失)
2、Fragment调用Activity
这个调用方法就有很多种了,通过接口进行回调传值,通过强转获取Activity实例传值,通过广播EventBus进行传值。
3、Fragment与Fragment的数据交互
1)通过关联的Activity来实现数据交互。
2)使用EventBus来进行数据交互。
不知不觉中,我们已大概梳理了Fragment的基本情况,最后花一点点时间思考一下下面罗列的一些常见的面试题吧,作为回顾和温习。
五、常见面试题
1、简述Fragment懒加载的实现方式
2、Fragment的replace和add的区别?
3、简述Fragment和Activity的关系和区别
网友评论