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

uni*_*pin 5 android google-maps-markers google-maps-android-api-2

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

 mClusterManager.addItem(markerCluster);
Run Code Online (Sandbox Code Playgroud)

我已将 OnMarkerClickLister 设置如下:

 mMap.setOnCameraIdleListener(mClusterManager);
 mMap.setOnMarkerClickListener(mClusterManager);
Run Code Online (Sandbox Code Playgroud)

如果我只是使用:

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

点击标记根本不起作用。

例如:我有这种情况:

在此处输入图片说明

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

希望你明白我想要达到的目标。如果没有,请告诉我。

Ale*_*lex 5

更新答案

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

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

1)更新OnMarkerClickListener的mMap:

mMap.setOnMarkerClickListener(mClusterManager.getMarkerManager()); // Note the `MarkerManager` here
Run Code Online (Sandbox Code Playgroud)

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

MarkerManager.Collection normalMarkersCollection = mClusterManager.getMarkerManager().newCollection();
Run Code Online (Sandbox Code Playgroud)

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

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

// Add it to the collection
normalMarkersCollection.addMarker(markerOptions)
Run Code Online (Sandbox Code Playgroud)

4)最后但并非最不重要的:我们想要OnClickListener它:

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

5)完成!现在,普通标记像以前一样添加到地图中,但带有一个有效的OnMarkerClickListener.


较早的回答

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

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

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

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

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

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