18

为了实现这一点,我觉得我只需要覆盖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但我想知道我在上面做错了什么。

谢谢!

编辑:

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

    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

4

5 回答 5

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

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

于 2017-07-11T19:56:00.893 回答
1

isInfoWindowShown 总是假的,所以我使用基本方式隐藏信息窗口

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;
}
于 2017-06-08T15:14:55.797 回答
0

根据文档,它是正确的:

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

从使用的角度来看,我们可以将其视为错误。

@Override
public boolean onMarkerClick(Marker marker)

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

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

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

于 2015-09-29T14:54:22.817 回答
0

就我而言,我在谷歌窗口信息上显示我自己的窗口信息,

我的窗口信息

每当用户点击其他地方(例如地图、按钮)时,我都需要隐藏谷歌窗口信息。

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

但我也需要谷歌的窗口信息,因为我的功能之一是分享地图的屏幕截图,并且屏幕截图功能需要窗口信息。

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

于 2017-06-14T10:11:32.473 回答
-1

我为显示/隐藏信息窗口创建此代码。

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());

于 2014-01-23T06:11:07.413 回答