之前作过的一个项目,Fragment嵌套高德地图,当再次进入Fragment的时候,会出现奇怪的现象。嵌套的地图会出现滑动不动的状况,起先还觉得是高德的bug呢,通过一番研究,终肯定这是一个坑。android
先对Fragment作一个简单的介绍,借用csdn上朋友写的一段内容。 微信
Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,而且这些组件之间会产生更多的交互。Fragment容许这样的一种设计,而不须要你亲自来管理 viewhierarchy的复杂变化。 经过将activity的布局分散到fragment中, 你能够在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化。网络
使用过Fragment的同窗都知道,它的使用至关的简单,基本上和Activity中同样,就是生命周期函数稍稍多了点。今天不是介绍Fragment如何使用,而是介绍一个Fragment中的一个坑。如今至关多的APP都有如下三种设计风格。函数
1、底部TAB,通常3-5个,点击某个TAB,上面页面也随之切换,如QQ、腾讯微博、新浪微博。早期的时候Android开发者们都会使用TabActivity去实现,可是TabActivity存在一些问题,也不符合Andoid的单窗口设计的原则,因此已经被废弃,不推荐你们继续使用。若有业务需求,请优先考虑使用Fragement。布局
2、顶部TAB,通常也是3-5个左右,相对于底部TAB风格,顶部TAB通常会引入ViewPager + Fragment的实现方式,这样能够作到左右切换,如微信。优化
3、侧边TAB,也就是SlidingMenu + Fragment或者MenuDrawer + Fragment。这种风格自去年起,风靡的一发不可收拾,前段时间干货分享讲的一期就是这个,代码也开源在了Github上,有兴趣的朋友能够下载了解下。出门右转,查看历史消息《一个比较酷的项目界面分享,干货十足》。.net
上述三种风格中使用到的Fragment,通常很容易会被你们忽略了一个问题。那就是当和Fragment关联的view hierarchy正在被移除时,不会执行onDestroy()方法,而是会调用onDestroyView()。好比上述的风格二ViewPager + Fragment,默认状况下当ViewPager滑动到第三页的时候,第一页的Fragment就会执行onDestroyView,当再次滑动到第二页的时候,第一页的Fragment的onCreateView又会从新执行绘制页面。伴随而来的问题就是成员变量要从新赋值一次,辛苦耗时加载出来的页面又要从新加载一次,这样也就给内存增长了无心思的压力,用户体验上也不大友好,尤为在有网络请求等开销时长比较长的状况下。设计
那有没有上面解决办法呢?答案是确定的。onDestroyView的执行和Activity的onDestroy不同,不会销毁当前的页面,因此Fragment的全部成员变量的引用都还在。那就好办了,咱们在onCreateView的时候,先判断该取到的数据是否为空,好比Fragment的根视图rootView,网络请求获取到的数据等,若是不为空就不用再次执行。这样一来也就避免了上述说的那些问题的存在了。blog
可是须要注意的一点就是,若是重用rootView的话,必定要记得在onDestroyView里面把rootView先给移除掉,由于已经有过父布局的View是不能再次添加到另外一个新的父布局上面的。代码以下生命周期
这样也就解决了最前面我遇到的那个bug,因为每次进入都会建立一个MapView,不少地图叠在了一块儿,因此就出现了"滑不动"的奇怪现象。
今天分享的只是一个优化策略罢了,但愿能帮助到你。
若是以为对你有所帮助,欢迎你们订阅个人微信公众帐号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎你们加群,共同探讨下Android和Java技术,一块儿壮大咱们的微信干货分享社区。