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

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

Согласно документации, это правильно:

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

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

 @Override public boolean onMarkerClick(Marker marker) 

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

Вы можете проверить это, например, модифицируя переопределенный метод onMarkerClick чтобы открыть InfoWindows только для кликов. О нечетных кликах – ничего не делать и видеть, что InfoWindows автоматически закрывается каркасом без явного вызова marker.hideInfoWindow() ;

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

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

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

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

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

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

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

(Чтобы это работало Всплывающее окно должно потерять фокус. Поэтому для его свойства фокусировки должно быть установлено значение true)

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

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

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

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