首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android多重MarkerClickListener

Android多重MarkerClickListener
EN

Stack Overflow用户
提问于 2019-12-19 16:41:00
回答 1查看 254关注 0票数 2

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

我们有一个项目,它使用Google和android- Maps utils为各种项目。

  1. 我们正在使用android的GeoJson功能--映射-使用-和-
  2. -我们使用的是android-maps utls

的MarkerManager

在地图加载时,我们将所有特性(包括标记、集群项和GeoJson (行))加载到地图中。

当您为.setOnFeatureClickListener特性集(行)应用GeoJson ()时,它会为地图上的每个项目应用一个单击监听器。根据源代码:

代码语言:javascript
复制
    /**
 * 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来应用标记侦听器。所以我们也是这样做的:

代码语言:javascript
复制
   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库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 07:58:09

,如果您尝试两次在相同的标记上应用MarkerClickListener,会发生什么?

当前侦听器将被新的

是第一个被取消的吗?

是的,它被新的

,它们都是活动的吗?

不,“旧”侦听器改为“新”

,这会引起问题吗?

这取决于你的代码。主要是-不。

,我们能做些什么来解决这个问题吗?

您可以使用Marker类的Marker方法将对应于标记类的ID关联起来,然后通过getTag()方法在onMarkerClick(Marker marker)中获取它,并为标记类型调用对应方法:

代码语言:javascript
复制
...
@Override
public boolean onMarkerClick(Marker marker) {
    MarkerKind kind = (MarkerKind) marker.getTag();
    if (kind.id == MARKER_KIND1) {
        doSomething(marker);
    } else {
        doSomethingElse(marker);
    }
    return true;
}
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59413776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档