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

Posted

技术标签:

【中文标题】如何在 Android Google Map API 中管理不在集群中的标记?【英文标题】:How to manage click on marker which is not in Cluster in Android Google Map API? 【发布时间】:2019-02-11 17:42:50 【问题描述】:

我在为不在集群中的标记实现 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 会起作用。

希望您了解我想要达到的目标。如果没有,请告诉我。

【问题讨论】:

我可以将所有标记添加到集群并从集群中排除它们吗?或者这里的解决方案是什么? 我猜marker上的监听器应该独立于clusterManager 为什么不直接传递上下文? 对于活动 mMap.setOnMarkerClickListener(this);对于片段 mMap.setOnMarkerClickListener(getActivity()); 尝试告诉我它是否有效 【参考方案1】:

更新答案

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

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

1) 更新mMapOnMarkerClickListener

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

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

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

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)

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

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

5) 完成!现在正常标记像以前一样添加到地图中,但 OnMarkerClickListener 正常工作。


较早的答案

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

您应该将 clicklistener 添加到 mClusterManager。使用 ClusterManager 时,在 mMap 上设置 clicklistener 不起作用。

因此不要使用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;
    
);

【讨论】:

我明白这一点,但我可以有一个或多个不在集群中的标记 - 我不希望它们像其他标记一样被集群。如何监听他们的点击事件? 我现在明白了,您更新的问题清楚地描述了图像的问题。查看我更新的答案来解决这个问题:) 谢谢@Alex,我已经像你说的那样添加了监听器,但是我使用了 normalMarkersCollection = mClusterManager.getMarkerManager() 而不是 mClusterManager.markerManager.newCollection()。 newCollection() 因为 first 不适合我。后来,我尝试使用 normalMarkersCollection.addMarker(),但它要求我添加 MarkerOptions - 我不能只添加我创建的标记。当我这样做时,单击正常标记的侦听器仍然无法正常工作。 啊,是的,使用mClusterManager.markerManager 只能在 Kotlin 中工作(这是我使用的)。对于 Java,我们必须使用 getMarkerManager() 是的。我会在答案中更新它。 哦对了,我忘记了我们需要的MarkerOptions,它基本上包含了NormalMarker的所有数据,但是包裹在另一个对象中。只需像这样添加 NormalMarkers:normalMarkersCollection.addMarker( MarkerOptions().postition(new LatLng(...).title("Normal marker").snipper("Description")) )。我也会更新我的答案来描述这一点【参考方案2】:

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

mGoogleMap.getMarkerManager().onMarkerClick(marker);

在你的OnMarkerClickListener里面

【讨论】:

以上是关于如何在 Android Google Map API 中管理不在集群中的标记?的主要内容,如果未能解决你的问题,请参考以下文章