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 — 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.
<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.
// 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 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 — 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.
// 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.
<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.
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
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.
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.
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.
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.
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
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.
Lees ook