ViewPager两种适配器显示Fragment时的生命周期探究
viewpager可以用来实现多个Fragment显示并可左右滑动的功能。ViewPager有两种不同的适配器来显示Fragment,下面将分别探讨这两种显示方式Fragment的生命周期变化有何不同。
布局为上下两个不同apater的ViewPager。
Fragment标识为1A,2B,3C,4D共4个对象,从1A滑动到4D记录并分析对应的生命周期变化。
左右各预先加载一个视图,默认值为1,由下述方法决定
public void setOffscreenPageLimit(int limit) {if (limit < DEFAULT_OFFSCREEN_PAGES) {Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "+ DEFAULT_OFFSCREEN_PAGES);limit = DEFAULT_OFFSCREEN_PAGES;}if (limit != mOffscreenPageLimit) {mOffscreenPageLimit = limit;populate();}}
1.FragmentPagerAdapter
左右滑动时各个Fragment的生命周期变化
//界面初始加载显示1A,预先加载2B界面(一个完整的Fragment生命周期)
09-10 20:47:50.270 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttachnull:null->onCreatenull:null->onAttach
09-10 20:47:50.276 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onCreate
09-10 20:47:50.277 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例1A->onCreateView
09-10 20:47:50.284 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例1A->onActivityCreated
09-10 20:47:50.285 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例1A->onStartFragmentPager:示例1A->onResume
09-10 20:47:50.286 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例2B->onCreateView
09-10 20:47:50.288 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例2B->onActivityCreated
09-10 20:47:50.293 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例2B->onStart
09-10 20:47:50.294 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例2B->onResume
//从1滑动到4
//滑动到2B界面时,预先加载完成3C的界面
09-10 20:49:05.709 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttach
09-10 20:49:05.710 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onCreate
09-10 20:49:05.714 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例3C->onCreateView
09-10 20:49:05.720 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例3C->onActivityCreatedFragmentPager:示例3C->onStartFragmentPager:示例3C->onResume//滑动到3C界面时,预先加载4D的Frgment
09-10 20:49:08.020 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttachnull:null->onCreate//因为viewpager默认加载是左右各一项,所以当滑动到3C时,1A界面会被销毁
09-10 20:49:08.021 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例1A->onPauseFragmentPager:示例1A->onStopFragmentPager:示例1A->onDestroyView//销毁完1A视图时开始预先显示4D的界面
09-10 20:49:08.022 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例4D->onCreateView
09-10 20:49:08.026 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例4D->onActivityCreatedFragmentPager:示例4D->onStart
09-10 20:49:08.027 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例4D->onResume//滑动到4D时,销毁2B的视图
09-10 20:49:09.626 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentPager:示例2B->onPauseFragmentPager:示例2B->onStopFragmentPager:示例2B->onDestroyView
2.FragmentStatePagerAdapter
//界面初始加载显示1A,预先加载2B界面(一个完整的Fragment生命周期)
09-10 20:47:50.297 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttachnull:null->onCreate
09-10 20:47:50.298 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttach
09-10 20:47:50.299 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onCreate
09-10 20:47:50.300 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onCreateView
09-10 20:47:50.305 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onActivityCreated
09-10 20:47:50.307 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onStartFragmentState:示例1A->onResume
09-10 20:47:50.308 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onCreateView
09-10 20:47:50.312 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onActivityCreated
09-10 20:47:50.314 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onStartFragmentState:示例2B->onResume//从1滑动到4
//滑动到2B界面时,预先加载完成3C的界面
09-10 20:50:37.133 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttach
09-10 20:50:37.134 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onCreateFragmentState:示例3C->onCreateView
09-10 20:50:37.138 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例3C->onActivityCreated
09-10 20:50:37.140 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例3C->onStartFragmentState:示例3C->onResume//滑动到3C界面时,先保存将要销毁的1A的状态,后再预先加载4D的Frgment
09-10 20:50:38.863 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onSaveInstanceState
09-10 20:50:38.867 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: null:null->onAttachnull:null->onCreate//开始执行1A的销毁过程
09-10 20:50:38.869 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onPauseFragmentState:示例1A->onStopFragmentState:示例1A->onDestroyView//FragmentState会将1A的对象给销毁掉,而FragmentPager只会销毁视图,所以以下方法FragmentPager将不会执行
09-10 20:50:38.870 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例1A->onDestroyFragmentState:示例1A->onDetach//销毁完1A视图时开始预先显示4D的界面
09-10 20:50:38.871 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例4D->onCreateView
09-10 20:50:38.876 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例4D->onActivityCreatedFragmentState:示例4D->onStart
09-10 20:50:38.877 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例4D->onResume//滑动到4D时,销毁2B的Fragment对象
09-10 20:50:40.150 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onSaveInstanceState
09-10 20:50:40.153 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onPauseFragmentState:示例2B->onStopFragmentState:示例2B->onDestroyView
09-10 20:50:40.156 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onDestroy
09-10 20:50:40.157 15317-15317/cn.pigdreams.blogdemo D/BLOG_DEMO: FragmentState:示例2B->onDetach
3.总结
- FragmentPagerAdapter只是销毁Fragment的视图,对象并未销毁,继续由Activity持有。而FragmentStatePagerAdapter则会销毁Fragment的对象,Activity不再持有该Fragment对象。
- FragmentPagerAdapter适用于显示较少Fragment的情况,
- FragmentStatePagerAdapter最大的特点是Fragment将会执行onSaveInstanceState保存状态,并且是在onPause()之前执行
4.源码分析
两者的主要区别在于
FragmentPagerAdapter
@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {if (mCurTransaction == null) {mCurTransaction = mFragmentManager.beginTransaction();}if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object+ " v=" + ((Fragment)object).getView());//Detach the given fragment from the UI,只是移除Fragment的视图mCurTransaction.detach((Fragment)object);}
FragmentStatePagerAdapter
@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {Fragment fragment = (Fragment) object;if (mCurTransaction == null) {mCurTransaction = mFragmentManager.beginTransaction();}if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object+ " v=" + ((Fragment)object).getView());while (mSavedState.size() <= position) {mSavedState.add(null);}mSavedState.set(position, fragment.isAdded()? mFragmentManager.saveFragmentInstanceState(fragment) : null);mFragments.set(position, null);//直接移除Fragment对象mCurTransaction.remove(fragment);}
ViewPager两种适配器显示Fragment时的生命周期探究相关推荐
- 剖析Fragment的Pause生命周期全过程
前言 之前遇到一个问题,与Fragment的Pause生命周期有关,所以就研究了一下Fragment的Pause生命周期特点.就有关这篇笔记. 我们知道Fragment的生命周期是依赖Activity ...
- java调试生命周期,一种基于JAVA的智能合约生命周期的管理方法与流程
本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约生命周期的管理方法. 背景技术: 区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交 ...
- 安卓活动(Activity)和碎片(Fragment)的生命周期
引言 对于安卓中生命周期的过程以及相应的事件的了解是非常重要的. 活动(Activity)的生命周期 Activity 类中定义了七个事件回调方法,与Activity生命周期的每一个环节对应. 1. ...
- android fragment 覆盖,Android Fragment 替换覆盖生命周期方法详解
FragMent add 与 replace 方法执行试图切换生命周期变化 Activity 生命周期中共有七个方法,Fragment 的生命周期方法 则有11个,一个Fragment 在Activi ...
- dialog 弹框时activity生命周期调用过程
dialog 弹框时activity生命周期调用过程 这个问题,分两部分 在普通activity弹框dialog,activity的onPause方法会被调用吗? activity a中给dialog ...
- Activity在旋转屏幕时的生命周期
一.Activity的生命周期 1.Activity生命周期中的重要方法 (1).onCreate():表示Activity已经被创建.这是Activity生命周期中的第一个方法,Activity生命 ...
- Activity为singleTask模式时的生命周期
Activity为singleTask模式时的生命周期 Activity A:android:launchMode="singleTask" Activity B:launchMo ...
- ViewPager两种方式实现无限轮播
给自己的忠告:虽然轮子很好用,但是使用轮子的前提是:如果不去封装一些复杂的功能,自己会用最基本的方法写一个,不然再好的轮子那也是别人的,当自己项目遇到和轮子不一样的地方,那就只能束手无策或者改人家的源 ...
- Fragment系列总结(一)Fragment概念与生命周期
写在前面 Fragment是Google在Android3.0新加的东西,它的功能和作用如同名字一样,代表着一块块碎片,而这些碎片则可以灵活地嵌入到各Activity之中. 其他关于Fragment的 ...
最新文章
- CTabCtrl - 如何使用TabCtrl控件
- 请问投稿中要求上传的author_SCI 这些投稿状态都是什么意思?审稿人这些“暗语”如何应对?下...
- Unity3D重要知识点
- Photoshop工作笔记001---Photoshop常用快捷键总结
- 资源配置文件的目录结构以及相应的读取方式
- 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧
- Java 开发人员必备的开发工具,这些没用进BAT想都别想
- STL源码剖析之迭代器
- 华为交换机配置时区_把华为交换机设置成时钟源服务器(NTP)
- 《王道》数据结构笔记整理2022
- S变换介绍(附代码)
- 网站一直不被收录怎么办,让网站收录更好的五个方法
- Java游戏神秘岛,【寻找高玩】服务端整合问题
- python爬虫学习之路1
- 例题5-3 安迪的第一个字典(Andy's First Dictionary,Uva 10815)
- 高速ADC的关键指标:量化误差、offset/gain error、DNL、INL、ENOB、分辨率、RMS、SFDR、THD、SINAD、dBFS、TWO-TONE IMD
- Robcup2D足球学习记录【2020.01.30】
- 网络伤感生活日志发布:来不及凋谢的花落
- 看见她力量丨中国铁建地产铁姐,内外多面,绽放光彩!
- 校园网组建 (基于Packet tracer)