21

我正在尝试将我的应用程序移植到新的 Google Maps API v2,但在与标记交互时遇到了问题。

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

现在有了新的 API,我有两个主要问题:

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

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

该 API 是新的,因此网络上没有太多关于类似问题的信息。我一直试图弄清楚如何解决这个问题,但我什么也没得到。有谁知道可能的解决方案?

谢谢。

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

4

4 回答 4

24

我也遇到过这个问题。我的解决方案是:

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 年后,谷歌添加了一种Marker.setTag(Object tag)将任意数据与标记相关联的方法。

于 2012-12-05T00:10:06.423 回答
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());.
   ...
}
于 2012-12-06T19:16:13.907 回答
2

您可以使用标记的getId方法

于 2012-12-05T10:06:12.447 回答
0

您可以像这样使用 HashMarker。在这个例子中, Arraylist 中的 y 个充电点,每个点都包含一个带有坐标的新 ArrayList。这个想法是你得到点ID。

创建一个哈希映射

标记 = 新的 HashMap();

然后你创建一个标记并添加到地图

最终标记标记 = map.addMarker(new MarkerOptions().position(new LatLng(coordinates.get(j).getLat(),coordinates.get(j).getLon())).title(point.getName()) );

然后您可以使用 de 标记值保存点 id

Markers.put(marker, point.getId());

最后,您可以在单击 InfoWindow 时获取 id 值

公共无效onInfoWindowClick(标记标记){

    final long id = Marcadores.get(marker);
    Log.e("Real Marker ID", id+"");
}

或者

当您单击标记时

公共布尔 onMarkerClick(标记 arg0){

    final long id = Marcadores.get(marker);
    Log.e("Real Marker ID", id+"");
    return false;
}
于 2014-05-24T23:15:10.820 回答