Navigation Component — wat is het, NavHost en Navigation Graph

Auteur: IT Sectr Gepubliceerd: 2026-02-22 Leestijd: 7 min

Navigation Component — Android Jetpack-bibliotheek voor navigatie tussen app-schermen. De component centraliseert het beheer van de fragmentstack, diepe links en argumentoverdracht. Maakt sinds 2018 deel uit van Jetpack en wordt door Google aanbevolen voor alle nieuwe projecten. Lees meer in de officiële Google-handleiding.

Belangrijkste punten

  • Navigation Component — Jetpack-bibliotheek voor gecentraliseerde navigatie tussen Android-schermen
  • NavGraph — XML-bron die alle schermen en verbindingen ertussen beschrijft
  • NavHostFragment — container in de Activity-layout die het huidige navigatiescherm toont
  • NavController — object voor navigatiebeheer: navigate, popBackStack, navigateUp
  • Safe Args — Gradle-plugin voor typeveilige argumentoverdracht tussen schermen

Wat is Navigation Component?

Navigation Component — Android Jetpack-bibliotheek (androidx.navigation) die een uniforme API voor navigatie biedt. Bevat drie belangrijke elementen: Navigation Graph (navigatiegraaf), NavHostFragment (container voor schermen) en NavController (overgangscontroller). De component beheert automatisch de back-stack en ondersteunt deep links.

Vóór Navigation Component beheerden ontwikkelaars fragmenten handmatig via FragmentManager. Dit leidde tot gefragmenteerde code: elk scherm had zijn eigen navigatieregels, back-stack-toestanden verschilden en deep links vereisten aparte implementatie. Navigation Component heeft deze scenario's gestandaardiseerd. Volgens Google (2026) is de bibliotheek geïnstalleerd in 90% van de nieuwe Android-projecten.

Navigation Component integreert met andere Jetpack-bibliotheken: LiveData, ViewModel, Material Design. Ondersteunt zowel XML-fragmenten als Jetpack Compose via de navigation-compose-extensie. Stabiele release — 2.8.x (2025), minimale Android-versie — API 14.

NavGraph — XML-bron (res/navigation/nav_graph.xml) die alle schermen van de app en verbindingen ertussen definieert. Elk scherm is een knooppunt (destination) dat Fragment, Activity of Composable kan zijn. Verbindingen tussen knooppunten zijn action, die de overgangsrichting bepalen.

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="Start"
        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="Details"
        tools:layout="@layout/fragment_detail">
        <argument android:name="itemId"
            app:argType="integer"
            android:defaultValue="0" />
    </fragment>
</navigation>

Het attribuut startDestination bepaalt het eerste scherm dat bij het opstarten wordt getoond. Action definieert de doelbestemming en optionele animaties. Argumenten (argument) beschrijven de parameters die naar het scherm worden verzonden — type en standaardwaarde.

NavHostFragment — container die in de Activity-layout wordt geplaatst en het huidige navigatiescherm toont. NavHostFragment schakelt automatisch fragmenten bij aanroep van NavController.navigate(). NavController — object dat navigatie beheert: overgang, terugkeer, controle van huidige route.

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 koppelt NavController aan AppBar
        setupActionBarWithNavController(navController)
    }

    // Overgang naar detailscherm
    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" — belangrijk attribuut: onderschept de systeemknop 'Terug' en geeft controle door aan NavController. NavigationUI — hulpprogramma voor het koppelen van NavController aan AppBar, BottomNavigationView, NavigationDrawer. setupActionBarWithNavController activeert de pijl 'Omhoog' op geneste schermen.

Navigation Component ondersteunt aangepaste overgangsanimaties, gedefinieerd in action of programmatisch. Animaties worden gedefinieerd door vier attributen: enterAnim (verschijnen van nieuw scherm), exitAnim (verdwijnen van huidig scherm), popEnterAnim (verschijnen bij terugkeer) en popExitAnim (verdwijnen bij terugkeer).

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>

// Programmatische overgang met animatie
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)

Animaties werken met Fragment op FragmentTransaction-niveau. Voor Jetpack Compose worden animaties ingesteld via NavOptionsCompat met Compose Animation. Navigation Component legt geen beperkingen op aan het animatietype — ondersteunt translate, scale, alpha en combinaties ervan.

Safe Args: typeveilige argumenten

Safe Args — Gradle-plugin voor typeveilige gegevensoverdracht tussen schermen. De plugin analyseert NavGraph, genereert Directions- en Args-klassen met specifieke veldtypen. Tijdens compilatie wordt type-overeenstemming gecontroleerd — MissingArgumentException wordt gedetecteerd vóór het starten van de app.

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

// Safe Args genereert: DetailFragmentArgs, HomeFragmentDirections
// Gebruik in HomeFragment:
val action = HomeFragmentDirections
    .actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)

// Gebruik in DetailFragment:
private val args: DetailFragmentArgs by navArgs()
// args.itemId heeft type Long, null kan niet worden doorgegeven

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

navArgs() — Kotlin-delegate voor het ophalen van argumenten in Fragment of Activity. De plugin ondersteunt primitieven, strings, Parcelable, Serializable, Enum en arrays. Gebruik voor complexe objecten ID-overdracht met laden vanuit ViewModel of database.

Deep Link — externe link die een specifiek app-scherm opent. Navigation Component verwerkt deep links via het attribuut app:deepLink in NavGraph. Het systeem maakt een PendingIntent die de navigatiestack herstelt naar het doelscherm, of een nieuwe stack maakt als de app niet actief is.

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>

// Programmatisch maken van Deep Link
val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.profileFragment)
    .setArguments(Bundle().apply {
        putString("userId", "user_123")
    })
    .createPendingIntent()

Deep Links ondersteunen URI-sjablonen met paden en query-parameters, intent action en mime type. Placeholder ({userId}) wordt automatisch gekoppeld aan het destination-argument. Navigation Component verwerkt ook impliciete deep links via AndroidManifest — voeg gewoon intent-filter toe aan Activity met NavHostFragment.

Navigation Compose (androidx.navigation:navigation-compose) — extensie van Navigation Component voor Jetpack Compose. De API behoudt het concept van NavController en NavHost, maar schermen zijn Composable-functies in plaats van Fragment. NavHost accepteert een composable lambda voor elke 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 gebruikt string-routes in plaats van id. Parameters worden doorgegeven via het route-sjabloon ("detail/{itemId}") en opgehaald uit backStackEntry. rememberNavController() behoudt NavController bij recompositie. Voor Type Safety in Compose wordt de module navigation-compose-type-safety (experimenteel) aanbevolen.

Veelgestelde vragen

Wat is NavHost in Navigation Component?

NavHost — container voor het tonen van navigatieschermen. Geïmplementeerd via NavHostFragment in XML-layout. NavHost volgt het huidige scherm in NavGraph en beheert overgangen. Elk Activity bevat één NavHostFragment.

Waarom is Safe Args beter dan Bundle?

Safe Args — Gradle-plugin die typeveilige argumentklassen genereert. Bundle vereist handmatige specificatie van sleutels en typen, wat leidt tot runtime-fouten. Safe Args controleert typen tijdens compilatie en serialiseert gegevens automatisch.

Hoe geef ik complexe objecten door via Navigation Component?

Complexe objecten worden doorgegeven via ViewModel (gedeeld tussen schermen) of via database met ID-overdracht. Safe Args ondersteunt alleen primitieven, strings en Parcelable. Google raadt aan om grote objecten niet via navigatieargumenten door te geven.

Hoe werkt Deep Link in Navigation Component?

Deep Link wordt geconfigureerd in NavGraph via het attribuut app:deepLink. Navigation Component verwerkt inkomende links automatisch, maakt een PendingIntent via NavDeepLinkBuilder en herstelt de navigatiestack naar het doelscherm. Ondersteunt URI, intent action en mime type.

Kan Navigation Component worden gebruikt met Jetpack Compose?

Ja. Navigation Compose (androidx.navigation:navigation-compose) biedt NavHost voor Compose. De API is vergelijkbaar met de XML-versie, maar schermen zijn Composable-functies. NavController wordt in beide versies hetzelfde gebruikt. Google beveelt Navigation Compose aan voor nieuwe projecten in Compose.

Samenvatting

  • Navigation Component — Android Jetpack-bibliotheek voor gecentraliseerde navigatie met NavController, NavHost en NavGraph
  • NavGraph — XML-graaf die alle schermen (destination) en verbindingen (action) ertussen beschrijft
  • NavHostFragment — container in Activity-layout die defaultNavHost-attribuut ondersteunt voor knop 'Terug'
  • Safe Args — Gradle-plugin voor typeveilige argumentoverdracht met typecontrole tijdens compilatie
  • Deep Links ondersteunen URI, intent action en mime type met automatisch herstel van navigatiestack
  • Navigation Compose — extensie voor Jetpack Compose met string-routes en composable schermen
  • Navigation Component is de enige door Google aanbevolen navigatiemethode in nieuwe Android-projecten

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook