实现MapFragment(一)

来源:互联网 发布:有mac版本的网游 编辑:程序博客网 时间:2024/05/20 15:40
本文内容为原创,转载者请注明原始作者以及原始出处,以避免版权纠纷!

做地图应用时,我们都知道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官方的慢半拍。
 
事实上,还有一种解决方案,我会在下次中细讲,敬请关注。

原创粉丝点击