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 immer NavigationFragment anstelle von NavigationView.

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

Bei Verwendung von NavigationView muss die Reihenfolge beim Aufrufen von Lebenszyklusmethoden eingehalten werden.

NavigationView enthält die Navigationskarte und folgt eng den Lebenszyklusereignissen als Android-Aktivitäten und ‑Fragmente. Bei Aufruf dieser Lebenszyklusereignisse 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. Das gilt auch, wenn andere Lebenszyklusereignisse verarbeitet werden.

Die NavigationView-Lebenszyklusmethoden haben dieselbe Bedeutung wie für Android-Aktivitäten oder -Fragmente. onCreate von NavigationView entspricht in etwa und sollte durch Lebenszyklus-Callbacks der Android-Aktivität oder des Fragments 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, einer nicht aktualisierten Position und anderen Problemen kommen.

Weitere Informationen zum Android-Aktivitätslebenszyklus finden Sie in der Android-Entwicklerdokumentation im Abschnitt Activity-lifecycle concepts (Konzepte zum Aktivitätslebenszyklus).

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

Lebenszyklusmethode Wann wird die Methode im Aktivitätslebenszyklus aufgerufen? Nach welcher Lifecycle-Methode wird sie aufgerufen?
onConfigurationChanged() Wird aufgerufen, wenn sich die Benutzeroberfläche im Vordergrund befindet und sich die Konfiguration ändert. Immer nach onStart()
onTrimMemory() Wird aufgerufen, wenn sich eine Aktivität im Hintergrund befindet. Immer nach onPause()
onSaveInstance() Wird aufgerufen, bevor eine Aktivität beendet wird. Immer nach onStop()

Rufen Sie diese Lebenszyklusmethoden nicht mehrmals auf, ohne zuerst die entsprechende Schließmethode aufzurufen. Wenn einige dieser Android-Lebenszyklus-Callbacks von der App selbst verwaltet werden und das NavigationView dem Fragment nach der Erstellung oder dem Start hinzugefügt wird, muss die App die spezifischen 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 über die Aktivität oder das Fragment auf, nicht über beide.

Damit die Lebenszyklusmethoden in der richtigen Reihenfolge aufgerufen werden, rufen Sie diese Ereignisse entweder über die Lebenszyklus-Callbacks der Aktivität oder des Fragments auf, die diese Ereignisse in der richtigen Reihenfolge empfangen. So wird verhindert, dass Apps zwischen Fragmenten und Aktivitäten koordiniert werden müssen und doppelte Aufrufe verursachen.

Update von SupportNavigationFragment auf NavigationFragment

Ab Version 8.0.0 des Navigation SDK ersetzt NavigationFragment den verworfenen SupportNavigationFragment als Standard-Fragmentcontainer für die detaillierte Routenführung und die Kartendarstellung.

NavigationFragment bietet vollständige API-Parität mit SupportNavigationFragment. Um Ihre App zu aktualisieren, ersetzen Sie SupportNavigationFragment durch NavigationFragment in Ihren XML-Layoutdateien und Quellcodeimporten. Alle Methodensignaturen und getSupportFragmentManager()-Aufrufe bleiben unverändert.

Layout-XML aktualisieren

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

Vorher (Version 7.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 Typumwandlungen in Ihrem Java- oder Kotlin-Code. Da beide Klassen androidx.fragment.app.Fragment erweitern, verwenden Sie weiterhin getSupportFragmentManager(), um das Fragment zu suchen:

Vorher (Version 7.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()).