0Pricing
Android Academy · Урок

Компонент навигации

Управляйте навигацией между несколькими экранами с помощью визуального NavGraph, типобезопасных аргументов Safe Args, NavController и поддержки глубоких ссылок.

«Компонент навигации» — бесплатный урок Android Academy на CoddyKit. Это урок 5 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.

Что такое Navigation Component?

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

Основные преимущества:

  • Наглядный граф навигации в Android Studio
  • Передача аргументов с проверкой типов (Safe Args)
  • Автоматическое управление стеком возврата
  • Поддержка глубоких ссылок из коробки

Настройка: зависимости

Добавьте в app/build.gradle:

// app/build.gradle
dependencies {
    implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
    implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
}

// project/build.gradle (for Safe Args):
buildscript {
    dependencies {
        classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7'
    }
}

// app/build.gradle — apply the plugin:
plugins {
    id 'androidx.navigation.safeargs.kotlin'
}

Граф навигации (nav_graph.xml)

Создайте res/navigation/nav_graph.xml. В нём определяются пункты назначения (фрагменты) и действия (пути навигации):

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

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.HomeFragment">
        <action
            android:id="@+id/action_home_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment">
        <argument
            android:name="itemId"
            app:argType="integer" />
    </fragment>
</navigation>

NavHostFragment в разметке Activity

Замените контейнер FrameLayout на NavHostFragment. Он служит хостом для всех пунктов назначения навигации:

<!-- activity_main.xml -->
<androidx.fragment.app.FragmentContainerView
    android:id="@+id/navHostFragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true" />

NavController — навигация между фрагментами

Получите NavController и вызовите navigate(), указав идентификатор действия:

class HomeFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.btnOpenDetail.setOnClickListener {
            // Navigate using action ID from nav_graph
            findNavController().navigate(R.id.action_home_to_detail)
        }
    }
}

Safe Args — аргументы с проверкой типов

Safe Args создаёт классы для передачи аргументов между фрагментами без приведения типов и опечаток в ключах:

// In HomeFragment — pass itemId:
binding.btnOpenDetail.setOnClickListener {
    val action = HomeFragmentDirections.actionHomeToDetail(itemId = 42)
    findNavController().navigate(action)
}

// In DetailFragment — receive itemId:
class DetailFragment : Fragment() {
    private val args: DetailFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val id = args.itemId   // Int, type-safe
        viewModel.loadItem(id)
    }
}

Навигация вверх

Свяжите кнопку перехода вверх на панели инструментов с NavController, чтобы автоматически выполнять навигацию назад:

class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

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

        val navHostFragment = supportFragmentManager
            .findFragmentById(R.id.navHostFragment) as NavHostFragment
        navController = navHostFragment.navController

        // Wire toolbar Up button
        setupActionBarWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp() || super.onSupportNavigateUp()
    }
}

Нижняя навигация с NavController

Свяжите BottomNavigationView с NavController — он автоматически обрабатывает выбор вкладки и стек возврата:

// In Activity.onCreate():
val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.navHostFragment) as NavHostFragment
val navController = navHostFragment.navController

// Wire BottomNavigationView
binding.bottomNav.setupWithNavController(navController)

// Each menu item ID must match a fragment destination ID in nav_graph.xml

Извлечение из стека возврата

Выполните переход назад программно или перейдите к определённому пункту назначения:

// Go back one step
findNavController().popBackStack()

// Navigate back to a specific destination (popping everything on top)
findNavController().popBackStack(R.id.homeFragment, inclusive = false)

// Navigate and clear back stack (e.g., after login)
findNavController().navigate(
    R.id.action_login_to_home,
    null,
    NavOptions.Builder()
        .setPopUpTo(R.id.loginFragment, inclusive = true)
        .build()
)

Глубокие ссылки

Добавьте глубокую ссылку к пункту назначения, чтобы приложение можно было открыть по URL:

<!-- In nav_graph.xml, inside the destination fragment: -->
<deepLink
    android:id="@+id/deepLinkDetail"
    app:uri="https://example.com/items/{itemId}" />

<!-- Also add intent-filter in AndroidManifest.xml for the Activity: -->
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="example.com" />
</intent-filter>

Переходы между фрагментами

Добавьте пользовательские анимации к действиям навигации в графе навигации:

<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" />

Быстрая проверка

Что должно совпадать у идентификатора пункта меню BottomNavigationView и графа навигации для автоматической обработки вкладок?

Повторение: Navigation Component

Navigation Component упрощает создание приложений с несколькими экранами:

  • Наглядный nav_graph.xml — пункты назначения и действия
  • NavHostFragment в разметке Activity
  • findNavController().navigate(actionId) для перехода между экранами
  • Safe Args — передача аргументов с проверкой типов (без приведения типов и опечаток)
  • setupActionBarWithNavController() — автоматическая кнопка перехода вверх
  • setupWithNavController() — автоматическая настройка BottomNavigationView

Далее: добавление внедрения зависимостей с Hilt для чистой архитектуры.

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

Урок «Компонент навигации» бесплатный?

Да — полный текст урока «Компонент навигации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.

Чему я научусь в уроке «Компонент навигации»?

Управляйте навигацией между несколькими экранами с помощью визуального NavGraph, типобезопасных аргументов Safe Args, NavController и поддержки глубоких ссылок. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 5 из 6.

Сколько времени занимает урок «Компонент навигации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. ViewModel и LiveData
  2. База данных Room
  3. Корутины и приостанавливаемые функции
  4. Шаблон репозитория
  5. Компонент навигации
  6. Внедрение зависимостей с Hilt
← Назад к Android Academy