【问题标题】:Android Google Maps SDK Multiple MarkerClickListenerAndroid Google Maps SDK 多个 MarkerClickListener
【发布时间】:2019-12-20 15:58:09
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

    如果您尝试在同一设备上应用 MarkerClickListener 会发生什么 标记两次?

    当前监听器将被新的替换

    第一个被取消了吗?

    是的,它被替换为新的

    他们都活跃吗?

    不,“旧”侦听器已替换为新侦听器

    这会导致问题吗?

    这取决于您的代码。大部分 - 没有。

    我们可以做些什么来解决这个问题?

    您可以使用Marker类的setTag()方法关联一个标记种类对应的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;
    }
    ...
    

    【讨论】:

    • 太好了,感谢您的帮助/回答。我到处寻找我能找到的文档。你知道任何关于点击监听器被替换的内容吗?例如,我知道在 Swing 中,您可以在按钮上列出点击侦听器。只是好奇是否有任何东西可以解释这些标记侦听器的行为。再次感谢。
    • @dudeguy 不客气! Here 是简短的解释:“设置单击标记时调用的回调。参数 listener 单击标记时调用的回调。要取消设置回调,请使用 null。”
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多