现在主流的APP都会使用到Fragment,相信你也一定使用过,今天为大家介绍一下我曾经踏过的一个关于Fragment的坑。

以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragment的时候,会出现奇怪的现象。嵌套的地图会出现滑动不动的情况,起先还以为是高德的bug呢,经过一番研究,终确定这是一个坑。

先对Fragment做一个简单的介绍,借用csdn上朋友写的一段内容。

Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电 脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许这样的一种设计,而不需要你亲自来 管理 viewhierarchy的复杂变化。 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化。

使用过Fragment的同学都知道,它的使用相当的简单,基本上和Activity中一样,就是生命周期函数稍稍多了点。今天不是介绍Fragment如何使用,而是介绍一个Fragment中的一个坑。现在相当多的APP都有以下三种设计风格。

一、底部TAB,一般3-5个,点击某个TAB,上面页面也随之切换,如QQ、腾讯微博、新浪微博。早期的时候Android开发者们都会使用 TabActivity去实现,但是TabActivity存在一些问题,也不符合Andoid的单窗口设计的原则,所以已经被废弃,不推荐大家继续使 用。如有业务需求,请优先考虑使用Fragement。

二、顶部TAB,一般也是3-5个左右,相对于底部TAB风格,顶部TAB一般会引入ViewPager + Fragment的实现方式,这样可以做到左右切换,如微信。

三、侧边TAB,也就是SlidingMenu + Fragment或者MenuDrawer + Fragment。这种风格自去年起,风靡的一发不可收拾,前段时间干货分享讲的一期就是这个,代码也开源在了Github上,有兴趣的朋友可以下载了解 下。出门右转,查看历史消息《一个比较酷的项目界面分享,干货十足》。

上述三种风格中使用到的Fragment,一般很容易会被大家忽略了一个问题。那就是当和Fragment关联的view hierarchy正在被移除时,不会执行onDestroy()方法,而是会调用onDestroyView()。比如上述的风格二ViewPager + Fragment,默认情况下当ViewPager滑动到第三页的时候,第一页的Fragment就会执行onDestroyView,当再次滑动到第二 页的时候,第一页的Fragment的onCreateView又会重新执行绘制页面。伴随而来的问题就是成员变量要重新赋值一次,辛苦耗时加载出来的页 面又要重新加载一次,这样也就给内存增加了无意思的压力,用户体验上也不大友好,尤其在有网络请求等开销时长比较长的情况下。

那有没有上面解决办法呢?答案是肯定的。onDestroyView的执行和Activity的onDestroy不一样,不会销毁当前的页面,所 以Fragment的所有成员变量的引用都还在。那就好办了,我们在onCreateView的时候,先判断该取到的数据是否为空,比如Fragment 的根视图rootView,网络请求获取到的数据等,如果不为空就不用再次执行。这样一来也就避免了上述说的那些问题的存在了。

但是需要注意的一点就是,如果重用rootView的话,一定要记得在onDestroyView里面把rootView先给移除掉,因为已经有过父布局的View是不能再次添加到另一个新的父布局上面的。代码如下

这样也就解决了最前面我遇到的那个bug,由于每次进入都会创建一个MapView,很多地图叠在了一起,所以就出现了"滑不动"的奇怪现象。

今天分享的只是一个优化策略罢了,希望能帮助到你。

本文链接:http://my.oschina.net/u/1171391/blog/295649

Fragment的陷阱:概述的更多相关文章

  1. Fragment的陷阱(转)

    以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragment的时候,会出现奇怪的现象.嵌套的地图会出现滑动不动的情况,起先还以为是高德的bug呢,经过一番研究,终确定这是一个坑. 先对 ...

  2. Fragment的陷阱

    以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragment的时候,会出现奇怪的现象.嵌套的地图会出现滑动不动的情况,起先还以为是高德的bug呢,经过一番研究,终确定这是一个坑. 先对 ...

  3. Android Fragment详解(一):概述

    Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment.你 ...

  4. Fragment概述

    1 Fragment Fragment是什么? Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局. 每个Fragment都是独立的模块, ...

  5. 札记:Fragment基础

    Fragment概述 在Fragment出现之前,Activity是app中界面的基本组成单位,值得一提的是,作为四大组件之一,它是需要"注册"的.组件的特性使得一个Activit ...

  6. ViewPager之Fragment页面切换

    一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPa ...

  7. Java陷阱之assert关键字

    Java陷阱之assert关键字   一.概述   在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.   二.语法   在J ...

  8. 【Android UI】:Fragment官方文档

    概述   Fragment表现Activity中UI的一个行为或者一部分.可以将多个fragment组合在一起,放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity ...

  9. Android Fragment 你应该知道的一切

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42628537,本文出自:[张鸿洋的博客] 很久以前写过两篇Fragment的介绍 ...

随机推荐

  1. python 爬虫001-http请求过程

    HTTP 请求流程 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HT ...

  2. jenkins构建中的除零错误

    一. 除零错误(ZeroDivisionError) 今天在jenkins上运行接口自动化测试任务时,从控制台输出中看到了除零错误,大概是这样的 从上图中,通过分析,可以得出三个结论: 1. jenk ...

  3. Codeforces Round #299 (Div. 2)D. Tavas and Malekas

    KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...

  4. 状态管理(Vuex、 Flux、Redux、The Elm Architecture)

    1.https://vuex.vuejs.org/zh-cn/intro.html (vuex) 这就是 Vuex 背后的基本思想,借鉴了 Flux.Redux.和 The Elm Architect ...

  5. wireshark捕获到的TCP包图示

    wireshark抓到的包与对应的协议层如下图所示: wireshark捕获到的TCP包中的每个字段如下图所示:

  6. Node.js小白开路(一)-- fs篇

    文件操作在我们的日常功能模块之中是十分的常见的内容,nodeJS也不例外的为我们提供了之一操作内容,当时在我们了解文件操作的之前我们先来了解一下链接. 连接可以理解成为一个纸箱相关文件内容的地址,其主 ...

  7. 前端之CSS续集

    CSS:语法形式上由选择器+以及一条或多条声明组成:选择器查找到指定的html标签后,使用css属性设置html标签的样式: 一.css 语法形式: 二.使用步骤   1.引入css规则 2.使用cs ...

  8. 条款19:定义class就相当于定义一个个的内置类型

    下面的条框应该是谨记的: 1. 新的type应该如何创建与销毁 2. 对象的初始化与赋值应该有什么样的区别 3. 新type的对象如果被pass-by-value,有什么影响? 4. 什么事新type ...

  9. Java(Android)线程池妙用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  10. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...