Ten temat opisuje, jak dodać podstawową mapę do aplikacji na Androida po skonfigurowaniu projektu pod kątem użycia Maps SDK na Androida. Po dodaniu mapy możesz zmienić typ i funkcje mapy.
Omówienie
Pakiet SDK Map na Androida oferuje 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, takie jak ustawianie początkowego stanu mapy i reagowanie na gesty użytkownika w czasie działania.
Główny interfejs i klasy do obsługi map:
GoogleMap
– punkt wejścia zarządzania bazowymi funkcjami mapy i danymi. Twoja aplikacja ma dostęp do obiektuGoogleMap
dopiero po pobraniu z obiektuSupportMapFragment
lubMapView
.SupportMapFragment
– fragment do zarządzania cyklem życia obiektuGoogleMap
.OnMapReadyCallback
– interfejs wywołania zwrotnego, który obsługuje zdarzenia i interakcję użytkownika z obiektemGoogleMap
.
Obiekt GoogleMap
automatycznie wykonuje te operacje:
- Łączę z usługą Mapy Google.
- Pobieranie kafelków mapy.
- Wyświetlanie kafelków na ekranie urządzenia.
- wyświetlanie różnych elementów sterujących, takich jak przesuwanie i powiększanie;
- Reagowanie na gesty przesunięcia i powiększenia przez przesunięcie mapy oraz jej powiększenie lub pomniejszenie.
Aby użyć obiektu GoogleMap
w aplikacji, musisz użyć obiektu SupportMapFragment
lub MapView
jako obiektu kontenera na mapie, a następnie pobrać obiekt GoogleMap
z kontenera. Klasy kontenerów pochodzą z fragmentu lub widoku Androida, dlatego umożliwiają Mapom zarządzanie cyklem życia oraz funkcjami interfejsu użytkownika ich klas podstawowych Androida.
Klasa SupportMapFragment
jest nowocześniejszym i bardziej typowym kontenerem dla obiektu GoogleMap
.
Wyświetl kod
Ten kod pochodzi z pełnej aktywności Java używanej w tym temacie podczas statycznego dodawania fragmentu. Projekt na Androida został utworzony na podstawie pustego szablonu, a potem zaktualizowany przy użyciu przewodnika po konfiguracji projektu. Po wykonaniu czynności opisanych w tym temacie 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ć podstawową mapę, używając fragmentu jako kontenera mapy, ale możesz zamiast tego użyć widoku. Przykład znajdziesz na stronie RawMapViewDemoActivity na GitHubie.
Podstawowe czynności:
Aby uzyskać pakiet SDK, uzyskaj klucz interfejsu API i dodaj wymagane platformy, wykonaj te czynności:
Dodaj obiekt
SupportMapFragment
do aktywności, która będzie obsługiwać mapę. Fragment możesz dodać statycznie lub dynamicznie.Zaimplementuj interfejs
OnMapReadyCallback
.Ustaw plik układu jako widok treści.
Jeśli fragment został dodany statycznie, utwórz jego obsługę.
Zarejestruj wywołanie zwrotne.
Uchwyt do obiektu
GoogleMap
.
Dodaj obiekt SupportMapFragment
Obiekt SupportMapFragment
możesz dodać do aplikacji statycznie lub dynamicznie.
Najprostszym sposobem jest dodanie go statycznie. Jeśli dodasz fragment dynamicznie, możesz wykonywać na nim dodatkowe czynności, takie jak usunięcie i zastąpienie go w czasie działania.
Statyczne dodawanie fragmentu
W pliku układu aktywności obsługującej 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 dla atrybutuandroid:name
wartośćcom.google.android.gms.maps.SupportMapFragment
. - W elemencie
fragment
dodaj atrybutandroid:id
i ustaw go na wartość R.id.mapidentyfikator zasobu (@+id/map
).
Oto na przykład pełny plik układu zawierający 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"/>
Dynamiczne dodawanie fragmentu
W ramach tego ćwiczenia:
- utworzyć instancję
SupportMapFragment
; - Zatwierdź transakcję, która dodaje fragment do aktywności. Więcej informacji znajdziesz w sekcji Transakcje.
Przykład:
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()
Wdróż interfejs OnMapReadyCallback
Zaktualizuj deklarację aktywności:
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback { // ... }
Kotlin
class MainActivity : AppCompatActivity(), 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
:
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) }
Uchwyć fragment i zarejestruj wywołanie zwrotne
Aby uzyskać dostęp do fragmentu, wywołaj metodę
FragmentManager.findFragmentById
i przekaż mu identyfikator zasobu tego 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 we fragmencie.
Jeśli fragment został dodany statycznie:
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)
Uchwyt do obiektu GoogleMap
Aby uzyskać pomoc do obiektu GoogleMap
, użyj metody wywołania zwrotnego onMapReady
. Wywołanie zwrotne jest wywoływane, gdy mapa jest gotowa do otrzymania danych wejściowych użytkownika. Zawiera niepuste wystąpienie klasy GoogleMap
, której można użyć do zaktualizowania mapy.
W tym przykładzie wywołanie zwrotne onMapReady
pobiera nick do obiektu GoogleMap
, a potem dodaje do mapy znacznik:
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") ) }
Gdy stworzysz i uruchomisz aplikację, pojawi się mapa ze znacznikiem na Wyspie Null (szerokość geograficzna zero stopni i długość geograficzna).
Wyświetl kod całej aktywności:
Co dalej?
Po wykonaniu tych czynności możesz skonfigurować ustawienia mapy.