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

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

Примеры кода

Репозиторий ApiDemos на сайте GitHub содержит пример, который демонстрирует все свойства информационных окон:

  • MarkerDemoActivity - Java: настройка информационных окон и использование прослушивателей для них.
  • MarkerDemoActivity - Kotlin: настройка информационных окон и использование прослушивателей для них.

Введение

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

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

Добавление информационного окна

Самый простой способ добавить информационное окно – настроить для соответствующего маркера методы title() и snippet(). Информационное окно будет открываться при нажатии на соответствующий маркер.

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne")
                          .snippet("Population: 4,137,400"));

Отображение и скрытие информационного окна

Информационные окна реагируют, когда пользователь касается их. Тем не менее можно открывать их программным способом, вызывая для соответствующих маркеров метод showInfoWindow(). Чтобы скрыть окно, необходимо вызвать метод hideInfoWindow().

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne"));
melbourne.showInfoWindow();

Вы также можете создавать информационные окна для отдельных кластеризованных маркеров. Ознакомьтесь с руководством, где описано, как это делать.

Персонализация информационных окон

Содержание и внешний вид информационных окон можно изменить. Для этого создайте конкретную реализацию интерфейса InfoWindowAdapter и вызовите метод GoogleMap.setInfoWindowAdapter(). Интерфейс содержит два метода: getInfoWindow(Marker) и getInfoContents(Marker). API сначала вызывает метод getInfoWindow(Marker). Если возвращается значение null, то вызывается метод getInfoContents(Marker). Если и он возвращает null, используется информационное окно по умолчанию.

Метод getInfoWindow() определяет внешний вид всего окна. Метод getInfoContents() отвечает только за персонализацию содержания окна; рамка и фон не меняются.

Ниже показаны информационное окно по умолчанию, окно с персонализированным содержанием и окно с измененными рамкой и фоном.

Сравнение информационных окон

События информационных окон

Пример MarkerDemoActivity содержит код регистрации и управления событиями информационного окна.

Чтобы обнаруживать события кликов в информационных окнах, используйте прослушиватель OnInfoWindowClickListener, Чтобы добавить его на карту, вызовите GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener). Когда пользователь нажимает на информационное окно, вызывается метод onInfoWindowClick(Marker) и окно выделяется цветом, выбранным по умолчанию, то есть серым.

public class MarkerDemoActivity extends AppCompatActivity implements
        OnInfoWindowClickListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        // Add markers to the map and do other map setup.
        ...
        // Set a listener for info window events.
        mMap.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        Toast.makeText(this, "Info window clicked",
                Toast.LENGTH_SHORT).show();
    }
}

Кроме того, вы можете отслеживать длительные нажатия с помощью интерфейса OnInfoWindowLongClickListener. Чтобы добавить его на карту, вызовите метод GoogleMap.setOnInfoWindowLongClickListener(OnInfoWindowLongClickListener). Этот прослушиватель работает так же, как прослушиватель обычных кликов. При обнаружении долгого нажатия инициируется метод обратного вызова onInfoWindowLongClick(Marker).

Чтобы получать оповещения при закрытии информационного окна, используйте интерфейс OnInfoWindowCloseListener. Чтобы установить его, вызовите метод GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener). Вы получите обратный вызов onInfoWindowClose(Marker).

Примечание об обновлении информационного окна. Событие onInfoWindowClose() активируется, если пользователь обновляет информационное окно, нажимая на маркер того же окна, которое уже открыто. Но если вызвать метод Marker.showInfoWindow() для открытого информационного окна программным способом, событие onInfoWindowClose() не активируется. Такое поведение основано на предположении, что вам известно, что информационное окно закроется и откроется снова.

Как уже упоминалось в предыдущем разделе, информационное окно не является интерактивным объектом View. Представление прорисовывается на карте в виде изображения. В результате прослушиватели, добавленные к объекту View, игнорируются, что мешает распознавать события кликов в разных частях окна. Рекомендуем не размещать интерактивные компоненты (такие как кнопки, флажки или текстовые поля) внутри настраиваемого информационного окна.