实现MapFragment

http://blog.csdn.net/seker_xinjian/article/details/7252219
转载者请注明原始作者以及原始出处,以避免版权纠纷!

做地图应用时,我们都知道MapView只能在MapActivity中显示。
 
从Android SDK3.0开始,Android Framework增加了一个轻量级的组件:Fragment。它非常方便的解决了频繁的切换Activity而导致的用户体验差的问题。但是,要使用Fragment,有很多的限制。首先要求Android SDK3.0以上,其次要求Activity必须继承自FragmentActivity。
 
有这样一种需求:在开发一款Map应用时,首先为了兼容更多的机型,要求在Android SDK2.1上开发;其次为了得到更好的用户体验,想要将MapView置于Fragment以得到更友好的UI切换效果。
 
这个问题的难点有两处:第一是要Android SDK 2.1基础上实现Fragment;第二就是要在Fragment中显示地图。
 
第一个问题其实很容易解决。相信不少人都知道Android compatibility这个兼容包的存在。是的,Android compatibility包里面就有FragmentActivity和Fragment这套东西。它有两个版本v4和v13,其中v4就支持支持从android sdk1.6开始,可以使用Fragment。Android compatibility包是一个静态的jar包,我们只需要将它置于工程中,导入进工程,就能很方便的引用到FragmentActivity和Fragment了。
 
第二个问题比较棘手。我们要使用Fragmen即必须继承FragmentActivity;要使用MapView就必须继承MapActivity。由于Java语言跟C++语言不同,它是单继承的,不可能同时继承FragmentActivity和MapActivity的。
 
有人可能很快的想到了一种方案:就是让FragmentActivity继承自MapActivity或者让MapActivity继承自FragmentActivity,问题不就解决了么?
 
是的,这确实是一种可能的方案,并且有人去实践成功了。虽然FragmentActivity和MapActivity都是Google在Android Framework之外提供的开发包。但是FragmentActivity和MapActivity不同,它也是开源的。而MapActivity是Google公司的核心技术,它是封闭。
 
于是,一位叫Pete Doyle的大牛人拿着Android compatibility包的源码,重新写过。他让FragmentActivity不是继承自Activity,而是继承自MapActivity,并且将这个修改过的Android compatibility包发布出来。这样只要你使用他的包,就自然在能在Fragment中使用MapView了。下面就是这位大牛人的工程的下载地址:
https://github.com/petedoyle/android-support-v4-googlemaps 
 
不过,使用这种方案,也有些弊端。毕竟修改Android compatibility包不是官方正式行为,在此我并无冒犯这位大牛人的意思(事实上我很崇拜他)。还有就是Android compatibility包(无论是v4还是v13)都是在持续更新的。因此修改过的compatibility包肯定在更新上要比Google官方的慢半拍。
 
事实上,还有一种解决方案,我会在下次中细讲,敬请关注。

在没有出现Fragment之前,为了避免Activity频繁的切换而带来的用户体验低下的问题,肯定有不少人用过ActivityGroup或者TabActivity。实际上ActivityGroup及其子类最大的用处就是能将多个Activity显示在同一个屏幕上,而没有Activity之间的切换(准确的说是:没有了Activity全屏效果和切换效果)。这个功能在Fragment出现之后,被Google建议成“deprecated”了。在迫不得已或者一些诡异的需求面前(比如说在Fragment中显示MapView),我们不妨重新启用这中功能。



事实上,ActivityGroup继承自Activity,它的本质封装着一个LocalActivityManager的实例。LocalActivityManager是用来启动、管理、关闭Activity的。它可以在启动完一个Activity之后,拿到这个Activity的根View,添加到ActivityGroup的ContentView中,这样就实现了一个Activity置于另一个Activity(ActivityGroup)之中的效果。


而Fragment的实现原理跟上面几乎如出一辙。FragmentActivity的本质就是它封装着一个FragmentManager,只不过它是用来启动、管理、关闭Fragment的。它可以在启动完一个Fragment之后,拿到这个Fragment的根View,添加到FragmentActivity的ContentView中,这样实现了一个Fragment置于一个Activity(FragmentActivity)之中的效果。


我们再重复一遍我们所面临的问题:
有这样一种需求:在开发一款Map应用时,首先为了兼容更多的机型,要求在Android SDK2.1上开发;其次为了得到更好的用户体验,想要将MapView置于Fragment以得到更友好的UI切换效果。


解决这个问题的关键点就是:我们要使用Fragmen即必须继承FragmentActivity;要使用MapView就必须继承MapActivity。由于Java语言跟C++语言不同,它是单继承的,不可能同时继承FragmentActivity和MapActivity的。


在理解了上述的原理之后,我们可以提出一种全新的方案:我们让主Activity继承自FragmentActivity,它封装着FragmentManager可以用来启动Fragment的。在Fragment中,我们来封装一个LocalActivityManager,用来启动一个Activity(当然是MapActivity啦)。这样一来,MapView就间接的处在了Fragment之中了。


当明白了原理,解决问题就是这么简单的。


事实上这个方案是一个叫inazaruk的大牛人(在此膜拜一下)实现过的。我只是拿过他代码稍作修改一番,全做学习使用。由于是二次创作,特免费供大家下载,指点!
下载地址如下:http://download.csdn.net/detail/seker_xinjian/4058720

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值