使用不同标记操作的Maps API v2

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

我的背景:我有一个地图显示巴士和巴士停止。 在老图书馆,我有自己的ItemizedOverlay公共汽车站,另一个公交车站。 每个人都有一个不同的OnTapListener(实际上我使用一个外部库来显示气球),所以当用户点击总线标记时什么都不会发生,但是当他点击公共汽车站标记时,打开一个带有其信息的活动。 此外,在我ItemizedOverlay我映射每个标记与模型的巴士站对象。

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

  • 您可以使用GoogleMap对象的setOnInfoWindowClickListener()或setOnMarkerClickListener()方法设置侦听器。 换句话说,你只能为整个地图设置一个听众,所以我不能区分巴士站或巴士上的水龙头。
  • 两个标记的onClick方法只接收标记对象,从那里我不能得到太多的信息,如巴士站号码打开它的活动(我希望有一个比parsing标题string!O_O更好的方法)

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

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

谢谢。

编辑:从我目前的应用程序的地图与两种types的标记截图: 从我目前的应用程序的地图与两种类型的标记截图

Solutions Collecting From Web of "使用不同标记操作的Maps API v2"

我也遇到了这个问题。 我的解决scheme是:

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); } 

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

更新:经过近4年谷歌已经添加一个方法Marker.setTag(Object tag)关联任意数据与标记。

好的,这里有一个我决定使用的解决scheme,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());. ... } 

您可以使用标记的getId方法

你可以像这样使用HashMarker。 在这个例子中,我们在Arraylist中计算点数,每个点都有一个带有坐标的新ArrayList。 这个想法是你得到de点ID。

创build一个HashMap

标记= new HashMap();

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

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

然后你可以用标记值保存点号

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

最后,当你点击InfoWindow时,你可以得到id值

public void onInfoWindowClick(Marker marker){

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

要么

当你点击标记

public boolean onMarkerClick(Marker arg0){

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