如何管理点击 Android Google 地图 API 中不在集群中的标记?

How to manage click on marker which is not in Cluster in Android Google Map API?

我在为不在集群中的标记实施 OnClickListener 时遇到问题,即未添加使用:

 mClusterManager.addItem(markerCluster);

我已将 OnMarkerClickLister 设置如下:

 mMap.setOnCameraIdleListener(mClusterManager);
 mMap.setOnMarkerClickListener(mClusterManager);

如果我只使用:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            return false;
        }
    });

点击标记根本不起作用。

例如:我有这种情况:

两个绿点和大蓝点(编号为6)是一个簇,但红色标记不在簇中,因为我不希望它像其他标记一样成簇。 当我单击红色标记时,InfoWindow 通常会显示,但 onMarkerClick 和 OnClusterItemClickListener 不起作用。但是当我点击集群中的标记时,OnClusterItemClickListener 起作用。

希望您理解我想要实现的目标。如果没有,请告诉我。

更新答案

您在编辑中添加的图片清楚地说明了问题,谢谢!

为了解决这个问题,我们需要以不同的方式注册侦听器。即:通过将其注册到 ClusterManager 的 MarkerManager,因为 class 现在可以处理标记的所有内容。我们还需要以不同的方式添加 NormalMarkers,所以让我们一步一步来:

1) 更新mMapOnMarkerClickListener:

mMap.setOnMarkerClickListener(mClusterManager.getMarkerManager()); // Note the `MarkerManager` here

2) 这个 MarkerManager 包含所有 collection。我们需要在这个管理器上创建一个新的 collection,我们将向其中添加应该与集群分开显示的 NormalMarkers:

MarkerManager.Collection normalMarkersCollection = mClusterManager.getMarkerManager().newCollection();

3) 添加标记的方法与之前类似,但在我们创建的 collection 上使用 addMarker() 方法。我们必须传递一个 MarkerOptions() object 给这个:

// Create a normal marker
val markerOptions = MarkerOptions()
    .position(new LatLng(...))
    .title("My marker")
    .snippet("With description")

// Add it to the collection
normalMarkersCollection.addMarker(markerOptions)

4) 最后但同样重要的是:我们想要 OnClickListener 在上面:

normalMarkersCollection.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener {
    public boolean onMarkerClick(marker: Marker) {
        // NORMAL MARKER CLICKED!
        return false;
    }
})

5) 完成!现在正常标记被添加到地图上,就像以前一样,但是有一个有效的 OnMarkerClickListener.


较早的回答

(设置集群和集群项的点击监听器)

您应该将点击监听器添加到 mClusterManager。在 mMap 上设置 clicklistener 在使用 ClusterManager 时不起作用。

因此,不要使用 mMap.setOnMarkerClickListener,而是在集群管理器上设置 ClusterItemClickListener

mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
    @Override
    public boolean onClusterItemClick(MyItem item) {
        Log.d("cluster item","clicked");
        return true;
    }
});

另外,如果要捕获集群项item的onclick,使用ClusterClickListener:

mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
    @Override
    public boolean onClusterClick(Cluster<MyItem> cluster) {
        Log.d("cluster","clicked");
        return true;
    }
});

如果你想让 Marker 和 Cluster 监听器都工作,你可以写

mGoogleMap.getMarkerManager().onMarkerClick(marker);

在你的OnMarkerClickListener

里面