显示适用于Android的Android地图实用程序库的自定义InfoWindow

我正在使用Android的Google Maps Utility库,允许在地图上创build集群,我需要显示一个自定义的InfoWindow但是我找不到任何方法来执行此操作。 为了显示信息窗口,我有以下类,在方法onClusterItemRendered是我有权访问标记的信息:

 class MyClusterRenderer extends DefaultClusterRenderer<MarkerItem> { public MyClusterRenderer(Context context, GoogleMap map, ClusterManager<MarkerItem> clusterManager) { super(context, map, clusterManager); } @Override protected void onBeforeClusterItemRendered(MarkerItem item, MarkerOptions markerOptions) { super.onBeforeClusterItemRendered(item, markerOptions); markerOptions.title(String.valueOf(item.getMarkerId())); } @Override protected void onClusterItemRendered(MarkerItem clusterItem, Marker marker) { super.onClusterItemRendered(clusterItem, marker); } } 

有没有人使用这个库,知道如何显示一个自定义的InfoWindow比如它在Google Maps中的使用方式? 喜欢:

 getMap().setInfoWindowAdapter(new InfoWindowAdapter() { @Override public View getInfoWindow(Marker arg0) { return null; } @Override public View getInfoContents(Marker arg0) { return null; } }); 

Solutions Collecting From Web of "显示适用于Android的Android地图实用程序库的自定义InfoWindow"

是的,这可以做到。 ClusterManager维护两个MarkerManager.Collections

  • 一个用于群集标记,和
  • 一个用于单个项目标记

您可以独立地为这些种类的标记设置自定义的InfoWindowAdapter


履行

首先,将您的ClusterManager的MarkerManager安装为地图的InfoWindowAdapter:

 ClusterManager<MarkerItem> clusterMgr = new ClusterManager<MarkerItem>(context, map); map.setInfoWindowAdapter(clusterMgr.getMarkerManager()); 

接下来,将您的自定义InfoWindowAdapter安装为一个或两个标记集合的适配器:

 clusterMgr.getClusterMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForClusters()); clusterMgr.getMarkerCollection().setOnInfoWindowAdapter(new MyCustomAdapterForItems()); 

最后一部分将您在自定义InfoWindowAdaptercallback中收到的原始Marker对象映射到您首先添加到映射中的ClusterItem对象。 这可以使用onClusterClick和onClusterItemClick监听器来实现,如下所示:

 map.setOnMarkerClickListener(clusterMgr); clusterMgr.setOnClusterClickListener(new OnClusterClickListener<MarkerItem>() { @Override public boolean onClusterClick(Cluster<MarkerItem> cluster) { clickedCluster = cluster; // remember for use later in the Adapter return false; } }); clusterMgr.setOnClusterItemClickListener(new OnClusterItemClickListener<MarkerItem>() { @Override public boolean onClusterItemClick(MarkerItem item) { clickedClusterItem = item; return false; } }); 

现在,您拥有了将自定义的InfoWindow内容组装到各自的适配器中所需的一切! 例如:

 class MyCustomAdapterForClusters implements InfoWindowAdapter { @Override public View getInfoContents(Marker marker) { if (clickedCluster != null) { for (MarkerItem item : clickedCluster.getItems()) { // Extract data from each item in the cluster as needed } } // build your custom view // ... return view; } } 

所以基本上你有这样的课:

 private class MarkerItemClusterRenderer extends DefaultClusterRenderer<MarkerItem> { public MarkerItemClusterRenderer(Context context, GoogleMap map, ClusterManager<MarkerItem> clusterManager) { ... 

因此,在GoogleMaptypes的参数map中,您必须指定setInfoWindowAdapter