Найти в Дзене
Nuances of programming

Введение в Navigation Architecture Component

Оглавление

Источник: Nuances of Programming

Среди компонентов Jetpack, самым интересным является Navigation Architecture Component. Навигация управляет перемещением между destinations. Destinations обычно представлены фрагментами, однако поддерживают activities и другие пользовательские destinations. С помощью Navigation Architecture Component можно с легкостью реализовать сложную навигацию в android. Он предоставляет набор компонентов навигации, таких как Fragment transactions, Up and Back navigation, которые обрабатывают большую часть информации. Помимо этого, предоставляются шаблоны Navigation UI, такие как navigation drawers, bottom navigation и многие другие, содержащие минимальное количество кода. Узнать подробнее о преимуществах и ключевых особенностях Navigation Architecture Component можно, посмотрев официальную документацию.

Прежде чем начать…

Ниже изображена демо-версия приложения, которое мы будем создавать.

-2

Приложения содержат три фрагмента: HomeFragment, ProfileFragment и SettingsFragment в Bottom Navigation View. В HomeFragment есть кнопка, которая возвращает к FirstPageFragment. FirstPageFragment ведет к LastpageFragment.

-3

Добавление зависимостей

На уровне приложения build.gradle добавьте следующие зависимости.

implementation "android.arch.navigation:navigation-fragment-ktx:$rootProject.navigationVersion" //get the lastest version
implementation "android.arch.navigation:navigation-ui-ktx:$rootProject.navigationVersion"

Также добавьте следующую зависимость.

classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:$navigationSageArgs" //get the latest version

Следующий плагин предназначен для передачи аргументов между destinations (в нашем случае фрагментов).

apply plugin: 'androidx.navigation.safeargs'

Установка MainActivity

MainActivity содержит фрагмент NavHost и Bottom Navigation View в XML layout.

-4

Фрагмент Navhost: Activity размещает навигацию для приложения в NavHost. NavHost — это пустой контейнер, который перемещает destinations фрагментов по навигационному графу (navigation graph).

Во фрагменте NavHost назначаем свойство navGraph, значение которого представлено XML-ресурсом. Этот XML-ресурс называется навигационным графом, который представляет собой отдельные узлы destination в приложении вместе с соединяющими узлы действиями. Другими словами, destinations — это фрагменты, которые получаются в результате действий. Для создания навигационного графа создайте каталог navigation под каталогом res. Затем создайте навигационный XML-ресурс в этом каталоге.

-5

Навигационный граф для нашего приложения выглядит следующим образом. Строки представляют собой действия, приводящие к определенным destinations. Дизайн android_navigation.xml выглядит так.

-6

Здесь представлена текстовая часть android_navigation.xml.

-7
-8

Но…кто все это контролирует?

NavController. Это объект, который отслеживает текущую позицию в навигационном графе. Он координирует перемещение содержимого destination в NavHostFragment по навигационному графу. В MainActivity создаем объект NavController.

val host: NavHostFragment = supportFragmentManager
.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment? ?: return
val navController = host.navController

Перейти к destinations можно с помощью NavController.

findNavController().navigate(R.id.first_page_fragment)

Установка Bottom Navigation

С помощью Navigation Architecture Component можно с легкостью создать навигацию с menus, drawers и bottom navigation. Для установки bottom navigation view понадобятся лишь две строки.

-9

-10

Таким образом, мы уже создали три фрагмента Bottom Navigation View.

Action!

Помимо NavController для навигации также можно использовать действия. Строки, показанные на навигационном графе — это действия.

-11

Id действия action_goto1 соединяет home_fragment с destination first_page_fragment. При использовании app:popUpTo вместо app: destination, фрагменты удаляются из обратного стека до момента достижения first_page_fragment.

view.findViewById<Button>(R.id.btn_click_me)?.setOnClickListener ( Navigation.createNavigateOnClickListener(R.id.action_goto1)
)

Приступим к работе над аргументами!

ПлагинGradle генерирует простой объект и строитель классов для типобезопасного доступа к аргументам, установленным для destinations и действий. Тег <argument> в first_page_fragment генерирует класс FirstPageFragmentArgs. Передаем целое число testNumber из HomeFragment к FirstPageFragment.

Запомните, тег аргумента определяется во фрагменте, который получает аргументы.

-12

-13

Класс FirstPageFragmentArgs генерирует геттеры и сеттеры для аргумента testNumber. Устанавливаем значение в HomeFragment с помощью классов Directions.

var action: HomeFragmentDirections.ActionGoto1 =
HomeFragmentDirections.actionGoto1()
action.setTestNumber(1234)
Navigation.findNavController(view).navigate(action);

Классы Directions генерируются для каждого отдельного destination с действиями. Класс Directions включает методы для каждого действия в destination.

С помощью следующих строк получаем значение testNumber в FirstPageFragment.

val safeArgs = FirstPageFragmentArgs.fromBundle(arguments)
val flowStepNumber = safeArgs.testNumber

Вот и все! Мы успешно использовали Navigation Architecture Component для создания приложения. Запустите приложение и проверьте результат. Полный код можно посмотреть на github. Счастливого программирования!

Читайте нас в телеграмме и vk

Перевод статьи Reema Prajapati: Getting started with Navigation Architecture Component