2013-02-25 82 views
2

我做的發現這裏的MapView教程:https://developers.google.com/maps/documentation/android/v1/hello-mapview谷歌地圖API的Android V1的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); 現在,最初我發現我添加的OverlayItem的mMarker變量爲null,並添加了兩行來手動設置它。但是,該方案仍然不斷崩潰!

然後我發現這個問題:Problem with crash with ItemizedOverlay這似乎是處理同樣的錯誤。

我按照最佳答案的建議做了,但仍然沒有運氣。

我相信我已經很好地梳理了這一點,並且無法想象空錯誤來自哪裏。任何幫助深表感謝。

+0

您使用地圖v1而不是v2的任何特定原因?如果您使用的是不推薦使用的庫,您將會獲得更多幫助。 – ianhanniballake 2013-02-26 00:03:56

+0

我開始維護api v1應用程序,並且正在做本教程以掌握基本概念。 – user1401321 2013-03-01 12:57:52

回答

1

我敢肯定,你不應該在createItem(int index)被返回null,這意味着你應該更改以下方法在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地圖SDK v1已被棄用,以支持v2。這意味着從2013年3月3日您將不再能夠請求V1的API密鑰。如果你還沒有這麼做,現在就更好地快速生成一個密鑰,或者現在只是遷移到v2,這可能不是一個壞的舉動。

+0

是的!這工作!非常感謝。這是如此明顯,這有點令人尷尬。 :) – user1401321 2013-02-26 08:27:54