27

当前,Android Map v2 在单击后会捕捉到标记位置。我想禁用此行为,但看不到执行此操作的选项。

有人知道如何解决吗?

4

2 回答 2

52

根据我从 Markers 中读到的内容 - Google Maps Android API ( https://developers.google.com/maps/documentation/android/marker#marker_click_events )

标记点击事件

您可以使用 OnMarkerClickListener 来侦听标记上的点击事件。要在地图上设置此侦听器,请调用 GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)。当用户单击标记时,将调用 onMarkerClick(Marker) 并将标记作为参数传递。此方法返回一个布尔值,指示您是否已使用该事件(即,您想要抑制默认行为)。如果它返回 false,那么除了您的自定义行为之外,还将发生默认行为。标记单击事件的默认行为是显示其信息窗口(如果可用)并移动相机以使标记位于地图的中心。

您可能会覆盖此方法并让它仅打开标记并返回 true 以使用事件。

// Since we are consuming the event this is necessary to
// manage closing opened markers before opening new ones
Marker lastOpened = null;

mMap.setOnMarkerClickListener(new OnMarkerClickListener() {
    public boolean onMarkerClick(Marker marker) {
        // Check if there is an open info window
        if (lastOpened != null) {
            // Close the info window
            lastOpened.hideInfoWindow();

            // Is the marker the same marker that was already open
            if (lastOpened.equals(marker)) {
                // Nullify the lastOpened object
                lastOpened = null;
                // Return so that the info window isn't opened again
                return true;
            } 
        }

        // Open the info window for the marker
        marker.showInfoWindow();
        // Re-assign the last opened such that we can close it later
        lastOpened = marker;

        // Event was handled by our code do not launch default behaviour.
        return true;
    }
});

这是未经测试的代码,但这可能是一个可行的解决方案。

谢谢, 曼

于 2013-01-24T16:38:51.900 回答
2

看来我们应该能够执行以下操作,但是由于这个错误,它不起作用,因为marker.isInfoWindowShown()总是返回 false:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    public boolean onMarkerClick(Marker marker) {
        if (marker.isInfoWindowShown()) {
            marker.hideInfoWindow();
        } else {
            marker.showInfoWindow();
        }
        return true;
    }
});

但是,以下具有相同的效果并且确实有效:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

    Marker currentShown;

    public boolean onMarkerClick(Marker marker) {
        if (marker.equals(currentShown)) {
            marker.hideInfoWindow();
            currentShown = null;
        } else {
            marker.showInfoWindow();
            currentShown = marker;
        }
        return true;
    }
});

因为一次只显示一个信息窗口(如Google Maps API v2 开发人员指南中所述),我们只需要在单击其信息窗口当前打开的标记时隐藏信息窗口。

于 2015-01-07T12:22:08.033 回答