W tym artykule opisujemy, jak dodać mapę podstawową do aplikacji na Androida po skonfigurowaniu projektu pod kątem użycia pakietu SDK Map Google na Androida. Po dodaniu mapy możesz zmienić typ mapy i jej funkcje.
Przegląd
Maps SDK na Androida udostępnia kilka klas, których aplikacja może używać do zarządzania cyklem życia, funkcjonalnością i danymi mapy. Klasy obsługują interakcje użytkowników na podstawie modelu interfejsu Androida, np. ustawianie początkowego stanu mapy i reagowanie na gesty wprowadzane przez użytkownika w czasie działania.
Główny interfejs i klasy do obsługi map:
GoogleMap
– punkt wejścia do zarządzania bazowymi funkcjami i danymi mapy. Aplikacja ma 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 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.
- Reagowanie na gesty przesuwania i powiększania przez przesuwanie mapy oraz powiększanie i pomniejszanie.
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. Klasy kontenerów wywodzą się z fragmentu lub widoku Androida, dlatego udostępniają mapie funkcje zarządzania cyklem życia i możliwości interfejsu ich klas podstawowych Androida.
Klasa SupportMapFragment
to bardziej nowoczesny i popularny kontener dla obiektu GoogleMap
.
Wyświetl kod
Poniższy kod pochodzi z pełnej aktywności Java używanej w tym temacie przy statycznym dodawaniu fragmentu. Projekt na Androida został utworzony na podstawie pustego szablonu projektu, a następnie zaktualizowano na podstawie przewodnika 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 opisujemy, jak dodać mapę podstawową, używając fragmentu jako kontenera mapy. Możesz jednak użyć widoku. Przykład znajdziesz w sekcji RawMapViewDemoActivity na GitHubie.
Podstawowe kroki:
Aby pobrać pakiet SDK, uzyskaj klucz interfejsu API i dodaj wymagane platformy, wykonaj te czynności:
Dodaj obiekt
SupportMapFragment
do działania, które będzie obsługiwać mapę. Fragment możesz dodać statycznie lub dynamicznie.Wdróż interfejs
OnMapReadyCallback
.Ustaw plik układu jako widok treści.
Jeśli fragment został dodany statycznie, uzyskaj dla niego uchwyt.
Zarejestruj wywołanie zwrotne.
Pobierz nick obiektu
GoogleMap
.
Dodaj obiekt SupportMapFragment
Obiekt SupportMapFragment
możesz dodać do aplikacji statycznie lub dynamicznie.
Najprostszym sposobem jest dodanie jej statycznie. Jeśli dodasz fragment dynamicznie, możesz wykonać na nim dodatkowe działania, takie jak usunięcie go i zastąpienie w czasie działania.
Aby dodać fragment statycznie
W pliku układu działania, które ma obsługiwać mapę:
- Dodaj element
fragment
. - Dodaj deklarację nazwy
xmlns:map="http://schemas.android.com/apk/res-auto"
. Umożliwia to korzystanie z niestandardowych atrybutów XMLmaps
. - 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 całego 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 dodać fragment dynamicznie
W aktywności:
- Utwórz instancję
SupportMapFragment
. - Zatwierdź transakcję, która dodaje fragment do aktywności. Więcej informacji znajdziesz w sekcji Fragmenty transakcji.
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 nazywa się 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); }
Pobierz uchwyt dla fragmentu i zarejestruj wywołanie zwrotne
Aby uzyskać uchwyt do fragmentu, wywołaj metodę
FragmentManager.findFragmentById
i przekaż jej identyfikator zasobu fragmentu w pliku układu. Jeśli fragment został dodany dynamicznie, pomiń ten krok, ponieważ nick został już pobrany.Wywołaj metodę
getMapAsync
, aby ustawić wywołanie zwrotne dla fragmentu.
Jeśli np. 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);
Pobieranie nicka obiektu GoogleMap
Użyj metody wywołania zwrotnego onMapReady
, aby uzyskać uchwyt do obiektu GoogleMap
. Wywołanie zwrotne jest aktywowane, gdy mapa jest gotowa do odbioru danych wejściowych użytkownika. Udostępnia niepustą instancję klasy GoogleMap
, której można używać do aktualizowania mapy.
W tym przykładzie wywołanie zwrotne onMapReady
pobiera uchwyt do obiektu GoogleMap
, a następnie do mapy dodawany jest 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 skompilujesz i uruchomisz aplikację, wyświetli się mapa ze znacznikiem na Wyspie Null (zero stopni szerokości geograficznej i zero stopni długości geograficznej).
Wyświetl kod dla całego działania:
Co dalej
Po wykonaniu tych czynności możesz skonfigurować ustawienia mapy.