GoogleMaps MapView在Android中崩溃onTap?

问题描述:

我目前正在编写一个应用程序,显示一个显示谷歌地图的MapView。我使用了http://developer.android.com/resources/tutorials/views/hello-mapview.html中的“hello map view”教程,这个工程到目前为止:地图显示,居中和放大正确,即使我添加的OverlayItems显示正确。GoogleMaps MapView在Android中崩溃onTap?

但是,当我在我加入那些覆盖项目中的一个点击,应用程序崩溃,一个空指针异常:

07-23 16:24:48.167: ERROR/AndroidRuntime(2530): java.lang.NullPointerException 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at  com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:753) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:273) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at net.xenonite.wifiloc.act_map$MapItemizedOverlay.onTap(act_map.java:182) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.google.android.maps.MapView.onTouchEvent(MapView.java:647) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.View.dispatchTouchEvent(View.java:3709) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1708) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.os.Looper.loop(Looper.java:123) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at android.app.ActivityThread.main(ActivityThread.java:4595) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-23 16:24:48.167: ERROR/AndroidRuntime(2530):  at dalvik.system.NativeStart.main(Native Method) 

我的代码大多是从教程复制:

public class act_map extends MapActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 

     intent = getIntent(); 
     lat = intent.getDoubleExtra("lat", 0.0); 
     lng = intent.getDoubleExtra("lng", 0.0); 

     MapView = (MapView) findViewById(R.id.act_map_mapview); 

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

     Drawable positionMarker 
      = getResources().getDrawable(R.drawable.act_map_androidmarker); 
     MapItemizedOverlay itemizedOverlay 
      = new MapItemizedOverlay(positionMarker); 

     geoPoint = new GeoPoint((int) (lat * 1000000), (int) (lng * 1000000)); 
     Pointer = new OverlayItem(geoPoint, "Thats me!", "wohooo"); 

     itemizedOverlay.addOverlay(Pointer); 

     mapOverlays.add(itemizedOverlay); 

     MapView.setSatellite(false); 

     MapController = MapView.getController(); 
     MapController.setCenter(geoPoint); 
     MapController.setZoom(18); 

     MapView.setBuiltInZoomControls(true); 
     MapView.displayZoomControls(true); 
    } 

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

    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if (keyCode == KeyEvent.KEYCODE_I) 
     { 
      MapView.getController().setZoom(MapView.getZoomLevel() + 1); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_O) 
     { 
      MapView.getController().setZoom(MapView.getZoomLevel() - 1); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_S) 
     { 
      MapView.setSatellite(true); 
      return true; 
     } 
     else if (keyCode == KeyEvent.KEYCODE_M) 
     { 
      MapView.setSatellite(false); 
      return true; 
     } 

     return false; 
    } 

    public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> 
    { 
     private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
     private Context mContext; 

     public MapItemizedOverlay(Drawable defaultMarker) 
     { 
      super(boundCenterBottom(defaultMarker)); 
     } 

     public MapItemizedOverlay(Drawable defaultMarker, Context context) 
     { 
      super(defaultMarker); 
      mContext = context; 
     } 

     public void addOverlay(OverlayItem overlay) 
     { 
      mOverlays.add(overlay); 
      populate(); 
     } 

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

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

     @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; 
     } 
    } 

如何我解决这个问题吗?

mContextnull。由于您的叠加层是活动的内部类,因此请在您的AlertDialog构造函数调用中将mContext替换为act_map.this

+0

thanx!这解决了问题! – xenonite 2010-07-29 13:53:28

+0

如果它不在内部班级,那又怎样? – 2011-02-03 19:51:46

我也有过与Android的MapView教程的一个问题。当我点击该图标时,屏幕会崩溃(空mContext将被传递):

上述修正没有为我工作。相反,我改变了下面的代码行从MapActivity类从:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

这样:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

您还需要通过添加boundCenterBottom修复构造其丢失:

public HelloItemizedOverlay(Drawable defaultMarker, Context context) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 

(已有美丽的截图,但不能发表,因为我是新的:P)

希望可以帮助其他仍然存在教程问题并修复其应用程序的人!

+0

有完全相同的问题,这固定它。他们的教程中如何存在这样一个明显的错误? – wbarksdale 2011-11-25 04:22:00

+0

+1是的,这也是我的修复。 – 2011-11-27 04:09:37

使用this相反,它比谷歌提供的一个好得多的教程。

+1

该示例很有用,但确实使用了不推荐的mapView.getZoomControls()。这可以很容易地用原始教程中的mapView.setBuiltInZoomControls(true)替换。 – selwyn 2011-10-24 09:39:15

也在mapoverlay构造函数中调用populate()