Компонент навигации: передача safeArgs из активности во фрагмент

У меня есть два графика, поэтому первый график переходит от одного фрагмента к активности, передавая ей safeArgs.

val action = MyFragmentDirections.actionMyActivity(arg1, arg2)
Navigation.findNavController(view).navigate(action)  

Во втором случае я хочу передать эти аргументы из MyActivity фрагменту, который принадлежит этому действию.

Я могу получить аргументы:

val args = MyActivity.fromBundle(intent.extras)

Проблема в том, что для этого действия нет Directions файла, поэтому я не могу передать аргументы.


person JavierSegoviaCordoba    schedule 11.12.2018    source источник
comment
Вы пытаетесь передать аргументы startDestination графа навигации вашего второго действия?   -  person ianhanniballake    schedule 11.12.2018
comment
Фрагмент из MainActivity перейдите к объекту DetailActivity, который имеет фрагмент (это домашний фрагмент или startDestination графа DetailActivity). Можете ли вы проверить мой ответ, чтобы узнать, правильный ли это способ решения?   -  person JavierSegoviaCordoba    schedule 11.12.2018


Ответы (2)


Navigation 1.0.0-alpha07 исправил ошибку запрос функции для передачи аргументов начальному месту назначения графика.

Чтобы использовать это, вам необходимо:

  1. Удалите атрибут app:navGraph из своего NavHostFragment
  2. Позвоните findNavController(R.id.your_nav_host_fragment).setGraph(R.navigation.your_graph, intent.extras)

Используя R.id ваших NavHostFragment и R.navigation, которые вы ранее указали в своем теге app:navGraph. Передав аргументы в вызов setGraph, ваш начальный пункт назначения получит аргументы напрямую, без повторного вызова navigate (что по умолчанию создаст новый экземпляр пункта назначения в вашем заднем стеке, а не то, что вы хотите).

person ianhanniballake    schedule 11.12.2018
comment
findNavController () запрашивает у меня представление, я использовал findViewById. Можете ли вы отредактировать его, чтобы найтиNavController (findViewById (R.id.your_nav_host_fragment)), пожалуйста? Спасибо за помощь! - person JavierSegoviaCordoba; 12.12.2018
comment
Похоже, вы не используете -ktx зависимости (действительно, действительно должны, если вы пишете код Kotlin). Правильная замена, если вы не используете расширения Kotlin: Navigation.findNavController(this, R.id.your_nav_host_fragment) - person ianhanniballake; 12.12.2018
comment
@Ian Спрашивающий упомянул, что он передает данные второму действию через Safe Args. Если второе действие находится в отдельном модуле (который не зависит от первого модуля), можно ли использовать Safe Args? Я вижу, что сгенерированный класс Args создается в первом модуле, поэтому второе действие не имеет к нему доступа. Спасибо! - person ; 16.06.2019
comment
Вау, NVM. Я заговорил слишком рано. Я могу просто вытащить статистику из намерения .. круто! - person ; 16.06.2019
comment
Есть ли способ использовать SafeArgs с этим? - person m0skit0; 09.10.2019
comment
setGraph не сработал для нас, потому что при повторном присоединении фрагмента контейнера (MyActivity в примере) целевой фрагмент всегда воссоздается, а не повторно присоединяется. Решение: navHostFragment.arguments = requireArguments (); и в целевом фрагменте: arguments = requireParentFragment (). requireArguments () - person Sebas LG; 07.06.2020
comment
@ianhanniballake Я использую nav версии 2.3.5 и сталкиваюсь с той же проблемой. Есть ли более эффективный способ добиться этого? - person Sweta Jain; 31.05.2021

Я не знаю, рекомендуется ли это, но это работает:

val args = MyActivity.fromBundle(intent.extras)
navController.navigate(R.id.myActivityFragment, args.toBundle())
person JavierSegoviaCordoba    schedule 11.12.2018
comment
Использование аргументов фрагмента: val bundle = bundleOf("message_tip" to "") findNavController().navigate(R.id.helpFragment, HelpFragmentArgs.fromBundle(bundle).toBundle()) - person jnfran92; 09.04.2021