Bonnes pratiques concernant les interactions avec la carte de navigation

Cette page décrit les bonnes pratiques à suivre pour interagir avec la carte de navigation dans votre application.

Utilisez NavigationFragment à la place de NavigationView, dans la mesure du possible.

NavigationFragment encapsule NavigationView et gère automatiquement ses rappels de cycle de vie. Vous n'avez donc pas besoin de les gérer vous-même. Cette approche est moins sujette aux erreurs et constitue la méthode recommandée pour utiliser la navigation dans votre application. Lorsque vous utilisez NavigationFragment, n'appelez pas directement les événements de cycle de vie NavigationView.

Si vous utilisez NavigationView, respectez l'ordre strict lorsque vous appelez les méthodes de cycle de vie.

NavigationView héberge la carte de navigation et suit de près les événements de cycle de vie en tant qu'activités et fragments Android, en prenant des mesures spécifiques lorsque ces événements de cycle de vie sont appelés. NavigationView exécute plusieurs initialisations sur NavigationView#onCreate et NavigationView#onStart, et des nettoyages sur NavigationView#onStop et NavigationView#onDestroy, ainsi que lorsque d'autres événements de cycle de vie sont traités.

Les méthodes de cycle de vie NavigationView ont la même signification que pour les activités ou les fragments Android. Par exemple, onCreate de NavigationView se traduit approximativement par et doit être appelé par les rappels de cycle de vie de l'activité ou du fragment Android. Étant donné que les rappels de cycle de vie NavigationView sont basés sur les rappels de cycle de vie Android et invoqués dans le même ordre, un ordre strict de ces méthodes NavigationView est requis. Sinon, vous risquez de rencontrer des fuites de mémoire, des erreurs d'UI, des problèmes de mise à jour de la position et d'autres problèmes.

Pour en savoir plus sur le cycle de vie des activités Android, consultez la section Concepts liés au cycle de vie des activités dans la documentation destinée aux développeurs Android.

Le tableau suivant indique quand les autres méthodes de cycle de vie doivent être appelées, après les méthodes de cycle de vie spécifiées :

Méthode de cycle de vie Invoqué dans le cycle de vie de l'activité Méthode de cycle de vie après laquelle l'événement est appelé
onConfigurationChanged() Appelé lorsque l'UI est au premier plan et que la configuration change. Toujours après onStart()
onTrimMemory() Invoqué lorsqu'une activité est en arrière-plan. Toujours après onPause()
onSaveInstance() Appelé avant la destruction d'une activité. Toujours après onStop()

N'appelez pas ces méthodes de cycle de vie plusieurs fois sans appeler d'abord la méthode de fermeture correspondante. De plus, gardez à l'esprit que si certains de ces rappels de cycle de vie Android sont gérés par l'application elle-même et que NavigationView est ajouté au fragment après la création ou le démarrage, l'application doit appeler les méthodes spécifiques dans le bon ordre pour initialiser correctement le SDK Navigation.

Pour obtenir de l'aide sur l'utilisation de ces méthodes, consultez l'application de démonstration du SDK Navigation.

Si vous utilisez NavigationView, appelez les événements de cycle de vie à partir de l'activité ou du fragment, et non des deux.

Pour conserver l'ordre strict des méthodes du cycle de vie, appelez ces événements à partir des rappels du cycle de vie de l'activité ou du fragment, qui reçoivent ces événements dans l'ordre. Cette approche garantit que les applications n'ont pas besoin de coordonner les fragments et les activités, et d'entraîner des appels en double.

Mise à jour de SupportNavigationFragment vers NavigationFragment

À partir de la version 8.0.0 du SDK Navigation, NavigationFragment remplace SupportNavigationFragment, qui est obsolète, en tant que conteneur de fragment standard pour la navigation détaillée et l'affichage de la carte.

NavigationFragment est entièrement compatible avec l'API SupportNavigationFragment. Pour mettre à jour votre application, remplacez SupportNavigationFragment par NavigationFragment dans vos fichiers de mise en page XML et vos importations de code source. Toutes les signatures de méthode et les appels getSupportFragmentManager() restent identiques.

Mettre à jour le fichier XML de mise en page

Remplacez SupportNavigationFragment par NavigationFragment dans vos fichiers XML de mise en page :

Avant (v7.x et versions antérieures) :

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

Après (v8.0.0 et versions ultérieures) :

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

Si votre application utilise FragmentContainerView (recommandé pour héberger des fragments), mettez à jour l'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" />

Mettre à jour le code de l'application

Remplacez les importations et les casts de classe dans votre code Java ou Kotlin. Étant donné que les deux classes étendent androidx.fragment.app.Fragment, continuez à utiliser getSupportFragmentManager() pour rechercher le fragment :

Avant (v7.x et versions antérieures) :

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

Après (v8.0.0 et versions ultérieures) :

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

Parité des API

Vous n'avez pas besoin de modifier d'autres comportements ni de restructurer votre code. NavigationFragment est compatible avec toutes les méthodes publiques, les interfaces d'écouteur et les commandes d'UI personnalisées de SupportNavigationFragment avec des signatures de méthode identiques (y compris getMapAsync(), getNavigator(), setEtaCardEnabled() et setStylingOptions()).