GrabDuck

Информационные окна  |  Google Maps Android API  |  Google Developers

:

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

Примеры кода

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

  • MarkerDemoActivity: Настройка информационных окон и использование блоков прослушивания информационных окон

Введение

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

Информационное окно ориентировано по экрану устройства и отображается по центру над связанным с ним маркером. Стандартное информационное окно содержит заголовок, выделенный жирным шрифтом, под которым (в некоторых случаях) отображаются фрагменты текста.

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

Самый простой способ добавить информационное окно – использовать методы 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, API вызовет getInfoContents(Marker). Если этот метод также вернет значение null, то будет использовано стандартное информационное окно.

Первый из этих методов (getInfoWindow()) позволяет создать представление, которое будет использовано для всего информационного окна. Второй из этих методов (getInfoContents()) позволяет изменить только контент окна, сохранив используемые по умолчанию рамку и фон информационного окна.

Примечание. Отображаемое информационное окно не является интерактивным представлением. Представление создается в виде изображения (с использованием View.draw(Canvas)) в момент его возврата. Это означает, что любые последующие изменения представления не будут отражены в информационном окне на карте. Чтобы обновить информационное окно позже (например, после загрузки изображения), вызовите showInfoWindow(). Кроме того, информационное окно не использует какие-либо интерактивные функции, обычно применяемые для стандартного представления, такие как нажатия и жесты. Тем не менее, вы можете отслеживать обычные события нажатия во всем информационном окне, как это описано в приведенном ниже разделе.

На изображениях ниже представлены стандартное информационное окно, информационное окно с измененным контентом и информационное окно с измененными рамкой и фоном.

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

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

Пример 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. Напротив, представление прорисовывается на карте в виде изображения. В результате все блоки прослушивания, устанавливаемые вами для представления, не учитываются, и вы не можете различать касания на различных участках представления. Рекомендуем вам не размещать интерактивные компоненты (такие как кнопки, флажки или текстовые поля) внутри настраиваемого информационного окна.