Обнаружение всплывающих окон в компоненте навигации

#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 для правильной обработки циклической логики. Дайте мне знать, если вы видите какие-либо недостатки в этом подходе.