如何在 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 中管理不在集群中的标记?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 上使用 google map api 获取 google 驾驶指令?

如何在 Google Map Api V2 Android 中搜索?

如何在现有较旧的 android 项目中使用最新 API 添加 Google Map?

如何在现有的旧版Android项目中使用最新的API添加Google Map?

Android Google Map如何检查用户是不是在标记矩形区域

Android Google Map如何检查gps位置是否在圈内