Навигация по реактивному ранцу: как перейти от дочернего элемента одного вложенного графика к дочернему элементу другого вложенного графика?

#android #navigation #parent-child #android-architecture-navigation #android-jetpack-navigation

Вопрос:

Навигационная структура:

 MainActivity
|- nav_root
   |- HomeFragment
   |- AuthNestedGraph
   |  |- nav_auth
   |  |  |-BeforeOtpFragment(home)
   |  |  |-OtpFragment
   |
   |- ProfileNestedGraph
   |  |- nav_prfole
   |  |  |-ProfileFragmentOne(home)
   |  |  |-ProfileFragmentTwo
 

введите описание изображения здесь
введите описание изображения здесь

Я могу перейти от домашнего фрагмента к BeforeOtp(nav_auth home), к одному файлу(nav_profile home).
Также я могу перейти от любого фрагмента аутентификации к toProfileOne или от фрагментов профиля к BeforeOtp по глобальному идентификатору

Но как перейти к дочернему фрагменту, который не установлен дома, из фрагмента в другом вложенном файле графика/навигации? Хотелось бы отфильтровать/профилировать фрагмент. Как изменить navcontroller?

При попытке глобального я получил исключение: «не удается найти из текущего пункта назначения».

Я могу сделать это по глубоким ссылкам, но это не то решение, которое я ищу.

Этот проект на github

введите описание изображения здесь

Ответ №1:

Оказалось, что ответ был довольно простым, но надеюсь, что это может кому-то помочь.

Итак, мы хотим перейти от любого фрагмента аутентификации из nav_auth к двум профилям из nav_profile. Что мы делаем:

  1. Добавьте глобальное действие во второй профиль в nav_profile: введите описание изображения здесь
     <action
    android:id="@ id/action_global_profileTwoFragment"
    app:destination="@id/profileTwoFragment"
    app:popUpTo="@id/profileTwoFragment"
    app:popUpToInclusive="true"
    app:launchSingleTop="false" />
 
  1. В функции навигации мы находим NavController. Установите новый график по идентификатору файла навигации, в котором находится нужный фрагмент. И ориентироваться на глобальные действия:
     override fun routeToProfileTwoFragment() {
        val navController = fragment.findNavController()
        navController.setGraph(R.navigation.nav_profile)
        navController.navigate(R.id.action_global_profileTwoFragment)
    }

 
  1. Потому что график был изменен, если мы хотим перейти к основному графику навигации(nav_root), нам нужно изменить его обратно при навигации(также добавьте глобальное действие к главному фрагменту).:
     override fun routeMain() {
        val navController = fragment.findNavController()
        navController.setGraph(R.navigation.nav_root)
        navController.navigate(R.id.action_global_home)
    }
 

Проект Github был обновлен

введите описание изображения здесь