В этой статье рассказывается, как добавить базовую карту в приложение 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. Дополнительную информацию см. в статье Транзакции для работы с фрагментами.
Например:
val mapFragment = SupportMapFragment.newInstance()
supportFragmentManager
.beginTransaction()
.add(R.id.my_container, mapFragment)
.commit()
SupportMapFragment mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.my_container, mapFragment)
.commit();
Реализуйте интерфейс OnMapReadyCallback
Измените объявление объекта activity, как показано ниже.
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
// ...
}
class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
// ...
}
Задайте представление контента
В методе onCreate
вашего объекта activity вызовите метод setContentView
и задайте файл макета в качестве представления контента.
Допустим, файл макета называется main.xml
. В таком случае код будет выглядеть следующим образом:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Получите дескриптор фрагмента и зарегистрируйте обратный вызов
Чтобы получить дескриптор фрагмента, вызовите метод
FragmentManager.findFragmentById
и передайте ему идентификатор ресурса для фрагмента, который используется в файле макета. Если вы добавили фрагмент динамически, пропустите этот этап, поскольку вы уже получили дескриптор.Вызовите метод
getMapAsync
, чтобы задать обратный вызов для фрагмента.
Если вы добавили фрагмент статически, используйте следующий код:
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Получите дескриптор объекта GoogleMap
Используйте метод обратного вызова onMapReady
, чтобы получить дескриптор объекта GoogleMap
. Обратный вызов выполняется, когда карта готова получить данные, введенные пользователем. Он предоставляет непустой экземпляр класса GoogleMap
, который вы можете использовать для обновления карты.
В примере ниже обратный вызов onMapReady
получает дескриптор объекта GoogleMap
, а затем на карту добавляется маркер.
override fun onMapReady(googleMap: GoogleMap) {
googleMap.addMarker(
MarkerOptions()
.position(LatLng(0.0, 0.0))
.title("Marker")
)
}
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
После сборки и запуска приложения в нем будет показана карта с маркером, центрированная по координатам острова Ноль (ноль градусов широты и ноль градусов долготы).
Чтобы ознакомиться с полным кодом объекта activity, нажмите кнопку ниже.
Что дальше
После выполнения инструкций из этой статьи вы можете переходить к настройке карты.