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

时间:2012-12-04 23:18:12

标签: android google-maps google-maps-markers

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

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

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

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

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

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

感谢。

编辑:我当前应用程序的地图中有两种标记的屏幕截图: A screenshot from my current application's map with two types of marker

4 个答案:

答案 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值

保存点ID

Markers.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;
}