实现MapFragment(二)

来源:互联网 发布:有mac版本的网游 编辑:程序博客网 时间:2024/05/20 11:50

本文内容为原创,转载者请注明原始作者以及原始出处,以避免版权纠纷!


在没有出现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