第二次点击标记时隐藏infoWindow(Google Map Android API V2)

时间:2013-06-17 18:12:36

标签: android google-maps google-maps-android-api-2

要实现这一点,我觉得我只需要覆盖onMarkerClick并检查点击标记的infoWindow是否已经打开,但令我惊讶的是clickedMarker.isInfoWindowShown()总是返回false ...

我的代码:

@Override
public boolean onMarkerClick(final Marker clickedMarker) {
    if(clickedMarker.isInfoWindowShown()) {
        clickedMarker.hideInfoWindow();
        System.out.println("was showing");
    } else {
        clickedMarker.showInfoWindow();
        System.out.println("not showing");
    }
}

它总是告诉我infoWindow“没有显示”这是不对的......我可以通过保留userLastClickedMarker的引用来解决这个问题,但我想知道上面我做错了什么。< / p>

谢谢!

编辑:

我更改了代码以调试此问题:

    System.out.println(clickedMarker.isInfoWindowShown());
    if(clickedMarker.isInfoWindowShown()) {
        clickedMarker.hideInfoWindow();
        System.out.println(" showing");
    } else {
        clickedMarker.showInfoWindow();
        System.out.println("not showing");
    }
    System.out.println(clickedMarker.isInfoWindowShown());

我发现isInfoWindowShown()在onMarkerClick方法中可以正常工作但不会正确“记住”它。而且我发现有人已经指出这是一个错误......

https://code.google.com/p/gmaps-api-issues/issues/detail?id=5408

5 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我通过声明一个全局布尔变量并在用户点击标记时切换其值来找到一个简单的解决方案。这是我的代码:

private boolean isInfoWindowShown = false;

   map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {

            if (!isInfoWindowShown) {

                marker.showInfoWindow();
                map.moveCamera(CameraUpdateFactory.newLatLng(marker.getPosition()));
                isInfoWindowShown = true;
            } else {

                marker.hideInfoWindow();
                isInfoWindowShown = false;
            }

           return true;
        }
    });

希望这会对某人有所帮助。

答案 1 :(得分:0)

根据文件证明是正确的:

  

信息窗口允许您在用户显示信息时显示信息   点击标记。一次只显示一个信息窗口。如果一个   用户点击另一个标记,将隐藏当前信息窗口   并将显示新的信息窗口。

我们可能会将其视为来自使用角度的错误。

@Override
public boolean onMarkerClick(Marker marker)

从业务逻辑来看,这不是调用marker.isInfoWindowShown()函数的正确位置,因为它总是假设是假的。当OnMarkerClickListener调用此函数时,任何已打开的InfoWindow都已被Map框架本身隐藏(因此状态&#39; false&#39;技术上是正确的。)

您可以通过示例修改已覆盖的onMarkerClick方法来检查 仅在偶数cliks上打开InfoWindows。在奇怪的cliks上 - 什么都不做,看看InfoWindows在没有显式调用marker.hideInfoWindow()的情况下由框架自动关闭;

要获得实际的InfoWindow状态,您应该通过保留对地图上任何标记的本地引用,从其他事件或函数中调用marker.isInfoWindowShown

答案 2 :(得分:0)

isInfoWindowShown始终为false,因此我使用基本方式隐藏信息窗口

int mLastIndex = -1

@Override
public boolean onMarkerClick(Marker marker) {   
    int index = (int) marker.getTag();
    Log.i(TAG, "onMarkerClick: " + index);
    if(lastIndex != index){
        marker.showInfoWindow();
        lastIndex = index;
    }else{
        marker.hideInfoWindow();
        lastIndex = -1;
    }

    return true;
}

答案 3 :(得分:0)

在我的情况下,我在谷歌窗口信息显示我自己的窗口信息,

My window info

每当用户点击地图,按钮等其他地方时,我就需要隐藏谷歌窗口信息。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    Marker lastMarkerClicked = modelManager.getLastMarkerClicked();
    if(lastMarkerClicked!=null){
        lastMarkerClicked.hideInfoWindow();
    }
    super.onWindowFocusChanged(hasFocus);
}

但我还需要googles窗口信息,因为我的一个功能是分享地图的截图,截屏功能需要窗口信息。

(为此工作弹出窗口应该失去焦点所以它的focusable属性应该设置为true)

答案 4 :(得分:-1)

我为show / hide infowindow创建了这个代码。

enter code here

private boolean infoWindowIsShow = false;
private Marker lastMarker;

private class MarkerClickListener implements GoogleMap.OnMarkerClickListener {
    @Override
    public boolean onMarkerClick(Marker marker) {

        //обработка выводить/не выводить инфовиндов
        if(lastMarker == null){
            marker.showInfoWindow();
            lastMarker = marker;
            infoWindowIsShow=true;
        }else
        if (marker.getId().equals(lastMarker.getId())) {
            if (infoWindowIsShow) {
                marker.hideInfoWindow();
                infoWindowIsShow = false;
            } else {
                marker.showInfoWindow();
                infoWindowIsShow = true;
            }
        }
        else{
            //это щелчок по другому маркеру
            if (infoWindowIsShow) {//если открыто инфовиндов предыдущего маркера, скрываем его
                lastMarker.hideInfoWindow();
                //и отображаем для нового
                marker.showInfoWindow();
                infoWindowIsShow = true;
                lastMarker = marker;
            } else {
                marker.showInfoWindow();
                infoWindowIsShow = true;
                lastMarker = marker;
            }
        }
        return true;
    }
}

mMap.setOnMarkerClickListener(new MarkerClickListener());