Android Fragment

作者: 洋芋掉到碗里去了 | 来源:发表于2018-02-14 11:46 被阅读15次

    Fragment表示 Activity中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段(有点像您可以在不同 Activity 中重复使用的“子 Activity”)。

    片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。 例如,当 Activity 暂停时,其中的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。 不过,当 Activity 正在运行(处于已恢复生命周期状态)时,您可以独立操纵每个片段,如添加或移除它们。 当您执行此类片段事务时,您也可以将其添加到由 Activity 管理的返回栈 — Activity 中的每个返回栈条目都是一条已发生片段事务的记录。 返回栈让用户可以通过按返回按钮撤消片段事务(后退)。

    当您将片段作为 Activity 布局的一部分添加时,它存在于 Activity 视图层次结构的某个 ViewGroup内部,并且片段会定义其自己的视图布局。您可以通过在 Activity 的布局文件中声明片段,将其作为 <fragment> 元素插入您的 Activity 布局中,或者通过将其添加到某个现有 ViewGroup,利用应用代码进行插入。不过,片段并非必须成为 Activity 布局的一部分;您还可以将没有自己 UI 的片段用作 Activity 的不可见工作线程。


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

    Android 在 Android 3.0(API 级别 11)中引入了片段,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。

    Fragment的运用为Android开发带来了质的飞跃,解决了碎片化的问题,在不同屏幕尺寸和分辨率上都能有合理的展示,极大地提高了用户的体验。

    2. Fragment生命周期

    fragment_lifecycle

    为更好的理解,结合Activity,如下图:


    转自慕课网
    1. 在Fragment中调用Activity中的方法getActivity();
    2. 在Activity中调用Fragment中的方法接口回掉
    3. 在Fragment中调用Fragment中的方法findFragmentById()

    3. Fragment加载到Activity中的方法:

    主要有两种方法:静态加载&动态加载

    1. 静态加载:添加Fragment到Activity的布局文件中;
    2. 动态加载:
    1. 添加一个FragmentTransaction实例;
    2. add()方法加上Fragment的对象;
    3. 调用commit()方法使得FragmentTransaction实例的改变生效。

    4.FragmentPagerAdapter与FragmentStatePagerAdapter的区别

    FragmentPagerAdapter:保存所有加入的fragment,虽然步长超过1的页面会调用destroyItem,但是在fragment的生命周期里,只有onDestroyView调用了,没有调用onDestory,也没有调用onDetach,所以fragment只是把上面的view销毁了,fragment并没有销毁,下次再创建的时候,只会调用onCreateView和onActivityCreated,所以FragmentPagerAdapter里所有fragment都没有销毁,这样占用内存大,同时避免了频繁的销毁和创建,适用于页面比较少的情况。

    FragmentStatePagerAdapter:对步长以内的fragment,跟FragmentPagerAdapter一样,不会调用任何销毁操作,再次显示也无需重新创建,对步长以外的fragment会调用destroyItem,跟FragmentPagerAdapter不一样,会真正销毁(同时销毁view和fragment,调用onDestroyView以及其后面的所有销毁方法),重建时会从最初的onAttach开始一直到onActivityCreated,适用于页面比较多的情况。

    • 当page数量少,用FragmentPagerAdapter;
    • 反之则用FragmentStatePagerAdapter;
    • 它们两的Fragment生命周期在ViewPage的切换过程中都会重复执行多次,所以它都不适用于App主页Tab。

    5. 一些方法

    主要的操作都是FragmentTransaction的方法:
    FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

    • transaction.add() :往Activity中添加一个Fragment;
    • transaction.remove() :从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁;
    • transaction.replace():使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体;
    • transaction.hide():隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
    • transaction.show():显示之前隐藏的Fragment
    • detach():会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
    • attach():重建view视图,附加到UI上并显示。
    • transatcion.commit():提交一个事务

    参考、感谢:

    1. 片段
    2. Android Fragment 真正的完全解析(上)
    3. Android -- Fragment 基本用法、生命周期与细节注意
    4. 论FragmentPagerAdapter与FragmentStatePagerAdapter的区别与使用场景

    相关文章

      网友评论

        本文标题:Android Fragment

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