В этой статье рассказывается, как добавить базовую карту в приложение 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, нажмите кнопку ниже.
Что дальше
После выполнения инструкций из этой статьи вы можете переходить к настройке карты.