Maps API v2具有不同的标记操作

Slo*_*loy 20 android google-maps google-maps-markers

我正在尝试将我的应用程序移植到新的Google Maps API v2,但是在与标记进行交互时遇到了麻烦.

我的背景:我有一张显示公共汽车和公共汽车站的地图.有了旧图书馆,我有自己的ItemizedOverlay用于公共汽车站,另一个用于公共汽车站.每个人都有一个不同的OnTapListener(实际上我使用外部库来显示气球),所以当用户点击总线标记时没有任何反应,但是当他点击公共汽车站标记时,会打开一个包含其信息的活动.此外,在我的ItemizedOverlay中,我使用模型的总线停止对象映射每个标记.

现在使用新的API我有两个主要问题:

  • 使用GoogleMap对象的setOnInfoWindowClickListener()或setOnMarkerClickListener()方法设置侦听器.换句话说,你只能为整个地图设置一个监听器,所以我无法区分公交车站或公交车上的水龙头.
  • 两个标记的onClick方法只接收Marker对象,从那里我无法获得太多信息,比如公共汽车站号码来打开它的活动(我希望有一种比解析标题字符串更好的方法!O_O)

我认为这两个问题可以使用Marker的不同子句来解决,但它没有构造函数,并且在将其添加到地图时会得到它的引用,所以我不知道是否可以使用自定义实现.

API是新的,因此网上没有太多关于类似问题的信息.我一直想弄清楚如何解决这个问题,但我一无所获.有谁知道这可能的解决方案?

谢谢.

编辑:我当前应用程序的地图的屏幕截图,有两种类型的标记: 我当前应用程序的地图中有两种标记的屏幕截图

roc*_*cko 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);
}
Run Code Online (Sandbox Code Playgroud)

然后在OnMarkerClickListener回调中,使用单击的标记将模型从HashMap中拉出.还有一个方法Marker.getId()由于某种原因返回一个字符串.我不明白为什么在制作标记时不能指定int id,或者为什么在将标记对象添加到地图之前无法访问它.

更新:经过近4年的时间,谷歌已经添加了一种方法Marker.setTag(Object tag)来将任意数据与标记相关联.

  • 如果Marker对象可以扩展或者它有某种`setTag()`方法会很好. (10认同)
  • 您还可以使用WeakHashMap确保从地图中删除标记后不再引用该标记 (5认同)
  • 你确定这是正确答案吗?根据`getId` https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Marker#getId%28%29的说明.地图和标记可以从`android.os.Bundle`恢复,如果是这样,那么地图`markerMap`中的标记就不再有效了? (2认同)
  • @nicopico WeakHashMap不会立即开始删除项目,因为在此方法结束时对Marker对象本身的唯一引用超出了范围吗?MarkerOptions传递到地图中并返回Marker.谁知道这些物体内部会发生什么.我试着这样就把20个数据项添加到地图上,当我点击InfoWindow时,我的标记集只包含3个项目(17个已被清理).我切换到常规HashMap,每次刷新数据时都清除它.我可能也会在onDestroyView或其他东西中清除它 (2认同)

mar*_*ant 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());.
   ...
}
Run Code Online (Sandbox Code Playgroud)