Как добавить карту

В этой статье рассказывается, как добавить базовую карту в приложение 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. Подготовка. Убедитесь, что вы выполнили действия, описанные в руководстве по конфигурации проекта, чтобы обеспечить поддержку Maps SDK для Android.

  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. Подробнее…

Пример:

Java

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

Kotlin

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

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

Обновите объявление объекта activity как показано ниже:

Java

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

Kotlin

class MainActivity : AppCompatActivity(), OnMapReadyCallback {

    // ...
}
      

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

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

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

Java

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

Kotlin

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

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

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

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

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

Java

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

Kotlin

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

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

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

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

Java

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

Kotlin

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


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

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

Ознакомьтесь с полным кодом объекта activity:

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


Дальнейшие действия

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