gpt4 book ai didi

java - Android Google Maps SDK 多个 MarkerClickListener

转载 作者:行者123 更新时间:2023-11-29 00:51:23 26 4
gpt4 key购买 nike

TL;DR - 如果您尝试在相同的标记上应用 MarkerClickListener 两次,会发生什么情况?第一个取消了吗?他们都活跃吗?这会导致问题吗?

我们有一个项目使用 Google Maps SDK 和 android-maps-utils 来处理各种项目。

  1. 我们正在使用 android-maps-utils 的 GeoJson 功能 --and--
  2. 我们正在使用 android-maps-utls 的 MarkerManager

在 map 加载时,我们将所有特征(包括标记、聚类项和 GeoJson(线))加载到 map 。

当您为 GeoJson 要素集(线)应用 .setOnFeatureClickListener() 时,它会为 map 上的每个项目应用点击监听器。根据源代码:

    /**
* 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;
}
});
}

只要我们首先设置了功能点击监听器,上面的代码就可以工作。如果我们将功能点击监听器设置为第二,它就会中断。

我认为它应用一次标记点击监听器,然后在 markermanager 设置监听器时设置/重置它。问题是,我不知道这是不是真的。

现在有 2 个听众吗?这会导致一些内存泄漏问题吗?我们可以做些什么来解决这个问题吗?我不想修改 android-maps-utils 库。

最佳答案

what happens if you try and apply a MarkerClickListener on the same markers twice?

当前监听器将被新的替换

Is the first one cancelled out?

是的,它被新的取代了

Are they both active?

不,“旧”监听器被新替换

Will this cause issues?

这取决于您的代码。大多数 - 没有。

Is there anything we can do to workaround this?

你可以使用setTag() 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;
}
...

关于java - Android Google Maps SDK 多个 MarkerClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com