#android #navigation #android-architecture-navigation #navigation-architecture
#Android #навигация #android-архитектура-навигация #навигация-архитектура
Вопрос:
Как в навигационном компоненте можно определить, выводится ли фрагмент на передний план из события pop?
Я перехожу от A к B, теперь я закрываю B с помощью клавиши back, он возвращается к A, теперь в A (в событии onViewCreated) Я хочу определить, что оно исходит от B.
Ответ №1:
Если мы используем один NavController.
findNavController((R.id.nav_host_fragment)
.addOnDestinationChangedListener{ hostController, destination, _ ->
val push = currentBackStackSize < hostController.bacStack.size // else pop
// Then save current backstack size
}
Это решение может быть не всегда правильным, но в настоящее время я не могу придумать крайний случай. Пожалуйста, не стесняйтесь поправлять меня.
Комментарии:
1. Во фрагменте-A вы можете добавить проверку, как показано ниже, чтобы убедиться, что она не влияет на другие случаи: NavController.addOnDestinationChangedListener{ _, destination, _ -> if(R.id.navigation_fragment_a == destination.id ) {// Сделай свой суфф здесь } }
Ответ №2:
Вот мое решение.
В A добавьте аргумент навигации со значением по умолчанию false
(в nav_graph.xml )
В B добавьте навигацию обратно в A. Чтобы обработать нажатие кнопки «Назад», добавьте следующее в onCreate()
requireActivity().onBackPressedDispatcher.addCallback {
val action = BDirections.actionBFragmentAFragment(true)
findNavController().navigate(action)
}
Теперь вы можете определить, как появляется A. Кроме того, используйте popUpTo для правильной обработки циклической логики. Дайте мне знать, если вы видите какие-либо недостатки в этом подходе.