Navigation Component — библиотека Android Jetpack для реализации навигации между экранами приложения. Компонент централизует управление стеком фрагментов, глубокими ссылками и передачей аргументов. Входит в состав Jetpack с 2018 года и рекомендован Google для всех новых проектов. Подробнее читайте в официальном руководстве Google.
Главное
Navigation Component — библиотека Android Jetpack (androidx.navigation), предоставляющая единый API для навигации. Включает три ключевых элемента: Navigation Graph (граф навигации), NavHostFragment (контейнер для экранов) и NavController (контроллер переходов). Компонент автоматически управляет back stack и поддерживает deep links.
До Navigation Component разработчики управляли фрагментами вручную через FragmentManager. Это приводило к фрагментированному (буквально) коду: каждый экран имел свои правила навигации, состояния back stack различались, deep links требовали отдельной реализации. Navigation Component унифицировал эти сценарии. По данным Google (2026), библиотека установлена в 90% новых Android-проектов.
Navigation Component интегрируется с другими библиотеками Jetpack: LiveData, ViewModel, Material Design. Поддерживает как XML-фрагменты, так и Jetpack Compose через расширение navigation-compose. Стабильный релиз — 2.8.x (2025), минимальная версия Android — API 14.
NavGraph — XML-ресурс (res/navigation/nav_graph.xml), определяющий все экраны приложения и связи между ними. Каждый экран — это узел (destination), который может быть Fragment, Activity или Composable. Связи между узлами — action, которые задают направление перехода.
<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="Главная"
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="Детали"
tools:layout="@layout/fragment_detail">
<argument android:name="itemId"
app:argType="integer"
android:defaultValue="0" />
</fragment>
</navigation>Атрибут startDestination задаёт первый экран, который отображается при запуске. Action определяет целевой destination и опциональные анимации. Аргументы (argument) описывают параметры, передаваемые на экран — тип и значение по умолчанию.
NavHostFragment — контейнер, который размещается в layout Activity и отображает текущий экран навигации. NavHostFragment автоматически переключает фрагменты при вызове NavController.navigate(). NavController — объект, управляющий навигацией: переход, возврат, проверка текущего маршрута.
// 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 связывает NavController с AppBar
setupActionBarWithNavController(navController)
}
// Переход на экран деталей
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" — важный атрибут: он перехватывает системную кнопку «Назад» и передаёт управление NavController. NavigationUI — утилита для связывания NavController с AppBar, BottomNavigationView, NavigationDrawer. setupActionBarWithNavController включает стрелку «Наверх» на вложенных экранах.
Navigation Component поддерживает кастомные анимации переходов, задаваемые в action или программно. Анимации определяются четырьмя атрибутами: enterAnim (появление нового экрана), exitAnim (исчезновение текущего), popEnterAnim (появление при возврате) и popExitAnim (исчезновение при возврате).
<?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>
// Программный переход с анимацией
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)Анимации работают с Fragment на уровне FragmentTransaction. Для Jetpack Compose анимации задаются через NavOptionsCompat с использованием Compose Animation. Navigation Component не накладывает ограничений на тип анимации — поддерживаются translate, scale, alpha и их комбинации.
Safe Args — Gradle плагин для типобезопасной передачи данных между экранами. Плагин анализирует NavGraph, генерирует классы Directions и Args с конкретными типами полей. На этапе компиляции проверяется соответствие типов — ошибка MissingArgumentException обнаруживается до запуска приложения.
// build.gradle (module)
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
// Safe Args генерирует: DetailFragmentArgs, HomeFragmentDirections
// Использование в HomeFragment:
val action = HomeFragmentDirections
.actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)
// Использование в DetailFragment:
private val args: DetailFragmentArgs by navArgs()
// args.itemId имеет тип Long, null не может быть передан
override fun onViewCreated(...) {
super.onViewCreated(...)
loadItem(args.itemId)
}navArgs() — Kotlin делегат для получения аргументов в Fragment или Activity. Плагин поддерживает примитивы, строки, Parcelable, Serializable, Enum и массивы. Для сложных объектов используйте передачу ID с загрузкой из ViewModel или базы данных.
Deep Link — внешняя ссылка, открывающая конкретный экран приложения. Navigation Component обрабатывает deep links через атрибут app:deepLink в NavGraph. Система создаёт PendingIntent, который восстанавливает стек навигации до целевого экрана, или создаёт новый стек, если приложение не запущено.
<fragment android:id="@+id/profileFragment"
android:name=".ProfileFragment">
<deepLink
app:uri="https://example.com/profile/{userId}" />
<argument
android:name="userId"
app:argType="string" />
</fragment>
// Программное создание 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 поддерживают шаблоны URI с путями и query-параметрами, intent action и mime type. Placeholder ({userId}) автоматически сопоставляется с аргументом destination. Navigation Component также обрабатывает implicit deep links через AndroidManifest — достаточно добавить intent-filter к Activity с NavHostFragment.
Navigation Compose (androidx.navigation:navigation-compose) — расширение Navigation Component для Jetpack Compose. API сохраняет концепцию NavController и NavHost, но экраны — Composable функции вместо Fragment. NavHost принимает composable лямбду для каждого маршрута.
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 использует строковые маршруты вместо id. Параметры передаются через шаблон route ("detail/{itemId}") и извлекаются из backStackEntry. rememberNavController() сохраняет NavController при рекомпозиции. Для Type Safety в Compose рекомендуется модуль navigation-compose-type-safety (экспериментальный).
Часто задаваемые вопросы
NavHost — контейнер для отображения экранов навигации. Реализуется через NavHostFragment в XML layout. NavHost отслеживает текущий экран в NavGraph и управляет переходами. Каждое Activity содержит один NavHostFragment.
Safe Args — Gradle плагин, генерирующий типобезопасные классы аргументов. Bundle требует ручного указания ключей и типов, что приводит к ошибкам времени выполнения. Safe Args проверяет типы на этапе компиляции и автоматически сериализует данные.
Сложные объекты передаются через ViewModel (общую для экранов) или через базу данных с передачей ID. Safe Args поддерживает только примитивы, строки и Parcelable. Google рекомендует избегать передачи больших объектов через аргументы навигации.
Deep Link настраивается в NavGraph через атрибут app:deepLink. Navigation Component автоматически обрабатывает входящие ссылки, создаёт PendingIntent через NavDeepLinkBuilder и восстанавливает стек навигации до целевого экрана. Поддерживает URI, intent action и mime type.
Да. Navigation Compose (androidx.navigation:navigation-compose) предоставляет NavHost для Compose. API аналогичен XML-версии, но экраны — Composable функции. NavController используется одинаково в обеих версиях. Google рекомендует Navigation Compose для новых проектов на Compose.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также