Скрыть 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());