• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > android fragment生命周期应用

android fragment生命周期应用

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android fragment,android fragment切换,android fragment实例,android fragment传值,android fragment使用等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

android fragment生命周期应用


问题描述
很多时候我们使用fragment都是在viewpager里面嵌套fragment,或者activity下面一个选择标签,在一个container里面添加要切换的几个fragment,这个时候各个fragment之间的切换,他们的生命周期怎样变化呢,下面我们一起来研究下。 解决方案
fragment嵌套在viewpager里面
这里写图片描述

这个demo是我在csdn上面down下来的,这里贴出原作者。(http://blog.csdn.net/u013758734/article/details/29848117)

我们在四个fragment里面各个生命周期方法都添加日志输出。

当第一次打开demo我们查看日志输出
这里写图片描述
我们发现OneFragment和TwoFragment的五个生命周期方法依次执行。理解:因为viewpager实际会把左右两页都缓存好,默认缓存2页。而此时TwoFragment实际已经准备好了,只是在屏幕的右侧未出现而已。 当我们由OneFragment滑倒TwoFragment
这里写图片描述
我们发现ThreeFragment走了5个生命周期方法,而OneFragment没有变化。理解:viewpager会把左右两页缓存好,所以OneFragment没有变化,只是加载了ThreeFragment。 当我们由TwoFragment滑倒ThreeFragment
这里写图片描述
我们发现OneFragment先被销毁,然后FourFragment被加载。理解:viewpager会把左右两页缓存好,当在第三页的时候,那么只缓存了第二页和第四页。

看了这三个应该可以知道又ThreeFragment滑倒FourFragment怎么变化的吧,TwoFragment会被销毁。

总结:viewpager默认会把左右两页缓存好,那么已经缓存好了的生命周期都是一样的,而且生命周期都会在同一个状态。

既然默认viewpager是缓存两页,那肯定有设置缓存页数的方法啊,就是:

mViewPager.setOffscreenPageLimit(3);

这里有4页,那么需要缓存3页。当设置了这个方法,我们再看看,进入demo:
这里写图片描述
我们会发现,FourFragment也直接缓存好了,这和理论是一致的,至于什么周期的顺序大家可以自己理解。然而无论这4页怎么滑,生命周期都没变化,那么这里又衍生了一个问题,当我进入第一页的时候,就把其他几页都加载了,这样一下就加载很多资源,怎么优化这个问题呢。这个我们下面再讨论。我们先看看这个viewpager被activity遮挡,退出时候变化。

当按了home键,画着被其他的activity(不包括dialog,activitydialog)遮挡
这里写图片描述
理解:这种情况下其生命周期随着activity一起变化,而且所有的fragment的生命周期一致。 重新进入demo
这里写图片描述 退出demo
这里写图片描述

上面讲了这么多,分析了viewpager嵌套fragment其生命周期变化,当我们设置了setOffscreenPageLimit(3)这之后,进入这个viewpager,所有的fragment都会全部进入onresume状态,相当于将所有的数据一下加载完毕,当我们有很多页或者很多数据时,对应用的负担很大,怎样处理这个问题呢。
fragment为我们提供了setUserVisibleHint(boolean isVisibleToUser)方法

我们在每个fragment里面添加这个方法,如

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        if (isVisibleToUser) {
            Log.i("TAG", "OneFragment--setUserVisibleHint");
        }
        super.setUserVisibleHint(isVisibleToUser);
    }

当我们进入demo时
这里写图片描述
发现第一个执行的就是setUserVisibleHint方法,理解:这个方法是当fragment出现在屏幕时,isVisibleToUser参数才会置true,所以我们是不是可以很好的利用这个方法呢,我们可以在这个方法里面写加载数据的方法。

依次进入其他几个fragment,其setUserVisibleHint方法会被依次执行
这里写图片描述

总结:遇到viewpager里面嵌套fragment时候,setUserVisibleHint和setOffscreenPageLimit方法可以配合着使用,这样最大化的优化这个模块。

以上讲的是viewpager里面嵌套fragment的时候,当在一个container里面添加要切换的几个fragment,这个时候各个fragment之间的切换,这个时候生命周期怎样变化呢,我们先贴一段在一个container里面设置几个fragment的写法的代码。

FragmentTransaction transaction = fragmentManager.beginTransaction();
        hideFragments(transaction);
        switch (index) {
        case 2:         
            if (myInfoFragment == null) {
                myInfoFragment = new MyInfoFragment();
                transaction.add(R.id.content, myInfoFragment);
            } else {
                transaction.show(myInfoFragment);
            }
            break;
        case 0:
            if (pharmacistFragment == null) {
                pharmacistFragment = new PharmacistFragment();
                transaction.add(R.id.content, pharmacistFragment);
            } else {
                transaction.show(pharmacistFragment);
            }
            break;
        case 1:
            if (findFragment == null) {
                findFragment = new FindFragment();
                transaction.add(R.id.content, findFragment);
            } else {
                transaction.show(findFragment);
            }
            break;
        default:

            break;
        }
        transaction.commit();

这样写法和viewpager嵌套fragment的生命周期差不多,唯一区别就是,当进入第一页的时候,默认不会一下就把其他两页缓存好(当然你也可以这样写),当进入其他两页,缓存好了后,其生命周期变化就完全一致了,所有的fragment的生命周期都在一个状态。当然,也要配置着setUserVisibleHint方法使用,优化这个模块。具体的demo演示,我就不做了,大家可以自己动手。

有什么疑问欢迎留言
付源码http://download.csdn.net/detail/xiangxi101/9490794

/**
* --------------
* 欢迎转载 | 转载请注明
* --------------
* 如果对你有帮助,请点击|顶|
* --------------
* 请保持谦逊 | 你会走的更远
* --------------
* @author css
* @github https://github.com/songsongbrother
* @blog http://blog.csdn.net/xiangxi101
*/

</div> </div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 5.1 Fragment基本概述
  • Fragment 重叠 遮盖问题,fragment遮盖
  • 理解android中ListFragment和Loader,androidlistfragment
  • Android中Fragment的两种创建方式,androidfragment
  • Android Fragment 剖析,androidfragment
  • android fragment生命周期应用
  • Android 上千实例源码分析以及开源分析
  • Android Fragment生命周期,androidfragment
  • Android触摸事件(三)-触摸事件类使用实例
  • android Fragment详细讲述,包括问题隐患

相关文章

  • 2017-05-26日志文件之出错处理
  • 2017-05-26clipChildren属性,clipchildren
  • 2017-05-26ListView的CheckBox实现全部选中/不选中,listviewcheckbox
  • 2017-05-26Android表单UI及相应控件的事件处理,android表单ui控件
  • 2017-05-26android环境下的即时通讯,android即时通讯
  • 2017-05-26Android开发学习之路--百度地图之初体验
  • 2017-05-26Android的消息机制,Android消息机制
  • 2017-05-26Android5.0开发范例大全 读书笔记(四),android5.0范例
  • 2017-05-26悬浮对话框的实现,悬浮对话框实现
  • 2017-05-26okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android之ContentProvider数据存储,contentprovider
    • Android5.0开发范例大全 读书笔记(六),android5.0范例
    • Install Battery Historian,batteryhistorian
    • 27个漂亮的移动端注册/登录界面设计作品,27登录界面设计作品
    • 利用GridView实现单选效果,gridview实现单选
    • 2.6.3 ViewPager的简单使用
    • Android ExpandableListView相关介绍
    • Android中Window添加View的底层原理
    • 自定义加载loading view动画组件的使用。,loadingview
    • Activity的生命周期,Activity生命周期

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有