Как убить все фрагменты, созданные NavHostFragment? - PullRequest
0 голосов
/ 05 февраля 2020

У меня 2 navigation файла, а в моих Activity, 2 fragment с. Одна из навигаций всегда отображается внутри одного из фрагментов, но другую я показываю только тогда, когда мне это нужно.

То, как они рисуются, это всегда показывающий фрагмент внутри относительного расположения, а другой фрагмент находится в том же относительном расположении с visibility, установленным как gone. Когда мне нужна вторая навигация, я устанавливаю видимость на visible, а когда она мне не нужна, я снова устанавливаю на gone. Визуально это работает хорошо, но я хочу, чтобы sh это когда Мне не нужна вторая навигация, я хочу полностью убить ее и перерисовать в следующий раз, когда она мне понадобится.

Я до сих пор держал NavHostFragment, используемый для запуска навигации, и когда он мне больше не нужен, звоните popBackStack() на navController, но это не так. не работает:

val navHost: NavHostFragment? = null

fun createSecondNav() {
   navHostLogin = NavHostFragment.create(R.navigation.navigation_second)

   theFragment.visibility = View.VISIBLE

   supportFragmentManager.beginTransaction()
       .replace(R.id.theFragment, navHostLogin!!)
       .commit()
}

fun killSecondNav() {
   theFragment.visibility = View.GONE
   navHostLogin?.navController?.popBackStack() // returns false
   navHostLogin = null
}

Так как я могу полностью убить фрагменты, созданные вторым navHost?

1 Ответ

0 голосов
/ 05 февраля 2020

NavController поддерживает свой собственный бэк-стек, независимый от бэк-стека FragmentManager.

И popBackStack() без аргументов выдает этот бэк-стек только один раз:

Попытка вытолкнуть задний стек контроллера. Аналогично тому, когда пользователь нажимает кнопку «Назад» системы, когда связанный хост навигации находится в фокусе.

Пока popBackStack(int destinationId, boolean inclusive) читает:

Попытки вернуть задний стек контроллера обратно в указанное c место назначения.

  • destinationId int: самое верхнее место назначения для сохранения
  • inclusive логическое значение: является ли данное пункт назначения также должен быть вытолкнут.

Так что это должно быть:

navController.popBackStack(R.id.startDestination, true)

Интересно, почему даже при использовании двух NavController, потому что можно установить график во время выполнения с помощью setGraph(NavGraph graph, Bundle startDestinationArgs):

Устанавливает график навигации в указанный график. Любые текущие данные навигационного графика (включая задний стек) будут заменены .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...