В этой статье рассказывается, как добавить базовую карту в приложение 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.
Основные действия:
Чтобы использовать SDK, получите ключ API и добавьте необходимые фреймворки. Следуйте указаниям в приведенных ниже статьях.
Добавьте объект
SupportMapFragmentв объект activity, который отвечает за обработку карты. Фрагмент можно добавить статически или динамически.Реализуйте интерфейс
OnMapReadyCallback.Задайте файл макета в качестве представления контента.
Если вы добавили фрагмент статически, получите дескриптор фрагмента.
Зарегистрируйте обратный вызов.
Получите дескриптор объекта
GoogleMap.
Добавьте объект SupportMapFragment
Объект SupportMapFragment можно добавить в приложение статически или динамически.
Статически это сделать проще. Если же вы добавите фрагмент динамически, то сможете выполнять с ним дополнительные действия, например удалять или заменять код во время выполнения.
Как добавить фрагмент статически
В файле макета для объекта activity, который отвечает за обработку карты, выполните следующие действия:
- Добавьте элемент
fragment. - Добавьте объявление пространства имен
xmlns:map="http://schemas.android.com/apk/res-auto". Это позволит использовать собственные атрибуты XML дляmaps. - В элементе
fragmentзадайте для атрибутаandroid:nameзначениеcom.google.android.gms.maps.SupportMapFragment. - В элементе
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:
- Создайте экземпляр
SupportMapFragment. - Выполните транзакцию, которая добавит фрагмент в объект 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);
}
Получите дескриптор фрагмента и зарегистрируйте обратный вызов
Чтобы получить дескриптор фрагмента, вызовите метод
FragmentManager.findFragmentByIdи передайте ему идентификатор ресурса для фрагмента, который используется в файле макета. Если вы добавили фрагмент динамически, пропустите этот этап, поскольку вы уже получили дескриптор.Вызовите метод
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, нажмите кнопку ниже.
Что дальше
После выполнения инструкций из этой статьи вы можете переходить к настройке карты.