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 変数が null であることがわかり、手動で設定するために 2 行追加しました。しかし、プログラムは依然としてクラッシュし続けました。

次に、この質問を見つけました:同じエラーを処理しているように見えるItemizedOverlay でクラッシュする問題。

そこでのベストアンサーで推奨されているとおりに実行しましたが、それでもうまくいきません。

私はこれを精力的に調べたと思いますが、null エラーがどこから来ているのか想像できません。どんな助けでも大歓迎です。

4

2 に答える 2

1

nullに戻るべきではないと確信しています。つまり、クラスcreateItem(int index)の次のメソッドを変更する必要があります。HelloItemizedOverlay

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

最も基本的な実装はOverlayItem、指定された に適したオブジェクトを返す必要がありますindexOverlayItemおそらく、同じインデックスの 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 に答える