Источник: 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 можно, посмотрев официальную документацию.
Прежде чем начать…
Ниже изображена демо-версия приложения, которое мы будем создавать.
Приложения содержат три фрагмента: HomeFragment, ProfileFragment и SettingsFragment в Bottom Navigation View. В HomeFragment есть кнопка, которая возвращает к FirstPageFragment. FirstPageFragment ведет к LastpageFragment.
Добавление зависимостей
На уровне приложения 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.
Фрагмент Navhost: Activity размещает навигацию для приложения в NavHost. NavHost — это пустой контейнер, который перемещает destinations фрагментов по навигационному графу (navigation graph).
Во фрагменте NavHost назначаем свойство navGraph, значение которого представлено XML-ресурсом. Этот XML-ресурс называется навигационным графом, который представляет собой отдельные узлы destination в приложении вместе с соединяющими узлы действиями. Другими словами, destinations — это фрагменты, которые получаются в результате действий. Для создания навигационного графа создайте каталог navigation под каталогом res. Затем создайте навигационный XML-ресурс в этом каталоге.
Навигационный граф для нашего приложения выглядит следующим образом. Строки представляют собой действия, приводящие к определенным destinations. Дизайн android_navigation.xml выглядит так.
Здесь представлена текстовая часть android_navigation.xml.
Но…кто все это контролирует?
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 понадобятся лишь две строки.
Таким образом, мы уже создали три фрагмента Bottom Navigation View.
Action!
Помимо NavController для навигации также можно использовать действия. Строки, показанные на навигационном графе — это действия.
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.
Запомните, тег аргумента определяется во фрагменте, который получает аргументы.
Класс 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