Навигация

Навигация – это взаимодействие, которое позволяет пользователям перемещаться по разным разделам приложения.

Компонент Navigation в Android Jetpack включает библиотеку Navigation, плагин Safe Args Gradle и инструменты, которые помогают реализовать навигацию в приложении. Компонент Navigation обрабатывает различные сценарии навигации – от простых нажатий кнопок до более сложных шаблонов, таких как панели приложений и панель навигации.

Основные понятия

В таблице ниже приведены основные понятия, связанные с навигацией, и типы, которые используются для их реализации.

Концепция

Назначение

Тип

Хост

Элемент интерфейса, содержащий текущий пункт назначения. То есть, когда пользователь перемещается по приложению, приложение по сути меняет места назначения в хосте навигации и за его пределами.

График

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

NavGraph

Контроль

Центральный координатор для управления навигацией между пунктами назначения. Контроллер предлагает методы для навигации между пунктами назначения, обработки ссылок на контент, управления обратным стеком и многого другого.

NavController

Место назначения

Узел в графе навигации. Когда пользователь переходит к этому узлу, хост показывает его контент.

NavDestination

Обычно создается при построении графа навигации.

Маршрут

Уникальный идентификатор целевого сервиса и всех необходимых для него данных.

Вы можете использовать маршруты для навигации. Маршруты помогают добраться до пункта назначения.

Любой сериализуемый тип данных.

Преимущества и функции

Компонент навигации предоставляет ряд других преимуществ и функций, в том числе следующие:

  • Анимация и переходы. Стандартизированные ресурсы для анимации и переходов.
  • Ссылки на контент. Реализует и обрабатывает ссылки на контент, которые направляют пользователя непосредственно к месту назначения.
  • Шаблоны интерфейса. Поддерживает такие шаблоны, как панель навигации и нижняя панель навигации, требуя минимальных дополнительных усилий.
  • Типобезопасность. Поддерживается передача данных между целевыми страницами с типобезопасностью.
  • Поддержка ViewModel. Позволяет ограничить область действия ViewModel графом навигации, чтобы передавать данные, связанные с интерфейсом, между пунктами назначения графа.
  • Транзакции для работы с фрагментами. Полная поддержка и обработка транзакций для работы с фрагментами.
  • Назад и вверх. По умолчанию правильно обрабатывает действия "Назад" и "Вверх".

Варианты фреймворков

Компонент Navigation поддерживает два основных фреймворка для реализации графа навигации в зависимости от архитектуры пользовательского интерфейса приложения:

  • Compose. Если ваше приложение полностью создано с помощью Jetpack Compose, используйте Navigation Compose. Пункты назначения в графе – это composable-функции.
  • Фрагменты. Если в вашем приложении используются компоненты View или сочетание View и Compose, используйте компонент Navigation на основе фрагментов. Пункты назначения в вашем графе – это фрагменты, которые могут содержать стандартные представления, контент Compose или их комбинацию.

Для приложений, переходящих с View на Compose, рекомендуется продолжать использовать компонент Navigation на основе фрагментов, преобразуя отдельные экраны в Compose. После того как все фрагменты будут заменены на composable-функции, вы сможете перенести граф навигации в Navigation Compose.

Как настроить среду

Чтобы добавить в проект поддержку навигации, включите в файл build.gradle своего приложения следующие зависимости:

Классный

plugins {
  // Kotlin serialization plugin for type safe routes and navigation arguments
  id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.21'
}
  
dependencies {
  def nav_version = "2.10.2"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:$nav_version"

  // Views/Fragments Integration
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Feature module support for Fragments
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // JSON serialization library, works with the Kotlin serialization plugin.
  implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
}

Котлин

plugins {
  // Kotlin serialization plugin for type safe routes and navigation arguments
  kotlin("plugin.serialization") version "2.0.21"
}

dependencies {
  val nav_version = "2.10.2"

  // Jetpack Compose integration
  implementation("androidx.navigation:navigation-compose:$nav_version")

  // Views/Fragments integration
  implementation("androidx.navigation:navigation-fragment:$nav_version")
  implementation("androidx.navigation:navigation-ui:$nav_version")

  // Feature module support for Fragments
  implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version")

  // Testing Navigation
  androidTestImplementation("androidx.navigation:navigation-testing:$nav_version")

  // JSON serialization library, works with the Kotlin serialization plugin
  implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}

Информацию о том, как добавить в проект другие компоненты архитектуры, вы найдете в статье Добавление компонентов в проект.

Дальнейшие действия

Дополнительную документацию и ресурсы, связанные с компонентом Navigation, можно найти по ссылкам ниже.

Подробные руководства

Дополнительную информацию о том, как реализовать хост навигации и NavController, а также о том, как они взаимодействуют с Compose и другими фреймворками пользовательского интерфейса, можно найти в следующих руководствах:

Практические работы

Видео

Образцы