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