Компонент архитектуры навигации - передача данных аргумента в startDestination - PullRequest
0 голосов
/ 14 мая 2018

У меня есть действие A, которое запускает действие B и передает ему некоторые намеренные данные. Деятельность B содержит граф навигации из нового компонента архитектуры навигации. Я хочу передать эти данные намерения фрагменту startDestination в качестве аргумента, как это сделать?

Ответы [ 5 ]

0 голосов
/ 27 марта 2019

Я думаю, что это снова изменилось с выпуском 1.0.0. И Google очень хорошо спрятал эту информацию в официальной документации. Или, по крайней мере, я изо всех сил пытался найти его, но наткнулся на него в руководстве Миграция к компоненту навигации . О том, как передать аргументы в место назначения, указано здесь:

https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment

Короче

  1. Вы должны установить график навигации программно:
findNavController(R.id.main_content)
                .setGraph(R.navigation.product_detail_graph, intent.extras)
  1. Не устанавливайте график в объявлении NavHostFragment XML.
  2. Прочтите дополнения со стороны получателя:
val args by navArgs<ProductDetailsArgs>()  
val productId = args.productId

Обновление: Google заявил, что официальная документация для передачи аргументов исходной цели навигации действительно отсутствует. Надеемся, что это будет добавлено в ближайшее время как часть документации по компоненту навигации.

0 голосов
/ 26 декабря 2018

Это было исправлено в 1.0.0-alpha07. Подробнее см.

Решение похоже на ответ Эллиота Шрока, но с использованием официального API.

Надо вручную надуть NavHostFragment или graph

Используйте

NavHostFragment.create(R.navigation.graph, args)

Или

navController.setGraph(R.navigation.graph, args)

Аргументы - это данные, которые мы хотим передать в пункт назначения.

0 голосов
/ 22 мая 2018

Хорошо, я нашел решение этой проблемы благодаря Яну Лейку из команды Google. Допустим, у вас есть действие A, которое запустит действие B с некоторыми намеренными данными, и вы хотите получить эти данные в startDestination. У вас есть два варианта здесь, если вы используете безопасные аргументы, что в моем случае вы могли бы сделать

StartFragmentArgs.fromBundle(requireActivity().intent?.extras)

чтобы прочитать аргументы из намерения. Если вы не используете безопасные аргументы, вы можете извлечь данные из комплекта, используя самостоятельно requireActivity().intent?.extras, который вернет комплект, который вы можете использовать вместо метода фрагмента getArguments(). Вот и все, я пытаюсь, и все отлично работает.

0 голосов
/ 10 декабря 2018

Так что для людей все еще борющихся с этим. Я нашел другой способ сделать это, не используя Safe-Args и шаг, используя ответ @ Elliot's.

Допустим, вы получили несколько аргументов в Деятельности B от Деятельности A, а в вашей Деятельности B есть фрагмент startDestination, который вы инициализируете для контроллера Nav следующим образом:

navController = Navigation.findNavController(this, R.id.detailFragment);

из Nav Controller у вас будет доступ к вашему графику, который вы установили в XML следующим образом, и вы можете установить аргументы в defaultArguments:

navController.getGraph().addDefaultArguments(extras);

Примечание: это также обновит значения ключей, если они уже присутствуют в графе xml

Теперь в вашем Фрагменте вы должны найти аргументы по умолчанию из вашего NavHostFragment, например:

Bundle defaultArguments = NavHostFragment.findNavController(this).getGraph().getDefaultArguments();

и у вас там будут значения. Я не знаю, почему @Elliot считает это важным, но так и должно быть?

ОБНОВЛЕНИЕ альфа09: Аргумент addDefault больше не поддерживается в этой версии, вы должны использовать NavArgument

0 голосов
/ 22 мая 2018

TLDR: необходимо вручную накачать график, добавить ключи / значения в defaultArgs и установить график на navController.

Шаг 1

В документации предлагается установить график в теге <fragment> в макете Activity.Что-то вроде:

<fragment
    android:id="@+id/navFragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:graph="@navigation/nav_whatever"
    app:defaultNavHost="true"
    />

УДАЛИТЬ строку, устанавливающую graph=.

Шаг 2

В Деятельности, которая будет отображать ваш NavHostFragment, накачайте график следующим образом:

val navHostFragment = navFragment as NavHostFragment
val inflater = navHostFragment.navController.navInflater
val graph = inflater.inflate(R.navigation.nav_whatever)

Где navFragment - это идентификатор, который вы дали вашему фрагменту в XML, как указано выше.

Шаг 3 [Важно!]

Создайте пакет, содержащий аргументы, которые вы хотите передать вашему фрагменту startDestination, и добавьте его в графаргументы по умолчанию:

val bundle = Bundle()
// ...add keys and values
graph.addDefaultArguments(bundle)

Шаг 4

Установить график на хосте navController:

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