#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?
При попытке глобального я получил исключение: «не удается найти из текущего пункта назначения».
Я могу сделать это по глубоким ссылкам, но это не то решение, которое я ищу.
Ответ №1:
Оказалось, что ответ был довольно простым, но надеюсь, что это может кому-то помочь.
Итак, мы хотим перейти от любого фрагмента аутентификации из nav_auth к двум профилям из nav_profile. Что мы делаем:
<action
android:id="@ id/action_global_profileTwoFragment"
app:destination="@id/profileTwoFragment"
app:popUpTo="@id/profileTwoFragment"
app:popUpToInclusive="true"
app:launchSingleTop="false" />
- В функции навигации мы находим NavController. Установите новый график по идентификатору файла навигации, в котором находится нужный фрагмент. И ориентироваться на глобальные действия:
override fun routeToProfileTwoFragment() {
val navController = fragment.findNavController()
navController.setGraph(R.navigation.nav_profile)
navController.navigate(R.id.action_global_profileTwoFragment)
}
- Потому что график был изменен, если мы хотим перейти к основному графику навигации(nav_root), нам нужно изменить его обратно при навигации(также добавьте глобальное действие к главному фрагменту).:
override fun routeMain() {
val navController = fragment.findNavController()
navController.setGraph(R.navigation.nav_root)
navController.navigate(R.id.action_global_home)
}