为 Android 显示自定义信息窗口 Android 地图实用程序库
Posted
技术标签:
【中文标题】为 Android 显示自定义信息窗口 Android 地图实用程序库【英文标题】:Showing custom InfoWindow for Android Maps Utility Library for Android 【发布时间】:2014-03-20 01:30:55 【问题描述】:我正在使用库Google Maps Utility for android,它允许在他的地图中创建聚类,我需要显示一个自定义InfoWindow
,但我找不到任何方法来做到这一点。
为了显示信息窗口,我有以下类,在方法@987654323@ 中我可以访问标记的信息:
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 地图中的使用方式?喜欢:
getMap().setInfoWindowAdapter(new InfoWindowAdapter()
@Override
public View getInfoWindow(Marker arg0)
return null;
@Override
public View getInfoContents(Marker arg0)
return null;
);
【问题讨论】:
【参考方案1】:是的,这可以做到。 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());
最后一步是将您在自定义 InfoWindowAdapter 的回调中收到的原始 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;
【讨论】:
干得好!我只是想警告人们,我没有注意到一段代码:map.setOnMarkerClickListener(clusterMgr);
并且从未命中回调。显然需要按照源代码中的注释进行操作:/*Sets a callback that's invoked when an individual ClusterItem is tapped. Note: For thislistener to function, the ClusterManager must be added as a click listener to the map. */ public void setOnClusterItemClickListener(OnClusterItemClickListener<T> listener) mOnClusterItemClickListener = listener; mRenderer.setOnClusterItemClickListener(listener);
我不太清楚你的意思?在设置 onCluster 和 onClusterItem 点击监听器之前,我确实在上面的示例代码中调用了 map.setOnMarkerClickListener(clusterMgr)。
一切正常,只是我的错误,所以我想强调这一点
一直在类似的问题上苦苦挣扎,直到偶然发现您的评论。它让我大开眼界:) 谢谢
看起来现在有更好的方法可以做到这一点,从 0.3.2 开始,github.com/googlemaps/android-maps-utils/issues/48【参考方案2】:
所以基本上你的课程是这样开始的:
private class MarkerItemClusterRenderer extends
DefaultClusterRenderer<MarkerItem>
public MarkerItemClusterRenderer(Context context, GoogleMap map,
ClusterManager<MarkerItem> clusterManager)
...
因此,在GoogleMap
类型的参数map
中,您必须指定setInfoWindowAdapter
。
【讨论】:
这是对第一个答案的阐述还是?以上是关于为 Android 显示自定义信息窗口 Android 地图实用程序库的主要内容,如果未能解决你的问题,请参考以下文章