W tym temacie opisujemy, jak dodać podstawową mapę do aplikacji na Androida po skonfigurowaniu projektu pod kątem korzystania z pakietu SDK Map Google na Androida. Po dodaniu mapy możesz zmienić typ i funkcje mapy.
Przegląd
Pakiet SDK Map Google na Androida zawiera kilka klas, których aplikacja może używać do zarządzania cyklem życia, funkcjami i danymi mapy. Klasy obsługują interakcje użytkowników na podstawie modelu interfejsu Androida, np. ustawianie początkowego stanu mapy czy reagowanie na gesty wprowadzone przez użytkownika w czasie działania.
Główny interfejs i klasy do obsługi map:
GoogleMap
– punkt wejścia do zarządzania podstawowymi funkcjami mapy i danymi. Twoja aplikacja może uzyskać dostęp do obiektuGoogleMap
dopiero po pobraniu go z obiektuSupportMapFragment
lubMapView
.SupportMapFragment
– fragment do zarządzania cyklem życia obiektuGoogleMap
.MapView
– widok do zarządzania cyklem życia obiektuGoogleMap
.OnMapReadyCallback
– interfejs wywołania zwrotnego, który obsługuje zdarzenia i interakcje użytkownika związane z obiektemGoogleMap
.
Obiekt GoogleMap
automatycznie wykonuje te operacje:
- Łączę z usługą Mapy Google.
- Pobieram fragmenty mapy.
- Wyświetlam kafelki na ekranie urządzenia.
- Wyświetlanie różnych elementów sterujących, takich jak przesuwanie i powiększanie.
- Reakcja na gesty przesunięcia i powiększenia polegająca na przesuwaniu mapy oraz powiększaniu i pomniejszaniu.
Aby użyć w aplikacji obiektu GoogleMap
, musisz użyć obiektu SupportMapFragment
lub MapView
jako obiektu kontenera mapy, a następnie pobrać obiekt GoogleMap
z kontenera. Ponieważ klasy kontenerów wywodzą się z fragmentu lub widoku Androida, udostępniają mapie możliwości zarządzania cyklem życia i funkcje interfejsu użytkownika dostępne w klasach podstawowych Androida.
Klasa SupportMapFragment
jest nowoczesnym i najczęściej używanym kontenerem obiektu GoogleMap
.
Wyświetl kod
Poniższy kod pochodzi z pełnej aktywności w Javie używanej w tym temacie podczas statycznego dodawania fragmentu. Projekt na Androida został utworzony na podstawie pustego szablonu projektu, a następnie zaktualizowany zgodnie z przewodnikiem po konfiguracji projektu. Po wykonaniu czynności opisanych w tym temacie Twój kod może się różnić w zależności od szablonu projektu.
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")); } }
Dodawanie mapy
W tej sekcji dowiesz się, jak dodać mapę podstawową przy użyciu fragmentu jako kontenera mapy. Możesz jednak użyć widoku. Przykład znajdziesz w pliku RawMapViewDemoActivity w GitHubie.
Podstawowe kroki:
Aby pobrać pakiet SDK, uzyskać klucz interfejsu API i dodać wymagane platformy, wykonaj te czynności:
Dodaj obiekt
SupportMapFragment
do działania, które będzie obsługiwać mapę. Fragment można dodawać statycznie lub dynamicznie.Wdróż interfejs
OnMapReadyCallback
.Ustaw plik układu jako widok treści.
Jeśli fragment został dodany statycznie, uzyskaj do niego uchwyt.
Zarejestruj wywołanie zwrotne.
Pobierz uchwyt do obiektu
GoogleMap
.
Dodaj obiekt SupportMapFragment
Obiekt SupportMapFragment
możesz dodawać do aplikacji statycznie lub dynamicznie.
Najprostszym sposobem jest dodanie jej w sposób statyczny. Jeśli dodasz fragment dynamicznie, możesz wykonać na nim dodatkowe działania, np. usunąć go i zastąpić go w czasie działania.
Aby statycznie dodać fragment
W pliku układu aktywności, która obsługuje mapę:
- Dodaj element
fragment
. - Dodaj deklarację nazwy
xmlns:map="http://schemas.android.com/apk/res-auto"
. Umożliwia to korzystanie zmaps
niestandardowych atrybutów XML. - W elemencie
fragment
ustaw atrybutandroid:name
nacom.google.android.gms.maps.SupportMapFragment
. - W elemencie
fragment
dodaj atrybutandroid:id
i ustaw go na identyfikator zasobu R.id.map (@+id/map
).
Oto przykład pełnego pliku układu zawierającego element 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"/>
Aby dynamicznie dodawać fragment
W ramach ćwiczenia:
- Utwórz instancję
SupportMapFragment
. - Zatwierdź transakcję, która doda fragment do działania. Więcej informacji znajdziesz w artykule o transakcjach z fragmentem kodu.
Na przykład:
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();
Wdróż interfejs OnMapReadyCallback
Zaktualizuj deklarację dotyczącą aktywności w ten sposób:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback { // ... }
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback { // ... }
Ustawianie widoku treści
W metodzie onCreate
aktywności wywołaj metodę setContentView
i ustaw plik układu jako widok treści.
Jeśli na przykład plik układu ma nazwę 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); }
Uzyskanie nicka dla fragmentu i zarejestrowanie wywołania zwrotnego
Aby uzyskać uchwyt dla fragmentu, wywołaj metodę
FragmentManager.findFragmentById
i przekaż do niej identyfikator zasobu fragmentu w pliku układu. Jeśli fragment został dodany dynamicznie, pomiń ten krok, ponieważ uchwyt został już pobrany.Wywołaj metodę
getMapAsync
, aby ustawić wywołanie zwrotne dla fragmentu.
Jeśli na przykład dodasz fragment statycznie:
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);
Pobierz nick do obiektu GoogleMap
Aby uzyskać uchwyt do obiektu GoogleMap
, użyj metody wywołania zwrotnego onMapReady
. Wywołanie zwrotne jest aktywowane, gdy mapa jest gotowa do przyjęcia danych wejściowych użytkownika. Udostępnia niepustą instancję klasy GoogleMap
, której możesz użyć do aktualizowania mapy.
W tym przykładzie wywołanie zwrotne onMapReady
pobiera uchwyt do obiektu GoogleMap
, a następnie jest dodawany do mapy znacznik:
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")); }
Gdy stworzysz i uruchomisz aplikację, wyświetli się mapa ze znacznikiem na Wyspie Null (szerokości geograficznej zerowej i zerowej długości geograficznej).
Wyświetl kod całego modułu:
Co dalej?
Po wykonaniu tych czynności możesz skonfigurować ustawienia mapy.