Best Practices für die Interaktion mit Navigationskarten

Auf dieser Seite werden Best Practices für die Interaktion mit der Navigationskarte in Ihrer App erläutert.

Verwenden Sie nach Möglichkeit NavigationFragment anstelle von NavigationView.

NavigationFragment umschließt NavigationView und verarbeitet die Lebenszyklus-Callbacks automatisch, sodass Sie sie nicht selbst verwalten müssen. Dieser Ansatz ist weniger fehleranfällig und wird für die Verwendung der Navigation in Ihrer App empfohlen. Wenn Sie NavigationFragment verwenden, rufen Sie NavigationView-Lifecycle-Events nicht direkt auf.

Wenn Sie NavigationView verwenden, halten Sie sich beim Aufrufen von Lebenszyklusmethoden an die strikte Reihenfolge

NavigationView hostet die Navigationskarte und folgt den Lifecycle-Events als Android-Aktivitäten und -Fragmente. Wenn diese Lifecycle-Events aufgerufen werden, werden bestimmte Aktionen ausgeführt. NavigationView führt mehrere Initialisierungen für NavigationView#onCreate und NavigationView#onStart sowie Bereinigungen für NavigationView#onStop und NavigationView#onDestroy aus, ebenso wie bei der Verarbeitung anderer Lifecycle-Events.

NavigationView-Lebenszyklusmethoden haben dieselbe Bedeutung wie für Android-Aktivitäten oder -Fragmente. Beispielsweise entspricht onCreate von NavigationView in etwa den Lebenszyklus-Callbacks der Android-Aktivität oder des Android-Fragments und sollte von diesen aufgerufen werden. Da die NavigationView-Lebenszyklus-Callbacks auf den Android-Lebenszyklus-Callbacks basieren und in derselben Reihenfolge aufgerufen werden, ist eine strikte Reihenfolge dieser NavigationView-Methoden erforderlich. Andernfalls kann es zu Speicherlecks, UI-Fehlern, nicht aktualisierten Standorten und anderen Problemen kommen.

Weitere Informationen zum Android-Aktivitätslebenszyklus finden Sie im Abschnitt Konzepte des Aktivitätslebenszyklus in der Android-Entwicklerdokumentation.

In der folgenden Tabelle sehen Sie, wann andere Lebenszyklusmethoden nach bestimmten Lebenszyklusmethoden aufgerufen werden sollten:

Lebenszyklusmethode Aufruf im Aktivitätslebenszyklus Nach welcher Lebenszyklusmethode aufgerufen
onConfigurationChanged() Wird aufgerufen, wenn sich die Benutzeroberfläche im Vordergrund befindet und sich die Konfiguration ändert. Immer nach dem onStart()
onTrimMemory() Wird aufgerufen, wenn sich eine Aktivität im Hintergrund befindet. Immer nach onPause()
onSaveInstance() Wird aufgerufen, bevor eine Aktivität gelöscht wird. Immer nach onStop()

Rufen Sie diese Lebenszyklusmethoden nicht mehrmals auf, ohne vorher die entsprechende Schließmethode aufzurufen. Wenn einige dieser Android-Lebenszyklus-Callbacks von der App selbst verwaltet werden und die NavigationView nach der Erstellung oder dem Start dem Fragment hinzugefügt wird, sollte die App die entsprechenden Methoden in der richtigen Reihenfolge aufrufen, um das Navigation SDK korrekt zu initialisieren.

Weitere Informationen zur Verwendung dieser Methoden finden Sie in der Demo-App für das Navigation SDK.

Wenn Sie NavigationView verwenden, rufen Sie Lifecycle-Events entweder über die Aktivität oder das Fragment auf, nicht über beides.

Damit die strikte Reihenfolge der Lebenszyklusmethoden eingehalten wird, rufen Sie diese Ereignisse entweder über die Aktivitäts- oder Fragment-Lebenszyklus-Callbacks auf, die diese Ereignisse in der richtigen Reihenfolge empfangen. So wird sichergestellt, dass Apps nicht zwischen Fragmenten und Aktivitäten koordinieren müssen und keine doppelten Aufrufe verursachen.

Von SupportNavigationFragment auf NavigationFragment aktualisieren

Ab Version 8.0.0 des Navigation SDK ersetzt NavigationFragment das verworfene SupportNavigationFragment als Standardfragmentcontainer für die detaillierte Routenführung und die Kartendarstellung.

NavigationFragment bietet vollständige API-Parität mit SupportNavigationFragment. Wenn Sie Ihre App aktualisieren möchten, ersetzen Sie SupportNavigationFragment in Ihren XML-Layoutdateien und Quellcode-Importen durch NavigationFragment. Alle Methodensignaturen und getSupportFragmentManager()-Aufrufe bleiben identisch.

Layout-XML aktualisieren

Ersetzen Sie in Ihren Layout-XML-Dateien SupportNavigationFragment durch NavigationFragment:

Vorher (v7.x und älter):

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Nachher (v8.0.0+):

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Wenn Ihre App FragmentContainerView verwendet (empfohlen für das Hosten von Fragmenten), aktualisieren Sie das Attribut android:name:

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Anwendungscode aktualisieren

Ersetzen Sie Importe und Klassencasts in Ihrem Java- oder Kotlin-Code. Da beide Klassen androidx.fragment.app.Fragment erweitern, verwenden Sie weiterhin getSupportFragmentManager(), um das Fragment zu suchen:

Vorher (v7.x und älter):

Java

import com.google.android.libraries.navigation.SupportNavigationFragment;

public class MainActivity extends AppCompatActivity {
  private SupportNavigationFragment mNavFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavFragment = (SupportNavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

Kotlin

import com.google.android.libraries.navigation.SupportNavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: SupportNavigationFragment

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as SupportNavigationFragment
  }
}
    

Nachher (v8.0.0+):

Java

import com.google.android.libraries.navigation.NavigationFragment;

public class MainActivity extends AppCompatActivity {
  private NavigationFragment mNavFragment;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavFragment = (NavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

Kotlin

import com.google.android.libraries.navigation.NavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: NavigationFragment

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as NavigationFragment
  }
}
    

API-Parität

Sie müssen keine weiteren Verhaltensänderungen vornehmen oder Ihren Code umstrukturieren. NavigationFragment unterstützt alle öffentlichen Methoden, Listener-Schnittstellen und benutzerdefinierten UI-Steuerelemente aus SupportNavigationFragment mit identischen Methodensignaturen (einschließlich getMapAsync(), getNavigator(), setEtaCardEnabled() und setStylingOptions()).