Navigation Component — что это, NavHost и Navigation Graph

Автор: IT Sectr Опубликовано: 2026-02-22 Время чтения: 7 мин

Navigation Component — библиотека Android Jetpack для реализации навигации между экранами приложения. Компонент централизует управление стеком фрагментов, глубокими ссылками и передачей аргументов. Входит в состав Jetpack с 2018 года и рекомендован Google для всех новых проектов. Подробнее читайте в официальном руководстве Google.

Главное

  • Navigation Component — библиотека Jetpack для централизованной навигации между экранами Android
  • NavGraph — XML-ресурс, описывающий все экраны и связи между ними
  • NavHostFragment — контейнер в layout Activity, отображающий текущий экран навигации
  • NavController — объект управления навигацией: navigate, popBackStack, navigateUp
  • Safe Args — Gradle плагин для типобезопасной передачи аргументов между экранами

Что такое Navigation Component?

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, которые задают направление перехода.

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="Главная"
        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 — объект, управляющий навигацией: переход, возврат, проверка текущего маршрута.

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 связывает 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

<?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: типобезопасные аргументы

Safe Args — Gradle плагин для типобезопасной передачи данных между экранами. Плагин анализирует NavGraph, генерирует классы Directions и Args с конкретными типами полей. На этапе компиляции проверяется соответствие типов — ошибка MissingArgumentException обнаруживается до запуска приложения.

kotlin
// 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, который восстанавливает стек навигации до целевого экрана, или создаёт новый стек, если приложение не запущено.

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>

// Программное создание 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 лямбду для каждого маршрута.

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 использует строковые маршруты вместо id. Параметры передаются через шаблон route ("detail/{itemId}") и извлекаются из backStackEntry. rememberNavController() сохраняет NavController при рекомпозиции. Для Type Safety в Compose рекомендуется модуль navigation-compose-type-safety (экспериментальный).

Часто задаваемые вопросы

Что такое NavHost в Navigation Component?

NavHost — контейнер для отображения экранов навигации. Реализуется через NavHostFragment в XML layout. NavHost отслеживает текущий экран в NavGraph и управляет переходами. Каждое Activity содержит один NavHostFragment.

Чем Safe Args лучше Bundle?

Safe Args — Gradle плагин, генерирующий типобезопасные классы аргументов. Bundle требует ручного указания ключей и типов, что приводит к ошибкам времени выполнения. Safe Args проверяет типы на этапе компиляции и автоматически сериализует данные.

Как передать сложные объекты через Navigation Component?

Сложные объекты передаются через ViewModel (общую для экранов) или через базу данных с передачей ID. Safe Args поддерживает только примитивы, строки и Parcelable. Google рекомендует избегать передачи больших объектов через аргументы навигации.

Как работает Deep Link в Navigation Component?

Deep Link настраивается в NavGraph через атрибут app:deepLink. Navigation Component автоматически обрабатывает входящие ссылки, создаёт PendingIntent через NavDeepLinkBuilder и восстанавливает стек навигации до целевого экрана. Поддерживает URI, intent action и mime type.

Можно ли использовать Navigation Component с Jetpack Compose?

Да. Navigation Compose (androidx.navigation:navigation-compose) предоставляет NavHost для Compose. API аналогичен XML-версии, но экраны — Composable функции. NavController используется одинаково в обеих версиях. Google рекомендует Navigation Compose для новых проектов на Compose.

Итоги

  • Navigation Component — библиотека Android Jetpack для централизованной навигации с NavController, NavHost и NavGraph
  • NavGraph — XML-граф, описывающий все экраны (destination) и связи (action) между ними
  • NavHostFragment — контейнер в layout Activity, поддерживающий атрибут defaultNavHost для кнопки «Назад»
  • Safe Args — Gradle плагин для типобезопасной передачи аргументов с проверкой типов на этапе компиляции
  • Deep Links поддерживают URI, intent action и mime type с автоматическим восстановлением стека навигации
  • Navigation Compose — расширение для Jetpack Compose с маршрутами-строками и composable экранами
  • Navigation Component — единственный рекомендованный Google способ навигации в новых Android-проектах

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также