美文网首页
细说Fragment

细说Fragment

作者: AiFocus | 来源:发表于2022-04-21 21:22 被阅读0次

    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的关系和区别

    相关文章

      网友评论

          本文标题:细说Fragment

          本文链接:https://www.haomeiwen.com/subject/jfgiertx.html