ItemizedOverlay出现崩溃问题

39

我已经试了几个小时,想弄清楚为什么我不能在将其添加到地图的覆盖层之前使用一个分项地图叠加层:

GeoPoint point; OverlayItem overlayitem = new OverlayItem(point, "",""); MarkerOverlay.addOverlay(overlayitem);

如果我尝试在没有MarkerOverlay.addOverlay(overlayitem);命令的情况下执行此操作,那么当我尝试添加新的覆盖层时,会出现以下问题:

public boolean onTap(GeoPoint point, MapView mapView)
{
    if (mOverlays.size() > 0)
        mOverlays.remove(0);
    OverlayItem overlayitem = new OverlayItem(point, "", "");
    mOverlays.add(overlay);
    populate();
    return true;
}

在我的ItemizedOverlay类中,我只是遇到了空引用异常(我不知道何时或为什么-当调试时它说没有可用的源代码)

有任何想法吗?

编辑: 这是我可以在logcat中找到的:

09-20 22:36:22.164: WARN/dalvikvm(311): threadid=3: thread exiting with uncaught exception (group=0x4001b188)

这就是我认为的臭名昭著的异常:

   09-20 22:36:22.293: ERROR/AndroidRuntime(311): java.lang.NullPointerException
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.getItemsAtLocation(ItemizedOverlay.java:617)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.getItemAtLocation(ItemizedOverlay.java:586)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.handleMotionEvent(ItemizedOverlay.java:498)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.onTouchEvent(ItemizedOverlay.java:572)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:625)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.View.dispatchTouchEvent(View.java:3709)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.os.Looper.loop(Looper.java:123)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.app.ActivityThread.main(ActivityThread.java:4363)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at java.lang.reflect.Method.invokeNative(Native Method)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at java.lang.reflect.Method.invoke(Method.java:521)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at dalvik.system.NativeStart.main(Native Method)
09-20 22:36:22.394: ERROR/dalvikvm(311): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
3个回答

115

我最近遇到了这个问题。此问题在这个漏洞报告中有概述。

为了解决它,您应该在填充任何数据之前在ItemizedOverlay中调用populate()方法。我将其添加到了构造函数中:

private class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private Context context;
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

    LocationItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        this.context = context;
        populate(); // Add this
    }
}

0

如果您在ItemizedOverlay上进行重要更改,每次都需要执行以下操作:

  1. 从Overlays中删除用户标记(myitemizedoverlay);
  2. 创建用户标记(myitemizedoverlay);
  3. 将myitemizedoverlay添加到mapView的Overlays中。

使用:

private void delete_usrer_Marker_from_Overlays(MyOverlays myio){

    List<Overlay> mapOverlays = mapView.getOverlays();
    if (mapOverlays != null) 
        {
          for (int i = 0;i< mapOverlays.size();i++)
          {
              Overlay x = mapOverlays.get(i);
              if (x.hashCode() == myio.hashCode())
              {
                  mapOverlays.remove(x);
              }                     
          }
        }       
    }

0

项目化叠加层需要第二个和第三个参数,因为它们用于点击事件。当您单击其中一个项目化叠加层时,它会有一个与之关联的标题和描述,这些是您的叠加层项中的第二个和第三个参数。


分项叠加层起作用,但只有在我在地图视图的onCreate中添加一个随机点时才有效,否则它会崩溃。 - Jason
哦,我误解了。那你的问题是什么?你的帖子真的很混乱。你能发一下能运行的确切代码,然后再发一下不能运行的确切代码吗? - Falmarri
因为代码分布在几个文件中,所以直接发布精确的代码会很混乱。基本上,如果我创建了一个带有标记的覆盖层,并将其添加到地图的覆盖层中,而在将其添加到地图的覆盖层之前没有添加覆盖层项,则当我尝试在onTap方法中创建新的覆盖层项时,应用程序会崩溃,就像发布的那样。 - Jason
为什么需要在地图上添加一个带有空叠加项的项目化叠加层? - Falmarri
直到用户按下地图,物品才会移动到该位置。 - Jason
你确定你的OverlayItem和MapOverlay类是正确的吗?很容易混淆你正在向哪个覆盖层添加内容。 - Falmarri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接