如何知道在Android版Google地图v2上点击哪个标记?

我正在为Android安装Google地图。 我的屏幕上有很多标记,当点击时我正在为每个标记准备可定制的气球。 这意味着,我有根据点击标记不同的信息。

我用setInfoWindowAdapter设置了标记视图的内容,然后覆盖getInfoContents方法。

问题是:这个方法是信息窗口内容的一般实现,但是每个标记都应该显示自己的信息。 所以,就我所知,我必须以某种方式检测getInfoContents(Marker marker)上的哪些标记已被点击,以便从我的数据结构中加载在信息窗口上显示的必要信息。 问题是: 如何识别点击标记“标记”代表的是什么实体? 我的意思是,getInfoContents中的对象Marker被触发以显示信息窗口,我怎样才能检测哪个是显示正确的信息? 我虽然通过使用marker.getTitle()比较string标题,但是这迫使我在信息窗口显示标题,我不想。 还有一个marker.getId(),但是这个ID是由API生成的,我无法控制它

有任何想法吗?

Solutions Collecting From Web of "如何知道在Android版Google地图v2上点击哪个标记?"

回复:

问题是:如何识别点击标记“标记”代表的是什么实体? […]还有一个marker.getId(),但是这个ID是由API生成的,我无法控制它

你可以控制它。 标记由addMarker()返回,所以你可以得到它的ID并存储它。 代码如下:

Map <String, Integer> mMarkers = new HashMap<String, Integer>(); 

 MarkerOptions mo = new MarkerOptions() .icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker)) .position(new LatLng(mLat, mLon)) .flat(true) .snippet("Click here for details") .rotation(0) .title(title); 

将标记添加到地图时,请将其标识存储在容器上

 Marker mkr = map.addMarker(mo); mMarkers.put(mkr.getId(), myObject.getId()); 

然后当点击标记时,可以像这样恢复“myObject”的id

 map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { public void onInfoWindowClick(Marker marker) { int id = mMarkers.get(marker.getId()); // Do stuff with the id } }); 

你没有义务显示标题,所以你可以使用它,只要你返回一个ViewgetInfoContents而不是任何子视图返回View与标题值的setText

取决于如何和如果你已经保持对所有标记的引用,还有其他的select,例如,如果你有List<Marker> policeMarkersList<Marker> badGuysMarkers你可以使用条件if (policeMarkers.contains(marker)) { ... } else { ... }

你也可以保留一个Map<Marker, YourMarkerRelatedDataModel> allMarkers并且做YourMarkerRelatedDataModel model = allMarkers.get(marker); 并使用该值来区分。

最后,您可以使用Android Maps Extensions ,它添加了Marker.setData(Object)Object Marker.getData()等函数,使模型贴近您的标记,而不是像Map<Marker, Model>那样创build。

试试这个代码:

 @Override public void onInfoWindowClick(final Marker marker) { // TODO Auto-generated method stub if (marker.getTitle().equalsIgnoreCase("Start")) { Toast.makeText(showMaps.this, "You have click on start -->", Toast.LENGTH_LONG).show(); Log.e("marker.getPosition()-->", "" + marker.getPosition()); } } 

有一个更好的select,这是谷歌build议:

标记 :与标记关联的Object 。 例如, Object可以包含有关标记所代表的数据。 这比存储一个单独的Map<Marker, Object>更容易。 作为另一个例子,您可以将与数据集中ID相对应的String ID关联起来。 Google Maps Android API既不读取也不写入此属性。

资源

所以你可以做这样的事情:

 for (ListItem it: mList) { Marker mk = mMap.addMarker(new MarkerOptions().position(it.getLatLng()).title(it.getName()).snippet(it.getAddress())); mk.setTag(it.getID()); } mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Integer id = (Integer) marker.getTag(); return false; } });