【问题标题】:Showing custom InfoWindow for Android Maps Utility Library for Android为 Android 显示自定义信息窗口 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;
    }
});

【问题讨论】:

    标签: android google-maps google-maps-android-api-2 markerclusterer


    【解决方案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&lt;T&gt; 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

    【讨论】:

    • 这是对第一个答案的阐述还是?
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2015-03-29
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多