如何在没有SDK级别11的情况下创建Android Google MapView?

时间:2013-03-09 03:40:41

标签: java android google-maps google-maps-android-api-2

我正在尝试在SDK版本10上创建一个MapView,但是如何创建MapView的所有示例都使用Fragments,它仅在API 11中。

https://developers.google.com/maps/documentation/android/map#add_a_map_to_an_android_application

我不想添加额外的支持库。

我能够加载应用,但地图显示为空灰色网格。它们在日志文件中显示为唯一的半相关行:

03-08 23:20:25.088: W/dalvikvm(32615): VFY: unable to resolve instance field 23
03-08 23:20:25.088: D/dalvikvm(32615): VFY: replacing opcode 0x52 at 0x0012
03-08 23:20:25.088: D/dalvikvm(32615): VFY: dead code 0x0014-0018 in Lcom/google/android/gms/common/GooglePlayServicesUtil;.b (Landroid/content/res/Resources;)Z
03-08 23:20:25.213: D/dalvikvm(32615): GC_CONCURRENT freed 1276K, 48% free 3765K/7175K, external 9476K/10157K, paused 5ms+8ms
03-08 23:20:25.236: I/dalvikvm(32615): Total arena pages for JIT: 11
03-08 23:20:25.541: W/dalvikvm(32615): Unable to resolve superclass of Lmaps/p/s; (427)
03-08 23:20:25.541: W/dalvikvm(32615): Link of class 'Lmaps/p/s;' failed
03-08 23:20:25.541: W/dalvikvm(32615): Unable to resolve superclass of Lmaps/y/bo; (3820)
03-08 23:20:25.541: W/dalvikvm(32615): Link of class 'Lmaps/y/bo;' failed
03-08 23:20:25.541: W/dalvikvm(32615): Unable to resolve superclass of Lmaps/i/k; (4208)
03-08 23:20:25.541: W/dalvikvm(32615): Link of class 'Lmaps/i/k;' failed
03-08 23:20:25.541: E/dalvikvm(32615): Could not find class 'maps.i.k', referenced from method maps.z.ag.a
03-08 23:20:25.541: W/dalvikvm(32615): VFY: unable to resolve new-instance 3540 (Lmaps/i/k;) in Lmaps/z/ag;
03-08 23:20:25.541: D/dalvikvm(32615): VFY: replacing opcode 0x22 at 0x006d
03-08 23:20:25.627: D/dalvikvm(32615): VFY: dead code 0x006f-007f in Lmaps/z/ag;.a (Landroid/view/LayoutInflater;Lcom/google/android/gms/maps/GoogleMapOptions;ZLjava/lang/String;)Lmaps/z/ag;
03-08 23:20:26.275: D/MPAY(32615): map = com.google.android.gms.maps.GoogleMap@40718398

4 个答案:

答案 0 :(得分:1)

由于API 11或更高版本支持片段,因此地图现已封装在MapFragment类中,这是Android Fragment类的扩展。现在,您可以将地图添加为较大活动的一部分。使用MapFragment对象,您可以在较小的屏幕上(例如移动电话)单独显示地图,或者在大屏幕设备(如平板电脑)上显示更复杂的UI的一部分。因此,谷歌还提供了支持库,以便在API 11或更低版本中实现它。

您可以在应用中使用android-support-v4.jar库并按以下方式实施Google地图:

在项目Goto->android SDK->extras->android->support->v4->android-support-v4.jar中添加支持库。只需复制此jar文件并添加到应用程序的libs文件夹中,然后添加到构建路径。之后,您可以使用片段添加GoogleMap。

在这里,我将向您展示如何在API 10或更低版本中实施GoogleMap:

首先我们需要为GoogleMap使用支持库Fragment,而不是MapFragment我们将在布局文件中使用SupportMapFragment

   <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/map"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
             class="com.google.android.gms.maps.SupportMapFragment"/>

在您的java文件中访问地图如下:

public class MapActivity extends android.support.v4.app.FragmentActivity {

       private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
            // Try to obtain the map from the SupportMapFragment.
         mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
    }
   }

答案 1 :(得分:0)

我认为答案是你(可能)不能。

Google Maps Android API v2概述说明了这一点:

  
      
  • 地图现在封装在MapFragment类中,这是Android的Fragment类的扩展。现在,您可以将地图添加为更大的一块   活动。使用MapFragment对象,您可以单独显示地图   较小的屏幕,如手机,或作为更复杂的一部分   大屏幕设备上的用户界面,例如平板电脑。
  •   
  • 由于地图封装在MapFragment类中,您可以通过扩展Android标准Activity类来实现它们,   而不是扩展版本1中使用的MapActivity。
  •   

虽然没有明确说明,但我认为这意味着v2中的地图基本上依赖于Fragment。

如果您需要使用SDK 10或更早版本,并且无法使用某种Fragment的后端,那么您可能无法使用Google Maps API v2。

答案 2 :(得分:0)

目前支持所有版本,没有库你不能使用它。特别是杰克

wharton的sherlock图书馆https://github.com/JakeWharton/ActionBarSherlock为您提供

支持所有版本。您可以将mapview气球用于MapView和android sherlock mapview

已提供

jar文件。您可以使用它。

https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps/

答案 3 :(得分:0)

我发现了怎么样。这是一堆小东西,包括我必须实现onResume(),onPause()等...我想我可以通过调用mapView.onCreate()进行测试,但我想这还不够。

我还在Google Play图书馆...\Java\android-sdk\extras\google\google_play_services\samples\maps\src\com\example\mapdemo\RawMapViewDemoActivity.java

中找到了一个示例

该示例扩展了FragmentActivity,但这不是必需的,也不是导入android.support.v4。*。

public class RawMapViewDemoActivity extends Activity {
    private MapView mMapView;
    private GoogleMap mMap;

    protected void onCreate(Bundle savedInstanceState) {
        ...
        mMapView = (MapView) findViewById(R.id.map);
        mMapView.onCreate(savedInstanceState);


    protected void onResume() {
        super.onResume();
        mMapView.onResume();

    protected void onPause() {
        mMapView.onPause();
        super.onPause();


    protected void onDestroy() {
        mMapView.onDestroy();
        super.onDestroy();


    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();


    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);