2

我正在做这里的 MapView 教程:https ://developers.google.com/maps/documentation/android/v1/hello-mapview

问题是它一直在崩溃。这是代码:

package com.example.googlemapstest;

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.Menu;

public class MainActivity extends MapActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MapView mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);

    List<Overlay> mapOverlays = mapView.getOverlays();

    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

    GeoPoint point = new GeoPoint(19240000,-99120000);
    OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

    drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    overlayitem.setMarker(drawable); 

    itemizedoverlay.addOverlay(overlayitem, drawable);
    mapOverlays.add(itemizedoverlay);

}

@Override
protected boolean isRouteDisplayed() {
    return false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

和 HelloItemizedOverlay 类:

package com.example.googlemapstest;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay
{
private ArrayList<OverlayItem> mOverlays;
Context mContext; 

public HelloItemizedOverlay(Drawable defaultMarker) {
      super(boundCenterBottom(defaultMarker));
      mOverlays =  new ArrayList<OverlayItem>(); 
      populate(); 
    }

public void addOverlay(OverlayItem overlay, Drawable drawable) {
    overlay.setMarker(drawable); 
    mOverlays.add(overlay);
    populate();
}

@Override
public int size() {
  return mOverlays.size();
}

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
      super(boundCenterBottom(defaultMarker));
      mContext = context;
      mOverlays =  new ArrayList<OverlayItem>(); 
      populate(); 
    }

@Override
protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
}

@Override
protected OverlayItem createItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}
}

我不断得到的例外是

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.googlemapstest/com.example.googlemapstest.MainActivity} : java.lang.NullPointerException

崩溃发生在 itemizedoverlay.addOverlay(overlayitem, drawable) 中的 populate() 行;现在,最初我发现我添加的 OverlayItem 的 mMarker 变量为空,并添加了两行手动设置它。但是,程序仍然不断崩溃!

然后我发现了这个问题:ItemizedOverlay 崩溃的问题,它似乎正在处理相同的错误。

我按照那里的最佳答案中的建议做了,但仍然没有运气。

我相信我已经认真梳理了这一点,并且无法想象 null 错误来自哪里。任何帮助深表感谢。

4

2 回答 2

1

我很确定您不应该返回nullin createItem(int index),这意味着您应该在HelloItemizedOverlay班级中更改以下方法:

@Override
protected OverlayItem createItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

最基本的实现应该返回OverlayItem适​​合给定的对象index。很可能,您只想返回位于OverlayItem同一索引处的 s 列表中的任何对象。例如:

@Override
protected OverlayItem createItem(int index) {
    return mOverlays.get(index);
}

仅当您还在某处填充该列表时,这才有意义。此外,为避免混淆,您可能应该将变量重命名为mOverlayItems,因为这是它包含的内容(而不是“覆盖”)。

更重要的是,正如@ianhanniballake 已经提到的:Android Maps SDK v1 已被弃用,取而代之的是 v2。这意味着从2013 年 3 月 3 日起,您将无法再为 v1 请求 API 密钥。如果您还没有这样做,最好现在快点生成密钥,或者现在迁移到 v2,这可能不是一个坏举动。

于 2013-02-26T00:38:48.770 回答
0

自 2012 年 12 月 3 日起正式弃用 Google Maps Android API 版本 1

使用 Google Map API V2,让您的生活更轻松

https://developers.google.com/maps/documentation/android/

快乐编码

于 2013-02-26T06:41:34.500 回答