Navigation Component — Qu'est-ce que c'est, NavHost et Navigation Graph

Auteur : IT Sectr Publié le : 2026-02-22 Temps de lecture : 7 min

Navigation Component est une bibliothèque Android Jetpack pour implémenter la navigation entre les écrans d'une application. Le composant centralise la gestion de la pile de fragments, des liens profonds et du passage d'arguments. Il fait partie de Jetpack depuis 2018 et est recommandé par Google pour tous les nouveaux projets. Plus d'informations dans le guide officiel de Google.

Points clés

  • Navigation Component — une bibliothèque Jetpack pour la navigation centralisée entre les écrans Android
  • NavGraph — une ressource XML décrivant tous les écrans et les connexions entre eux
  • NavHostFragment — un conteneur dans le layout de l'Activity affichant l'écran de navigation actuel
  • NavController — l'objet de contrôle de navigation : navigate, popBackStack, navigateUp
  • Safe Args — un plugin Gradle pour le passage d'arguments avec sécurité de typage entre les écrans

Qu'est-ce que Navigation Component ?

Navigation Component est une bibliothèque Android Jetpack (androidx.navigation) qui fournit une API unifiée pour la navigation. Elle comprend trois éléments clés : Navigation Graph (graphe de navigation), NavHostFragment (conteneur d'écrans) et NavController (contrôleur de transitions). Le composant gère automatiquement la pile de retour et prend en charge les liens profonds.

Avant Navigation Component, les développeurs géraient les fragments manuellement via FragmentManager. Cela produisait un code fragmenté (littéralement) : chaque écran avait ses propres règles de navigation, les états de la pile de retour variaient et les liens profonds nécessitaient une implémentation séparée. Navigation Component a unifié ces scénarios. Selon Google (2026), la bibliothèque est installée dans 90 % des nouveaux projets Android.

Navigation Component s'intègre avec d'autres bibliothèques Jetpack : LiveData, ViewModel, Material Design. Il prend en charge à la fois les fragments XML et Jetpack Compose via l'extension navigation-compose. Version stable — 2.8.x (2025), version minimale d'Android — API 14.

NavGraph est une ressource XML (res/navigation/nav_graph.xml) qui définit tous les écrans de l'application et les connexions entre eux. Chaque écran est une destination, qui peut être un Fragment, une Activity ou un Composable. Les connexions entre les destinations sont des actions qui définissent la direction de la transition.

xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@+id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name=".HomeFragment"
        android:label="Accueil"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_home_to_detail"
            app:destination="@+id/detailFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Détails"
        tools:layout="@layout/fragment_detail">
        <argument android:name="itemId"
            app:argType="integer"
            android:defaultValue="0" />
    </fragment>
</navigation>

L'attribut startDestination définit le premier écran affiché au lancement. Une action définit la destination cible et les animations optionnelles. Les arguments décrivent les paramètres passés à l'écran — type et valeur par défaut.

NavHostFragment est un conteneur placé dans le layout de l'Activity qui affiche l'écran de navigation actuel. NavHostFragment bascule automatiquement les fragments lorsque NavController.navigate() est appelé. NavController est l'objet qui gère la navigation : transitions, retour et vérification de la route actuelle.

kotlin
// Layout Activity: activity_main.xml
// <androidx.fragment.app.FragmentContainerView
//     android:id="@+id/nav_host_fragment"
//     android:name="androidx.navigation.fragment.NavHostFragment"
//     app:navGraph="@navigation/nav_graph"
//     app:defaultNavHost="true" />

class MainActivity : AppCompatActivity() {

    private val navController by lazy {
        (findViewById<NavHostFragment>(R.id.nav_host_fragment))
            .navController
    }

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

        // NavigationUI lie NavController à AppBar
        setupActionBarWithNavController(navController)
    }

    // Naviguer vers l'écran des détails
    fun openDetail(itemId: Long) {
        val bundle = Bundle().apply {
            putLong("itemId", itemId)
        }
        navController.navigate(R.id.action_home_to_detail, bundle)
    }

    override fun onSupportNavigateUp() = 
        navController.navigateUp() || super.onSupportNavigateUp()
}

app:defaultNavHost="true" est un attribut important : il intercepte le bouton de retour système et passe le contrôle à NavController. NavigationUI est un utilitaire pour lier NavController à AppBar, BottomNavigationView, NavigationDrawer. setupActionBarWithNavController active la flèche de retour sur les écrans imbriqués.

Navigation Component prend en charge les animations de transition personnalisées, définies dans les actions ou par programmation. Les animations sont définies par quatre attributs : enterAnim (apparition du nouvel écran), exitAnim (disparition de l'écran actuel), popEnterAnim (apparition lors du retour) et popExitAnim (disparition lors du retour).

xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="100%"
        android:toXDelta="0%"
        android:duration="300" />
</set>

// Transition programmatique avec animation
val navOptions = NavOptions.Builder()
    .setEnterAnim(R.anim.slide_in_right)
    .setExitAnim(R.anim.slide_out_left)
    .setPopEnterAnim(R.anim.slide_in_left)
    .setPopExitAnim(R.anim.slide_out_right)
    .build()

navController.navigate(R.id.detailFragment, args, navOptions)

Les animations fonctionnent avec Fragment au niveau de FragmentTransaction. Pour Jetpack Compose, les animations sont définies via NavOptionsCompat en utilisant Compose Animation. Navigation Component n'impose pas de restrictions sur le type d'animation — translate, scale, alpha et leurs combinaisons sont pris en charge.

Safe Args : arguments avec sécurité de typage

Safe Args est un plugin Gradle pour le transfert de données avec sécurité de typage entre les écrans. Le plugin analyse NavGraph, génère des classes Directions et Args avec des types de champ spécifiques. La correspondance des types est vérifiée à la compilation — une MissingArgumentException est détectée avant l'exécution de l'application.

kotlin
// build.gradle (module)
plugins {
    id 'androidx.navigation.safeargs.kotlin'
}

// Safe Args génère : DetailFragmentArgs, HomeFragmentDirections
// Utilisation dans HomeFragment :
val action = HomeFragmentDirections
    .actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)

// Utilisation dans DetailFragment :
private val args: DetailFragmentArgs by navArgs()
// args.itemId est de type Long, null ne peut pas être passé

override fun onViewCreated(...) {
    super.onViewCreated(...)
    loadItem(args.itemId)
}

navArgs() est un délégué Kotlin pour récupérer les arguments dans un Fragment ou une Activity. Le plugin prend en charge les primitifs, les chaînes, Parcelable, Serializable, Enum et les tableaux. Pour les objets complexes, passez un ID et chargez depuis ViewModel ou la base de données.

Deep Link est un lien externe qui ouvre un écran spécifique de l'application. Navigation Component gère les liens profonds via l'attribut app:deepLink dans NavGraph. Le système crée un PendingIntent qui restaure la pile de navigation jusqu'à l'écran cible, ou crée une nouvelle pile si l'application n'est pas en cours d'exécution.

xml

<fragment android:id="@+id/profileFragment"
    android:name=".ProfileFragment">
    <deepLink
        app:uri="https://example.com/profile/{userId}" />
    <argument
        android:name="userId"
        app:argType="string" />
</fragment>

// Création programmatique de Deep Link
val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.profileFragment)
    .setArguments(Bundle().apply {
        putString("userId", "user_123")
    })
    .createPendingIntent()

Les Deep Links prennent en charge les motifs URI avec des chemins et des paramètres de requête, intent action et le type mime. Les espaces réservés ({userId}) sont automatiquement mappés aux arguments de destination. Navigation Component gère également les liens profonds implicites via AndroidManifest — il suffit d'ajouter un intent-filter à l'Activity avec NavHostFragment.

Navigation Compose (androidx.navigation:navigation-compose) est une extension de Navigation Component pour Jetpack Compose. L'API préserve le concept de NavController et NavHost, mais les écrans sont des fonctions Composable au lieu de Fragment. NavHost accepte un lambda composable pour chaque route.

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyAppTheme {
                val navController = rememberNavController()
                NavHost(
                    navController = navController,
                    startDestination = "home"
                ) {
                    composable("home") {
                        HomeScreen(
                            onItemClick = { id ->
                                navController.navigate("detail/$id")
                            }
                        )
                    }
                    composable(
                        route = "detail/{itemId}",
                        arguments = listOf(
                            navArgument("itemId") {
                                type = NavType.LongType
                            }
                        )
                    ) { backStackEntry ->
                        val itemId = backStackEntry
                            .arguments?.getLong("itemId") ?: 0L
                        DetailScreen(itemId = itemId)
                    }
                }
            }
        }
    }
}

Navigation Compose utilise des routes de chaîne au lieu d'ids. Les paramètres sont passés via des modèles de route ("detail/{itemId}") et extraits de backStackEntry. rememberNavController() préserve NavController lors des recompositions. Pour la sécurité de typage dans Compose, le module navigation-compose-type-safety (expérimental) est recommandé.

Questions fréquentes

Qu'est-ce que NavHost dans Navigation Component ?

NavHost est un conteneur pour afficher les écrans de navigation. Il est implémenté via NavHostFragment dans le layout XML. NavHost suit l'écran actuel dans NavGraph et gère les transitions. Chaque Activity contient un NavHostFragment.

En quoi Safe Args est-il meilleur que Bundle ?

Safe Args est un plugin Gradle qui génère des classes d'arguments avec sécurité de typage. Bundle nécessite la spécification manuelle des clés et des types, ce qui entraîne des erreurs d'exécution. Safe Args vérifie les types à la compilation et sérialise les données automatiquement.

Comment passer des objets complexes via Navigation Component ?

Les objets complexes sont passés via ViewModel (partagé entre les écrans) ou via une base de données en passant un ID. Safe Args ne prend en charge que les primitifs, les chaînes et Parcelable. Google recommande d'éviter de passer des objets volumineux via les arguments de navigation.

Comment fonctionne Deep Link dans Navigation Component ?

Un Deep Link est configuré dans NavGraph via l'attribut app:deepLink. Navigation Component gère automatiquement les liens entrants, crée un PendingIntent via NavDeepLinkBuilder et restaure la pile de navigation jusqu'à l'écran cible. Prend en charge URI, intent action et type mime.

Peut-on utiliser Navigation Component avec Jetpack Compose ?

Oui. Navigation Compose (androidx.navigation:navigation-compose) fournit NavHost pour Compose. L'API est similaire à la version XML, mais les écrans sont des fonctions Composable. NavController est utilisé de la même manière dans les deux versions. Google recommande Navigation Compose pour les nouveaux projets Compose.

Résumé

  • Navigation Component — une bibliothèque Android Jetpack pour la navigation centralisée avec NavController, NavHost et NavGraph
  • NavGraph — un graphe XML décrivant tous les écrans (destinations) et les connexions (actions) entre eux
  • NavHostFragment — un conteneur dans le layout de l'Activity prenant en charge l'attribut defaultNavHost pour le bouton de retour
  • Safe Args — un plugin Gradle pour le passage d'arguments avec sécurité de typage et vérification à la compilation
  • Deep Links prennent en charge URI, intent action et type mime avec restauration automatique de la pile de navigation
  • Navigation Compose — une extension pour Jetpack Compose avec des routes de chaîne et des écrans composable
  • Navigation Component est la seule méthode de navigation recommandée par Google pour les nouveaux projets Android

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi