本博客部分内容是来自http://blog.csdn.net/dreamzml/article/details/9951577

FragmentPagerAdapter

FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。FragmentPagerAdapter 重载实现了几个必须的函数,因此来自 PagerAdapter 的函数,我们只需要实现 getCount(),即可。且,由于 FragmentPagerAdapter.instantiateItem() 的实现中,调用了一个新增的虚函数 getItem(),因此,我们还至少需要实现一个 getItem()。因此,总体上来说,相对于继承自 PagerAdapter,更方便一些。

getItem()
        该类中新增的一个虚函数。函数的目的为生成新的 Fragment 对象。重载该函数时需要注意这一点。在需要时,该函数将被 instantiateItem() 所调用。
        如果需要向 Fragment 对象传递相对静态的数据时,我们一般通过 Fragment.setArguments() 来进行,这部分代码应当放到 getItem()。它们只会在新生成 Fragment 对象时执行一遍。
        如果需要在生成 Fragment 对象后,将数据集里面一些动态的数据传递给该 Fragment,那么,这部分代码不适合放到 getItem() 中。因为当数据集发生变化时,往往对应的 Fragment 已经生成,如果传递数据部分代码放到了 getItem() 中,这部分代码将不会被调用。这也是为什么很多人发现调用 PagerAdapter.notifyDataSetChanged() 后,getItem() 没有被调用的一个原因。
    instantiateItem()
        函数中判断一下要生成的 Fragment 是否已经生成过了,如果生成过了,就使用旧的,旧的将被 Fragment.attach();如果没有,就调用 getItem() 生成一个新的,新的对象将被 FragmentTransation.add()。
        FragmentPagerAdapter 会将所有生成的 Fragment 对象通过 FragmentManager 保存起来备用,以后需要该 Fragment 时,都会从 FragmentManager 读取,而不会再次调用 getItem() 方法。
        如果需要在生成 Fragment 对象后,将数据集中的一些数据传递给该 Fragment,这部分代码应该放到这个函数的重载里。在我们继承的子类中,重载该函数,并调用 FragmentPagerAdapter.instantiateItem() 取得该函数返回 Fragment 对象,然后,我们该 Fragment 对象中对应的方法,将数据传递过去,然后返回该对象。
        否则,如果将这部分传递数据的代码放到 getItem()中,在 PagerAdapter.notifyDataSetChanged() 后,这部分数据设置代码将不会被调用。
    destroyItem()
        该函数被调用后,会对 Fragment 进行 FragmentTransaction.detach()。这里不是 remove(),只是 detach(),因此 Fragment 还在 FragmentManager 管理中,Fragment 所占用的资源不会被释放。

FragmentPagerAdapter默认是先预加载一页的,比如显示了第1页,就会把第2页也加载了,先调用FragmentPagerAdapter的构造方法 MyPagerAdapter(FragmentManager fm),再调用instantiateItem(ViewGroup container, int position) 函数中判断一下要生成的 Fragment 是否已经生成过了,如果生成过了,就使用旧的,旧的将被 Fragment.attach();如果没有,就调用 getItem() 生成一个新的,然后再调用ChatFragment与foundFragment的生命周期

转载自:https://blog.csdn.net/fangkailong/article/details/38268509

FragmentManager的一些api:
不同的FragmentManager:

见其名,知其意,是关于Fragment的管理器,在开发中,使用比较多;
其中关于Manager,用的比较多的API:
- getSupportFragmentManager():在Activity中使用Fragment的管理器,对所有Fragment进行管理。
- getFragmentManager():与 getSupportFragmentManager()功能是一样的,只是是在Fragment中使用
- getChildFragmentManager():在Fragment嵌套使用中经常使用到,但这里需要注意一个点,看下图:

解析图
在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏,在嵌套的Fragment中,内部的fragment创建,需要使用getChildFragmentManager()
FragmentManager常用的api:

getFragments():可以获取所有创建时候add进去的所有Fragment;通常可以通过这个api来获取需要指定操作的fragment对象

manager.findFragmentByTag(String tag): 通过TAG获取指定的Fragment;这个TAG,是在创建Fragment时,调用addToBackStack(String tag)进行绑定关系的

popBackStack(): 弹出栈顶fragment

popBackStack(String tag,int flags):
        tag可以为null或者相对应的tag,flags只有0和1(POP_BACK_STACK_INCLUSIVE)两种情况
        如果tag为null,flags为0时,弹出回退栈中最上层的那个fragment。
        如果tag为null ,flags为1时,弹出回退栈中所有fragment。
        如果tag不为null,那就会找到这个tag所对应的fragment,flags为0时,弹出该
        fragment以上的Fragment,如果是1,弹出该fragment(包括该fragment)以
        上的fragment。

popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行弹出。

FragmentTransaction:

管理着Fragment所有的展示交互,还有Fragment的回滚事件
FragmentTransaction常用的api:

add():将一个Fragment实例对象添加到集合列表的尾部,当展示的时候会在activity的最上层
    remove():将一个Fragment实例对象从存储的集合列表中移除,并且将其从UI界面中销毁
    replace():将上一个Fragmnt的实例对象从存储的集合列表中移除,将当前的Fragment实例对象添加到存储的链表尾部,当展示的时候会在activity的最上层
    hide():将一个fragment,从展示状态隐藏起来,实例对象不被销毁
    show():将一个fragment实例对象,展示出来

addToBackStack():将fragment添加到回退栈中

add() 和 replace() 运用总结:

在项目的使用中,通常习惯使用add()加载,add方式视图不会重建,会被保存起来,而replace()每次都会remove掉前面的视图,而replace方式的回退,旧的视图每一次都会重建,在用户体验上不好。

add()和replace()的使用,不能够混合使用,在混合使用的情况下,会导致回退栈混乱,导致的原因是在回退过程中记录的角标存在问题

hide() 和 show() 运用总结:

通常的使用情况是在主界面上,有多Tab键切换情况

FragmentTransaction事儿需要用到的api:

detach():将视图View和Fragment分离,视图View也会从ViewTree中删除,还会将Fragment从add的队列中删除,所以在调用isAdd方法的时候返回的是false,但实例对象本身是还存在的,通过FragmentManager的findFragmentByTag还可以获取到实例对象。
    attach():通过fragment的onCreateView()的重建视图,并且被重新加入到add的队列中,并且处于队列头部。

转载自:https://blog.csdn.net/qq_20280683/article/details/79641182

小结Fragment与FragmentPagerAdapter的生命周期及其关系的更多相关文章

  1. 一句话、一张图记住Activity和Fragment之间错综复杂的生命周期关系

    如果我们在Fragment和它的宿主Activity的生命周期中都加上Log日志,你能顺利写出他们的执行顺序吗?我们先来看一张Google官方的图片: 咋一听,Activity生命周期有七个方法,Fr ...

  2. [React] 多组件生命周期转换关系

    前段时间一直在基于React做开发,最近得空做一些总结,防止以后踩坑. 言归正传,React生命周期是React组件运行的基础,本文主要是归纳多组件平行.嵌套时,生命周期转换关系. 生命周期 Reac ...

  3. activity和fragment之前运行的生命周期

    1.activity生命周期 2.fragment的生命周期 3.对比图 4.测试代码 package com.goso.testapp; import android.app.Activity; i ...

  4. Fragment生命周期和Activity生命周期的关系

    Fragment生命周期: 重点回调函数: 1. onAttach()当碎片和活动建立关联的时候调用.2. onCreateView()为碎片创建视图(加载布局)时调用.3. onActivityCr ...

  5. Android 两个activity生命周期的关系

    Acitivity的生命周期想必大家都清楚,但是两个activity之间其实不是独立各自进行的. 从第一个activity1启动另外一个activity2时,会先调用本activity1的onPaus ...

  6. Fragment与Activity的生命周期对比

    因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.

  7. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期

    Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...

  8. Fragment生命周期函数调用(ViewPager切换方式)

    在使用ViewPager时,Google亲爹为我们提供了多种PagerAdapter.其中,与Fragment相关的是FragmentPagerAdapter和FragmentStatePagerAd ...

  9. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

随机推荐

  1. PHP mysqli_change_user() 函数

    改变指定数据库连接的用户: <?php $con=mysqli_connect("localhost","my_user","my_passwo ...

  2. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  3. [Luogu] 四子连棋

    https://www.luogu.org/problemnew/show/P2346 广搜 #include<iostream> #include<cstring> #inc ...

  4. 【poj2709】Painter--贪心

    Painter Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5621   Accepted: 3228 Descripti ...

  5. 【概率论】4-1:随机变量的期望(The Expectation of a Random Variable Part I)

    title: [概率论]4-1:随机变量的期望(The Expectation of a Random Variable Part I) categories: - Mathematic - Prob ...

  6. 关于scala

    对函数式编程感兴趣了 雪下scala吧

  7. 在windows10 Linux (centos7)中安装go golang (够浪) 并测试运行

    官方下载安装页面 https://golang.org/doc/install git主页 https://github.com/golang/go 相关下载地址 https://golang.org ...

  8. mysql 运行中 偶尔 报错 2002 也许是这个问题,内存不足导致的

    配置都是正常,最终发现内存使用率高达90%多,加配置后解决问题(升级服务器配置) 加之前是2核4g ,升级配置后 4核8g

  9. 【原创】FltGetFileNameInformation蓝屏分析

    FAULTING_IP: nt!SeCreateAccessStateEx+5b80564184 848788000000 test byte ptr [edi+88h],al TRAP_FRAME: ...

  10. PG数据库创建并执行存储过程批量插入数据

    记录一下PG数据库创建并执行存储过程批量插入数据的SQL: create or replace function addId() returns boolean AS $BODY$ declare i ...