Скрыть infoWindow при щелчке маркера второй раз (Google Maps Android API V2)

Чтобы достичь этого, я чувствую, что мне просто нужно переопределить onMarkerClick и проверить, уже ли открыт указатель мыши с кликом, но, к моему удивлению, 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");
    }
}

Он всегда говорит мне, что инфо-окно "не показывается", что неверно... Я могу обойти это, сохранив ссылку userLastClickedMarker, но я хотел бы знать, где я ошибся выше.

Спасибо!

Edit:

Я изменил свой код, чтобы отладить эту проблему:

    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

Ответы

Ответ 1

В соответствии с документацией это правильно:

Информационное окно позволяет отображать информацию пользователю, когда они нажмите маркер. Одновременно отображается только одно информационное окно. Если пользователь нажимает на другой маркер, текущее информационное окно будет скрыто и появится новое информационное окно.

Мы можем считать это ошибкой с точки зрения использования.

@Override
public boolean onMarkerClick(Marker marker)

Из бизнес-логики это не подходящее место для вызова функции marker.isInfoWindowShown(), потому что она всегда ложна, как предполагалось. Когда OnMarkerClickListener вызывает эту функцию, любая открытая InfoWindow уже была скрыта картой Карт (так что статус "false" технически правильный).

Вы можете проверить, что в примере, изменяющем переопределенный метод onMarkerClick открыть InfoWindows только на кликах. На нечетных кликах - ничего не делать и видеть InfoWindows автоматически закрывается каркасом без явного вызова marker.hideInfoWindow();

Чтобы получить фактический статус InfoWindow, вы должны вызывать marker.isInfoWindowShown из других событий или функций, сохраняя локальные ссылки на любые маркеры на карте.

Ответ 2

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

В моем случае я показываю свою собственную информацию о окне в информации о окне google,

Информация о моем окне

И мне нужно было скрывать информацию в окне Google в любое время, когда пользователь нажимает на другое место, например карту, кнопки.

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

Но мне также нужна информация об окнах googles, потому что одна из моих функций - поделиться снимком экрана с картой, а информация о окне необходима для функции скриншота.

(Для этого нужно открыть всплывающее окно. Фокусное свойство должно быть равно true)

Ответ 4

У меня была та же проблема, и я нашел простое решение, объявив глобальную логическую переменную и переключая ее значение, когда пользователь нажимает на маркер. Здесь мой код:

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

Надеюсь, это поможет кому-то.

Ответ 5

Я создаю этот код для 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(новый MarkerClickListener());