15 Jahre Google Maps Platform – Neuigkeiten und Ankündigungen

Infofenster

In einem Infofenster werden Texte oder Bilder in einem Pop-up-Fenster über der Karte angezeigt. Infofenster sind immer mit einer Markierung verknüpft. Standardmäßig werden sie eingeblendet, wenn der Nutzer auf die Markierung tippt.

Codebeispiele

Das ApiDemos-Repository auf GitHub enthält ein Beispiel, das alle Funktionen des Infofensters zeigt:

Einführung

In einem Infofenster kannst du Informationen für den Nutzer anzeigen, wenn er auf eine Markierung tippt. Es wird immer nur ein Infofenster eingeblendet. Wenn ein Nutzer auf eine Markierung klickt, wird das aktuelle Infofenster geschlossen und das neue Infofenster erscheint. Hinweis: Wenn der Nutzer auf eine Markierung klickt, zu der derzeit ein Infofenster angezeigt wird, wird es geschlossen und noch einmal geöffnet.

Infofenster werden am Gerätebildschirm ausgerichtet und über der zugehörigen Markierung zentriert. Das Standardinfofenster enthält den Titel in Fettdruck und darunter den (optionalen) Snippet-Text.

Infofenster hinzufügen

Die einfachste Möglichkeit, ein Infofenster hinzuzufügen, ist, die Methoden title() und snippet() der entsprechenden Markierung festzulegen. Wenn diese Eigenschaften festgelegt werden, erscheint bei jedem Klick auf diese Markierung ein Infofenster.

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne")
                          .snippet("Population: 4,137,400"));

Infofenster ein- oder ausblenden

Infofenster sind so konzipiert, dass sie auf Tippaktionen des Nutzers reagieren. Bevorzugst du dagegen die programmatische Einblendung eines Infofensters, kannst du sie aktivieren, indem du die Zielmarkierung showInfoWindow() aufrufst. Infofenster können durch Aufrufen von hideInfoWindow() ausgeblendet werden.

static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .title("Melbourne"));
melbourne.showInfoWindow();

Du kannst auch Infofenster für einzelne Markierungscluster erstellen. Weitere Informationen findest du in der Anleitung zum Hinzufügen eines Infofensters für einzelne Markierungscluster.

Benutzerdefinierte Infofenster

Es ist außerdem möglich, Inhalt und Design von Infofenstern anzupassen. Erstelle dazu eine konkrete Implementierung der Schnittstelle InfoWindowAdapter und rufe dann damit das Objekt GoogleMap.setInfoWindowAdapter() auf. Die Schnittstelle enthält zwei Implementierungsmethoden: getInfoWindow(Marker) und getInfoContents(Marker). Über die API wird zuerst getInfoWindow(Marker) aufgerufen. Wenn null zurückgegeben wird, wird getInfoContents(Marker) aufgerufen. Lautet die Rückmeldung ebenfalls null, wird das Standardinfofenster verwendet.

Mit der ersten Methode (getInfoWindow()) kannst du eine Ansicht bereitstellen, die für das gesamte Infofenster verwendet wird. Mit der zweiten Methode (getInfoContents()) kann der Inhalt des Fensters angepasst, der Standardrahmen und -hintergrund des Infofensters jedoch beibehalten werden.

Die folgenden Bilder zeigen ein Standardinfofenster, ein Infofenster mit angepasstem Inhalt und ein Infofenster mit angepasstem Rahmen und Hintergrund.

Infofenstervergleich

Ereignisse im Infofenster

Das MarkerDemoActivity-Beispiel enthält Beispielcode zum Registrieren und Verarbeiten von Infofensterereignissen.

Mit OnInfoWindowClickListener kannst du Klickereignisse in einem Infofenster erfassen. Rufe GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener) auf, um diesen Listener auf der Karte festzulegen. Wenn ein Nutzer auf ein Infofenster klickt, wird onInfoWindowClick(Marker) aufgerufen und das Infofenster in der Standardhervorhebungsfarbe (grau) dargestellt.

public class MarkerDemoActivity extends AppCompatActivity implements
        OnInfoWindowClickListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        // Add markers to the map and do other map setup.
        ...
        // Set a listener for info window events.
        mMap.setOnInfoWindowClickListener(this);
    }

    @Override
    public void onInfoWindowClick(Marker marker) {
        Toast.makeText(this, "Info window clicked",
                Toast.LENGTH_SHORT).show();
    }
}

Du kannst auch lange Klickereignisse mit einem OnInfoWindowLongClickListener-Element erfassen, das du durch Aufrufen von GoogleMap.setOnInfoWindowLongClickListener(OnInfoWindowLongClickListener) festlegen kannst. Dieser Listener funktioniert ähnlich wie der Klick-Listener. Er wird bei langen Klickereignissen über einen onInfoWindowLongClick(Marker)-Callback benachrichtigt.

Wenn du beim Schließen des Infofensters benachrichtigt werden möchtest, verwende ein OnInfoWindowCloseListener-Element, das du durch Aufrufen von GoogleMap.setOnInfoWindowCloseListener(OnInfoWindowCloseListener) festlegen kannst. Du empfängst dann einen onInfoWindowClose(Marker)-Callback.

Hinweis zum Aktualisieren eines Infofensters: Das Ereignis onInfoWindowClose() wird ausgelöst, wenn der Nutzer ein Infofenster aktualisiert, indem auf eine Markierung getippt wird, für die bereits ein offenes Infofenster vorhanden ist. Wenn jedoch Marker.showInfoWindow() programmatisch in einem offenen Infofenster aufgerufen wird, wird das onInfoWindowClose()-Ereignis nicht ausgelöst. Die letztere Funktionsweise basiert auf der Annahme, dass du erkennst, ob das Infofenster geschlossen und wieder geöffnet wird.

Wie im vorherigen Abschnitt zu Infofenstern erwähnt, ist ein Infofenster kein Live View. Stattdessen wird die Ansicht als über die Karte gelegtes Bild gerendert. Aus diesem Grund werden Listener, die du für die Ansicht einrichtest, ignoriert und du kannst Klickereignisse auf unterschiedlichen Teilen der Ansicht nicht unterscheiden. Es wird empfohlen, keine interaktiven Komponenten wie Schaltflächen, Kästchen oder Texteingabefelder in einem benutzerdefinierten Infofenster zu platzieren.