TL;DR --如果您尝试两次在相同的标记上应用MarkerClickListener,会发生什么?第一个被取消了吗?他们都很活跃吗?这会引起问题吗?
我们有一个项目,它使用Google和android- Maps utils为各种项目。
的MarkerManager
在地图加载时,我们将所有特性(包括标记、集群项和GeoJson (行))加载到地图中。
当您为.setOnFeatureClickListener特性集(行)应用GeoJson ()时,它会为地图上的每个项目应用一个单击监听器。根据源代码:
/**
* Sets a single click listener for the entire GoogleMap object, that will be called
* with the corresponding Feature object when an object on the map (Polygon,
* Marker, Polyline) is clicked.
* <p>
* If getFeature() returns null this means that either the object is inside a KMLContainer,
* or the object is a MultiPolygon, MultiLineString or MultiPoint and must
* be handled differently.
*
* @param listener Listener providing the onFeatureClick method to call.
*/
public void setOnFeatureClickListener(final OnFeatureClickListener listener) {
GoogleMap map = getMap();
map.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
@Override
public void onPolygonClick(Polygon polygon) {
if (getFeature(polygon) != null) {
listener.onFeatureClick(getFeature(polygon));
} else if (getContainerFeature(polygon) != null) {
listener.onFeatureClick(getContainerFeature(polygon));
} else {
listener.onFeatureClick(getFeature(multiObjectHandler(polygon)));
}
}
});
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if (getFeature(marker) != null) {
listener.onFeatureClick(getFeature(marker));
} else if (getContainerFeature(marker) != null) {
listener.onFeatureClick(getContainerFeature(marker));
} else {
listener.onFeatureClick(getFeature(multiObjectHandler(marker)));
}
return false;
}
});
map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
@Override
public void onPolylineClick(Polyline polyline) {
if (getFeature(polyline) != null) {
listener.onFeatureClick(getFeature(polyline));
} else if (getContainerFeature(polyline) != null) {
listener.onFeatureClick(getContainerFeature(polyline));
} else {
listener.onFeatureClick(getFeature(multiObjectHandler(polyline)));
}
}
});
}问题是,我不想将map.setOnMarkerClickListener()用于setOnFeatureClickListener()应用的标记,我们需要MarkerManager来应用标记侦听器。所以我们也是这样做的:
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mLineLayer.setOnFeatureClickListener(new GeoJsonLayer.OnFeatureClickListener() {
@Override
public void onFeatureClick(Feature feature) {
GeoJsonLineStringStyle lineStringStyle = new GeoJsonLineStringStyle();
GeoJsonFeature lineStringFeature = (GeoJsonFeature) feature;
lineStringStyle.setColor(Color.RED);
lineStringStyle.setWidth(14);
lineStringFeature.setLineStringStyle(lineStringStyle);
}
});
mMarkerManager = new MarkerManager(mMap);
mMap.setOnMarkerClickListener(mMarkerManager);
CachedCollection.instance().setupCollection(mMarkerManager);
mCollection = CachedCollection.instance().getCollection();
mCollection.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
doSomething(marker)
return true;
}
});
}上面的代码可以工作,只要我们先将功能单击listener设置即可。如果我们将功能单击listener设置为第二,它就会中断。
我认为它应用标记点侦听器一次,然后在标记管理器设置侦听器时设置/重置它。问题是,我不知道这是不是真的。
现在有两个听众吗?这会导致内存泄漏问题吗?我们能做些什么来解决这个问题吗?我不想修改android-maps utils库。
发布于 2019-12-20 07:58:09
,如果您尝试两次在相同的标记上应用MarkerClickListener,会发生什么?
当前侦听器将被新的
是第一个被取消的吗?
是的,它被新的
,它们都是活动的吗?
不,“旧”侦听器改为“新”
,这会引起问题吗?
这取决于你的代码。主要是-不。
,我们能做些什么来解决这个问题吗?
您可以使用Marker类的Marker方法将对应于标记类的ID关联起来,然后通过getTag()方法在onMarkerClick(Marker marker)中获取它,并为标记类型调用对应方法:
...
@Override
public boolean onMarkerClick(Marker marker) {
MarkerKind kind = (MarkerKind) marker.getTag();
if (kind.id == MARKER_KIND1) {
doSomething(marker);
} else {
doSomethingElse(marker);
}
return true;
}
...https://stackoverflow.com/questions/59413776
复制相似问题