如何管理点击 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) 更新mMap
的OnMarkerClickListener
:
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
里面
我在为不在集群中的标记实施 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) 更新mMap
的OnMarkerClickListener
:
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