27

現在、Android マップ v2 は、クリック後にマーカーの位置にスナップします。この動作を無効にしたいのですが、無効にするオプションがありません。

誰もそれを修正する方法を知っていますか?

4

2 に答える 2

52

マーカーから読んだ内容に基づく-GoogleMapsAndroid 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;
    }
});

これはテストされていないコードですが、実行可能な解決策である可能性があります。

ありがとう、DMan

于 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;
    }
});

一度に表示される情報ウィンドウは 1 つだけなので ( Google Maps API v2 デベロッパー ガイドで説明されているように)、情報ウィンドウが現在開いているマーカーをクリックした場合に、情報ウィンドウを非表示にするだけで済みます。

于 2015-01-07T12:22:08.033 に答える