谷歌地图中的错误?

时间:2012-08-16 16:24:40

标签: android google-maps

我跟随this tutorial创建了一些不同的东西,本教程展示了叠加如何使用插入到其中的预定义项目,但是如果我想动态添加项目呢?那么我必须从一个空的叠加开始:

而不是:

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);

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

mapOverlays.add(itemizedoverlay);

的工作方式与教程中的预期相同,我需要把它放在:

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

省略了使用项目初始化叠加层。

这种方法会导致地图卡住,经过几次点击后,我的应用因为null异常而被踢出。

1.这是预期的行为吗?这对我来说似乎是个错误......

2.我该怎么做以实现预期的行为?(我可以从空的叠加开始并动态添加项目)

至于我想要实现的目标,即不启动叠加和项目,而是动态使用addOverlay,这样我就可以

1 个答案:

答案 0 :(得分:2)

据我了解,在ItemOverlay下,您的意思是ItemizedOverlay。如果是这样,你就走在了正确的轨道上。 ItemizedOverlay是地图项的容器,因此每次添加/删除ItemizedOverlay项时,都需要将最后一个项目设置为-1,并调用populate()方法通知mapview关于内容的变化。

请记住,您需要在UI线程上下文中对ItemizedOverlay内容进行更改;)

这里也有无证件。您需要将最后一个聚焦索引设置为-1,并且即使您没有项目也需要populate()(因此您需要在初始化阶段执行此操作)

所以你的代码应该是这样的:

MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
ItemOverlay itemizedoverlay = new ItemOverlay(drawable, this);
mapOverlays.add(itemizedoverlay);

setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content


//now try to add new item
GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
itemizedoverlay.addOverlay(overlayitem);
setLastFocusedIndex(-1); //reset initial position
populate(); //notify about our content