Смысл в том, чтобы получить право NavController
для навигации по правильному графику.Давайте возьмем этот сценарий в качестве примера:
MainActivity
|- MainNavHost
|- NavBarFragment
| |- NestedNavHost
| | |-NestedContentFragment1
| | |-NestedContentFragment2
| |
| |- BottomNavigationView
|
|- LoginFragment
Основной график и вложенный график находятся в отдельных файлах XML: насколько я понял, это необходимо, поскольку навигация ориентирована на разные области макета, поэтому онитребуется два разных NavHost
с.Каждый Navhost
должен будет ссылаться на свой график по идентификатору, что требует, чтобы они были в разных файлах ресурсов.
Дело в том, что для навигации по конкретному графику мы должны получить ссылку на владельца правильного графика: для этого при вызове Navigation.findNavController(view)
аргумент view
имеет решающее значение.
Документы говорят, что
NavHostFragments регистрируют свой контроллер навигации в корне своего поддерева представления, напримерчто любой потомок может получить экземпляр контроллера через методы класса помощника Navigation
Так, например, если внутри NavBarFragment
мы пишем
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
navController = Navigation.findNavController(view)
}
здесь view
является parent из NestedNavHost
(то есть вложенный NavHostFragment
), не являющийся потомком, что означает, что findNavController
будет искать в дереве вверх по течению и вернет MainNavHost
'* NavController
.
Если вместо этого мы напишем
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val fragmentContainer = view.findViewById<View>(R.id.nestedNavHostFragment)
navController = Navigation.findNavController(fragmentContainer)
}
, где nestedNavHostFragment
- это идентификатор в теге fragment
в макете, мы получаем ссылку на правильный NestedNavHost
, потому что представлениеТеперь перейти к findNavController
принадлежитNestedNavHost
поддерево.
Аналогично, если вам нужно получить ссылку на основной NavController
изнутри NestedContentFragment
, вот что мы можем сделать:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// we can get the innermost NavController using this view,
// because we are inside its subtree:
nestedNavController = Navigation.findNavController(view)
// we can find the outer NavController passing the owning Activity
// and the id of a view associated to that NavController,
// for example the NavHostFragment id:
mainNavController = Navigation.findNavController(activity!!, R.id.mainNavHostFragment)
}