Добавление карты

Выберите платформу: Android iOS JavaScript

В этой статье рассказывается, как добавить базовую карту в приложение Android, когда вы уже настроили проект для использования Maps SDK для Android. После добавления карты вы можете изменить ее тип и функции.

Обзор

В Maps SDK для Android есть несколько классов для управления жизненным циклом, функциями и данными карты в приложении. Эти классы поддерживают взаимодействие с пользователем на основе модели интерфейса Android. Например, вы можете задать исходное состояние карты и реакцию на жесты пользователя.

Основной интерфейс и классы для работы с картами:

  • GoogleMap – точка входа для управления основными функциями и данными. Получить доступ к объекту GoogleMap приложение может только после того, как он был извлечен из объекта SupportMapFragment или MapView.

  • SupportMapFragment – фрагмент для управления жизненным циклом объекта GoogleMap.

  • MapView – представление для управления жизненным циклом объекта GoogleMap.

  • OnMapReadyCallback – интерфейс обратного вызова, который обрабатывает события и взаимодействия пользователей для объекта GoogleMap.

Объект GoogleMap автоматически выполняет следующие операции:

  • подключение к Google Картам;
  • загрузка фрагментов карты;
  • отображение фрагментов на экране устройства;
  • отображение элементов управления (панорамирование, масштабирование и пр.);
  • изменение вида карты в ответ на жесты панорамирования и масштабирования.

Чтобы использовать в приложении объект GoogleMap, нужно добавить объект SupportMapFragment или MapView в качестве контейнера для карты, а затем извлечь из этого контейнера объект GoogleMap. Поскольку классы-контейнеры являются производными от представления или фрагмента Android, они обеспечивают возможности управления жизненным циклом карты и работы с интерфейсом, доступные в соответствующих им базовых классах Android. Класс SupportMapFragment – более современный и часто используемый контейнер для объекта GoogleMap.

Знакомство с кодом

Приведенный ниже код взят из полного объекта activity (Java), который используется в этом разделе при статическом добавлении фрагмента. Проект Android был создан на основе шаблона пустого проекта, а затем обновлен по инструкциям из этого руководства. После выполнения действий, описанных в этой статье, ваш код может отличаться от приведенного ниже. Это зависит от шаблона проекта.

  package com.example.mapsetup;

  import androidx.appcompat.app.AppCompatActivity;

  import android.os.Bundle;

  import com.google.android.gms.maps.GoogleMap;
  import com.google.android.gms.maps.OnMapReadyCallback;
  import com.google.android.gms.maps.SupportMapFragment;
  import com.google.android.gms.maps.model.LatLng;
  import com.google.android.gms.maps.model.MarkerOptions;

  // Implement OnMapReadyCallback.
  public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          // Set the layout file as the content view.
          setContentView(R.layout.activity_main);

          // Get a handle to the fragment and register the callback.
          SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                  .findFragmentById(R.id.map);
          mapFragment.getMapAsync(this);

      }

      // Get a handle to the GoogleMap object and display marker.
      @Override
      public void onMapReady(GoogleMap googleMap) {
          googleMap.addMarker(new MarkerOptions()
                  .position(new LatLng(0, 0))
                  .title("Marker"));
      }
  }

Добавление карты

В этом разделе рассказывается, как добавить базовую карту, используя фрагмент как контейнер. Вы также можете выбрать вариант с представлением. Пример: RawMapViewDemoActivity на GitHub.

Основные действия:

  1. Чтобы использовать SDK, получите ключ API и добавьте необходимые фреймворки. Следуйте указаниям в приведенных ниже статьях.

    1. Настройка проекта Google Cloud

    2. Использование ключей API

    3. Настройка проекта Android Studio

  2. Добавьте объект SupportMapFragment в объект activity, который отвечает за обработку карты. Фрагмент можно добавить статически или динамически.

  3. Реализуйте интерфейс OnMapReadyCallback.

  4. Задайте файл макета в качестве представления контента.

  5. Если вы добавили фрагмент статически, получите дескриптор фрагмента.

  6. Зарегистрируйте обратный вызов.

  7. Получите дескриптор объекта GoogleMap.

Добавьте объект SupportMapFragment

Объект SupportMapFragment можно добавить в приложение статически или динамически. Статически это сделать проще. Если же вы добавите фрагмент динамически, то сможете выполнять с ним дополнительные действия, например удалять или заменять код во время выполнения.

Как добавить фрагмент статически

В файле макета для объекта activity, который отвечает за обработку карты, выполните следующие действия:

  1. Добавьте элемент fragment.
  2. Добавьте объявление пространства имен xmlns:map="http://schemas.android.com/apk/res-auto". Это позволит использовать собственные атрибуты XML для maps.
  3. В элементе fragment задайте для атрибута android:name значение com.google.android.gms.maps.SupportMapFragment.
  4. В элементе fragment добавьте атрибут android:id и задайте для него значение, соответствующее идентификатору ресурса R.id.map (@+id/map).

Полный пример кода для файла макета, где есть элемент fragment:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Как добавить фрагмент динамически

Выполните следующие действия для объекта activity:

  1. Создайте экземпляр SupportMapFragment.
  2. Выполните транзакцию, которая добавит фрагмент в объект activity. Дополнительную информацию см. в статье Транзакции для работы с фрагментами.

Например:

Kotlin



val mapFragment = SupportMapFragment.newInstance()
supportFragmentManager
    .beginTransaction()
    .add(R.id.my_container, mapFragment)
    .commit()

      

Java


SupportMapFragment mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.my_container, mapFragment)
    .commit();

      

Реализуйте интерфейс OnMapReadyCallback

Измените объявление объекта activity, как показано ниже.

Kotlin



class MainActivity : AppCompatActivity(), OnMapReadyCallback {

    // ...
}

      

Java


class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    // ...
}

      

Задайте представление контента

В методе onCreate вашего объекта activity вызовите метод setContentView и задайте файл макета в качестве представления контента.

Допустим, файл макета называется main.xml. В таком случае код будет выглядеть следующим образом:

Kotlin



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
}

      

Java


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

      

Получите дескриптор фрагмента и зарегистрируйте обратный вызов

  1. Чтобы получить дескриптор фрагмента, вызовите метод FragmentManager.findFragmentById и передайте ему идентификатор ресурса для фрагмента, который используется в файле макета. Если вы добавили фрагмент динамически, пропустите этот этап, поскольку вы уже получили дескриптор.

  2. Вызовите метод getMapAsync, чтобы задать обратный вызов для фрагмента.

Если вы добавили фрагмент статически, используйте следующий код:

Kotlin



val mapFragment = supportFragmentManager
    .findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)

      

Java


SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

      

Получите дескриптор объекта GoogleMap

Используйте метод обратного вызова onMapReady, чтобы получить дескриптор объекта GoogleMap. Обратный вызов выполняется, когда карта готова получить данные, введенные пользователем. Он предоставляет непустой экземпляр класса GoogleMap, который вы можете использовать для обновления карты.

В примере ниже обратный вызов onMapReady получает дескриптор объекта GoogleMap, а затем на карту добавляется маркер.

Kotlin



override fun onMapReady(googleMap: GoogleMap) {
    googleMap.addMarker(
        MarkerOptions()
            .position(LatLng(0.0, 0.0))
            .title("Marker")
    )
}

      

Java


@Override
public void onMapReady(GoogleMap googleMap) {
    googleMap.addMarker(new MarkerOptions()
        .position(new LatLng(0, 0))
        .title("Marker"));
}

      

Скриншот с картой, центрированной по координатам острова Ноль, и маркером.

После сборки и запуска приложения в нем будет показана карта с маркером, центрированная по координатам острова Ноль (ноль градусов широты и ноль градусов долготы).

Чтобы ознакомиться с полным кодом объекта activity, нажмите кнопку ниже.

Посмотреть код


Что дальше

После выполнения инструкций из этой статьи вы можете переходить к настройке карты.