Karte hinzufügen

Hier erfährst du, wie du eine Basiskarte in eine Android-App einbindest, nachdem du das Projekt für das Maps SDK for Android konfiguriert hast. Sobald die Karte erfolgreich eingebunden wurde, können Kartentyp und -merkmale geändert werden.

Übersicht

Das Maps SDK for Android enthält mehrere Klassen, mit denen über die App der Lebenszyklus, die Funktionen und die Daten einer Karte verwaltet werden können. Die Klassen ermöglichen Nutzerinteraktionen basierend auf dem Android-UI-Modell. So kann die App beispielsweise den Anfangszustand der Karte festlegen oder während der Laufzeit auf Gesten reagieren.

Die wichtigsten Schnittstellen und Klassen für die Verarbeitung von Karten sind:

  • GoogleMap – der Einstiegspunkt zum Verwalten der zugrunde liegenden Kartenmerkmale und -daten. Die App kann erst auf ein GoogleMap-Objekt zugreifen, nachdem es aus einem SupportMapFragment- oder einem MapView-Objekt abgerufen wurde.

  • SupportMapFragment – ein Fragment, mit dem der Lebenszyklus eines GoogleMap-Objekts verwaltet wird.

  • MapView – eine Ansicht, mit der der Lebenszyklus eines GoogleMap-Objekts verwaltet wird.

  • OnMapReadyCallback – eine Callback-Oberfläche, über die Ereignisse und Nutzerinteraktionen für das GoogleMap-Objekt verarbeitet werden.

Von einem GoogleMap-Objekt werden folgende Vorgänge automatisch ausgeführt:

  • Verbindung zum Google Maps-Dienst herstellen
  • Kartenkacheln herunterladen
  • Kacheln auf dem Gerätebildschirm anzeigen
  • Verschiedene Steuerelemente z. B. zum Schwenken und Zoomen anzeigen
  • Auf Gesten zum Schwenken und Zoomen reagieren, indem die Karte verschoben oder vergrößert bzw. verkleinert wird

Wenn du ein GoogleMap-Objekt in deiner App einsetzen möchtest, musst du entweder ein SupportMapFragment- oder ein MapView-Objekt als Containerobjekt für die Karte verwenden, aus dem das GoogleMap-Objekt dann abgerufen werden kann. Die Containerklassen werden entweder aus einem Android-Fragment oder einer Android-Ansicht abgeleitet. Sie stellen daher für die Karte die Funktionen für die UI sowie für die Lebenszyklusverwaltung ihrer Android-Basisklassen zur Verfügung. Die SupportMapFragment-Klasse ist der modernere und meist verwendete Container für ein GoogleMap-Objekt.

Code ansehen

Der folgende Code stammt aus der vollständigen Java-Aktivität, die in diesem Artikel verwendet wird, um ein statisches Fragment hinzuzufügen. Das Android-Projekt wurde anhand der leeren Projektvorlage erstellt und dann gemäß des Leitfadens zur Konfiguration bestehender Projekte bearbeitet. Nachdem du die hier aufgeführten Schritte ausgeführt hast, kann dein Code je nach Projektvorlage variieren.

  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"));
      }
  }

Karte hinzufügen

In diesem Abschnitt wird beschrieben, wie du eine Basiskarte einbindest. Als Kartencontainer dient hier das Fragment, aber du kannst alternativ auch eine Ansicht verwenden. Ein Beispiel findest du auf GitHub unter RawMapViewDemoActivity (in englischer Sprache).

Grundlegende Schritte:

  1. Hinweis: Stelle zuerst sicher, dass die Schritte im Leitfaden zur Konfiguration bestehender Projekte ausgeführt wurden, damit das Projekt mit dem Maps SDK for Android kompatibel ist.

  2. Füge der Aktivität, mit der die Karte verarbeitet wird, ein SupportMapFragment-Objekt hinzu. Das Fragment kann statisch oder dynamisch eingebunden werden.

  3. Implementiere die OnMapReadyCallback-Schnittstelle.

  4. Lege die Layoutdatei als Inhaltsansicht fest.

  5. Wenn du das Fragment statisch hinzugefügt hast, rufe dafür einen Handle ab.

  6. Registriere den Callback.

  7. Rufe einen Handle für das GoogleMap-Objekt ab.

SupportMapFragment-Objekt hinzufügen

Ein SupportMapFragment-Objekt kann statisch oder dynamisch in die App eingebunden werden. Die statische Variante ist am einfachsten. Wenn du das Fragment dynamisch hinzufügst, kannst du weitere Aktionen dafür durchführen. So kann es beispielsweise während der Laufzeit entfernt oder ersetzt werden.

Fragment statisch hinzufügen

Führe in der Layoutdatei der Aktivität, mit der die Karte verarbeitet wird, folgende Schritte aus:

  1. Füge ein fragment-Element hinzu.
  2. Gib die folgende Namensdeklaration an: xmlns:map="http://schemas.android.com/apk/res-auto". Dadurch können benutzerdefinierte XML-Attribute von maps verwendet werden.
  3. Lege im fragment-Element das android:name-Attribut auf com.google.android.gms.maps.SupportMapFragment fest.
  4. Füge im fragment-Element das android:id-Attribut hinzu und lege es auf die Ressourcen-ID von R.id.map (@+id/map) fest.

Hier ein Beispiel einer vollständigen Layoutdatei mit einem fragment-Element:

<?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"/>

Fragment dynamisch hinzufügen

Führe in der Aktivität folgende Schritte aus:

  1. Erstelle eine SupportMapFragment-Instanz.
  2. Führe den Commit einer Transaktion durch, mit der das Fragment zur Aktivität hinzugefügt wird. Weitere Informationen findest du im Artikel zu Fragment-Transaktionen auf der Google Developers-Website (in englischer Sprache).

Beispiel:

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()
      

OnMapReadyCallback-Schnittstelle implementieren

Ändere die Deklaration der Aktivität folgendermaßen:

Java

class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    // ...
}
      

Kotlin

class MainActivity : AppCompatActivity(), OnMapReadyCallback {

    // ...
}
      

Inhaltsansicht festlegen

Rufe in der Methode onCreate der Aktivität die setContentView-Methode auf und lege die Layoutdatei als Inhaltsansicht fest.

In diesem Beispiel wird main.xml als Name der Layoutdatei angenommen:

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)
}
      

Handle für Fragment abrufen und Callback registrieren

  1. Erstelle ein Handle zum Fragment, indem du die FragmentManager.findFragmentById-Methode aufrufst und die Ressourcen-ID des Fragments in der Layoutdatei daran übergibst. Wenn du das Fragment dynamisch hinzugefügt hast, überspringe diesen Schritt, da du den Handle bereits abgerufen hast.

  2. Rufe die getMapAsync-Methode auf, um den Callback für das Fragment festzulegen.

In diesem Beispiel wird angenommen, dass das Fragment statisch hinzugefügt wurde:

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)
      

Handle für das GoogleMap-Objekt abrufen

Verwende die Callback-Methode onMapReady, um einen Handle für das GoogleMap-Objekt zu erhalten. Der Callback wird ausgelöst, sobald Nutzereingaben auf der Karte ausgeführt werden können. Hiermit wird eine Nicht-Null-Instanz der GoogleMap-Klasse bereitgestellt, mit der sich die Karte aktualisieren lässt.

In diesem Beispiel ruft der Callback onMapReady einen Handle zum GoogleMap-Objekt ab. Daraufhin wird der Karte eine Markierung hinzugefügt:

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")
    )
}
      


Screenshot mit Karte und Markierung auf Null Island

Wenn die App korrekt programmiert und ausgeführt wurde, ist dort nun eine Karte mit einer Markierung auf Null Island (Punkt auf der Erde mit Längen- und Breitengrad 0°N, 0°E) zu sehen.

Code der vollständigen Aktivität ansehen:

Vollständige Aktivität ansehen


Nächste Schritte

Ist dieser Vorgang abgeschlossen, kannst du die Karteneinstellungen konfigurieren.