我正在尝试将我的应用程序移植到新的Google Maps API v2,但是在与标记进行交互时遇到了麻烦。
我的背景:我有一张地图显示巴士和巴士站。有了旧图书馆,我有自己的ItemizedOverlay用于公共汽车站,另一个用于公共汽车站。每个人都有一个不同的OnTapListener(实际上我使用外部库来显示气球),所以当用户点击总线标记时没有任何反应,但是当他点击公共汽车站标记时,会打开一个包含其信息的活动。此外,在我的ItemizedOverlay中,我使用模型的公共汽车站对象映射每个标记。
现在使用新API我有两个主要问题:
我认为这两个问题可以使用Marker的不同子句来解决,但它没有构造函数,并且在将它添加到地图时会得到它的引用,所以我不知道是否可以使用自定义实现。 / p>
API是新的,因此网上没有太多关于类似问题的信息。我一直想弄清楚如何解决这个问题,但我一无所获。有谁知道这可能的解决方案?
感谢。
编辑:我当前应用程序的地图中有两种标记的屏幕截图:
答案 0 :(得分:23)
我也遇到过这个问题。 我的解决方案是:
private Map<Marker, MyModel> markerMap = new HashMap<>();
private GoogleMap mMap;
private void doMarkers(){
MarkerOptions opt = new MarkerOptions();
//Fill out opt from MyModel
Marker marker = mMap.addMarker(opt);
markerMap.put(marker, myModel);
}
然后在OnMarkerClickListener回调中,使用单击的标记将模型从HashMap中拉出。 还有一个方法Marker.getId()由于某种原因返回一个字符串。我不明白为什么在制作标记时不能指定int id,或者为什么在将标记对象添加到地图之前无法访问它。
更新:在差不多<4年之后,Google已添加方法Marker.setTag(Object tag)
,将任意数据与标记相关联。
答案 1 :(得分:18)
好的,这是我决定使用的解决方案,AFAIK应该适用于任何情况:
private HashMap<String, MyModel> markers= new HashMap<String, MyModel>();
MyModel item = ...
MarkerOptions markerOptions = ...
markers.put(mMap.addMarker(markerOptions).getId(), item);
@Override
public void onInfoWindowClick(Marker marker) {
MyModel mapItem = (MyModel) markers.get(marker.getId());.
...
}
答案 2 :(得分:2)
您可以使用标记的getId
方法
答案 3 :(得分:0)
您可以像这样使用HashMarker。在这个例子中,在Arraylist中的y充电点,每个点与坐标共同构成一个新的ArrayList。这个想法就是你获得了点ID。
创建HashMap
Markers = new HashMap();
然后你创建一个标记并添加到地图
final Marker marker = map.addMarker(new MarkerOptions()。position(new LatLng(coordinates.get(j).getLat(),coordinates.get(j).getLon()))。title(point.getName) ()));
然后您可以使用de marker值
保存点IDMarkers.put(marker,point.getId());
最后,您可以在单击InfoWindow
时获取id值public void onInfoWindowClick(Marker marker){
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
}
OR
单击标记
public boolean onMarkerClick(Marker arg0){
final long id = Marcadores.get(marker);
Log.e("Real Marker ID", id+"");
return false;
}