W tym artykule opisujemy, jak dodać podstawową mapę do aplikacji na Androida, gdy już skonfigurujesz projekt pod kątem korzystania z pakietu Maps SDK na Androida. Po dodaniu mapy możesz zmienić jej typ i funkcje.
Przegląd
Pakiet SDK Map na Androida oferuje kilka klas, za pomocą których Twoja aplikacja może zarządzać cyklem życia, funkcjami i danymi na mapie. Klasy obsługują interakcje użytkownika na podstawie modelu interfejsu Androida, na przykład określają początkowy stan mapy i reagują na wprowadzone przez użytkownika gesty w czasie działania.
Główny interfejs i klasy do obsługi map:
GoogleMap
– punkt wejścia do zarządzania bazowymi funkcjami mapy i danymi. 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 służący 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.
- Pobieram elementy mapy.
- Wyświetlanie kafelków na ekranie urządzenia.
- Wyświetlam różne elementy sterujące, takie jak przesuwanie i powiększanie.
- Reagowanie na gesty przesunięcia i powiększenia przez przesuwanie mapy oraz powiększanie i pomniejszanie.
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 kontenera pochodzą z fragmentu lub widoku Androida, dlatego udostępniają mapie funkcje zarządzania cyklem życia i interfejsy klas podstawowych Androida.
Klasa SupportMapFragment
jest nowocześniejszym i bardziej powszechnym kontenerem dla obiektu GoogleMap
.
Wyświetl kod
Następujący kod pochodzi z pełnej aktywności Java w tym temacie podczas statycznego dodawania fragmentu. Projekt na Androida został utworzony na podstawie szablonu Pusty projekt, a następnie zaktualizowany na podstawie przewodnika 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ć podstawową mapę, używając fragmentu jako kontenera mapy, ale możesz użyć widoku. Przykład znajdziesz w narzędziu RawMapViewDemoActivity na GitHubie.
Podstawowe czynności:
Aby uzyskać pakiet SDK, uzyskać klucz interfejsu API i dodać wymagane platformy, wykonaj te czynności:
Dodaj do obiektu obiekt
SupportMapFragment
, który 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, uzyskaj jego obsługę.
Zarejestruj wywołanie zwrotne.
Uchwyć obiekt
GoogleMap
.
Dodawanie obiektu SupportMapFragment
Obiekt SupportMapFragment
możesz dodać do aplikacji statycznie lub dynamicznie.
Najprostszym sposobem jest dodanie jej statycznie. Jeśli dodasz fragment dynamicznie, możesz wykonywać na nim dodatkowe działania, np. usuwać go i zastępować w czasie działania.
Do dodania statycznego fragmentu
W pliku układu działania, które będzie zajmować 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 na przykład kompletny 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 ćwiczenia:
- utworzyć instancję
SupportMapFragment
, - Zatwierdź transakcję, która dodaje fragment do aktywności. Więcej informacji znajdziesz w sekcji Transakcje.
Na 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ę dotyczącą aktywności w ten sposób:
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback { // ... }
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback { // ... }
Ustawianie widoku treści
W metodzie onCreate
swojej 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) }
Uzyskaj nick dla fragmentu i zarejestruj wywołanie zwrotne
Aby uzyskać nick dla fragmentu, wywołaj metodę
FragmentManager.findFragmentById
i przekaż mu identyfikator zasobu fragmentu w pliku układu. Jeśli fragment został dynamicznie dodany, pomiń ten krok, ponieważ masz już pobrany nick.Wywołaj metodę
getMapAsync
, aby ustawić wywołanie zwrotne dla fragmentu.
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)
Pobranie obiektu GoogleMap
Aby uzyskać pomoc do obiektu GoogleMap
, użyj wywołania zwrotnego onMapReady
. Wywołanie zwrotne jest wywoływane, gdy mapa jest gotowa do otrzymania danych wejściowych użytkownika. Udostępnia ono niepustą instancję klasy GoogleMap
, której można używać do aktualizowania mapy.
W tym przykładzie wywołanie zwrotne onMapReady
pobiera nick do obiektu GoogleMap
, a potem do mapy dodawany jest 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 utworzysz i uruchomisz aplikację, pojawi się na niej mapa ze znacznikiem na wyspie Null (szerokość geograficzna zero i zerowa długość geograficzna).
Wyświetl kod dla całej aktywności:
Co dalej
Po wykonaniu tych czynności możesz skonfigurować ustawienia mapy.