Отправка данных из фрагмента в основной вид деятельности через NavGraph - PullRequest
1 голос
/ 20 января 2020

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

    val directions = MainNavGraphDirections.launchFragmentWithThisCategoryId(categoryId!!)
            onRoute(AppRoute.Directions(directions))

Приведенный выше код отправляет их на экран объяснения, связанный со связанным categoryId. До этого момента все хорошо, запускается правильный экран объяснения на основе categoryId. На этом экране объяснения у меня есть глубокая ссылка с тегом chatbot://fragment/wizardintro, который должен дать основному действию знать конкретный последующий фрагмент c для отправки пользователю. Я обозначаю все фрагменты, которые могут получить эту глубокую ссылку, с помощью кода ниже.

companion object{
        const val DEEP_LINK = "chatbot://fragment/wizardintro"
    }  

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

 override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        intent?.data?.toString().also { deepLink ->
            when (deepLink) {
               IntroductionFragment.DEEP_LINK ->{
                        val categoryId = intent?.getLongExtra("categoryId", 0L)
                        val directions = MainNavGraphDirections.actionGlobalGoalWizard(categoryId)
                        navController.popBackStack()
                        navController.navigate(directions)
                }    
    }

Теперь моя проблема возникает, когда я пытаюсь найти этот categoryId в Основном действии и передать его следующему фрагменту. Я ничего не получаю, и только Лонг передается по умолчанию. Я думаю, что функция переопределить удовольствие onNewIntent (намерение: намерение?) {} В MainActivity получить любое намерение. Чтобы было ясно, эти намерения отправляются из фрагмента объяснения, который технически является фрагментом, который загружает json. В json есть «route»: {«type»: «route», «url»: «chatbot: /// фрагмент / wizardintro»

В MainActivity функции onNewIntent получают эти намерения распаковывает их с этой строкой intent?.data?.toString().also ..., затем в операторе when выбирает фрагмент, который имеет соответствующий chatbot:///fragment/wizardintro

Я сказал все это, чтобы сказать, что основное действие на самом деле не получает categoryId, это просто выбирает запуск необходимого фрагмента, фактически не имея ничего связанного с categoryId

. Это заставляет меня думать, что первый нажатый элемент CategoryId фактически не передается в MainActivity. Хотя мне кажется, что не должно быть так сложно передавать объекты / данные из фрагмента в действие. Что мне не хватает? Что я могу прочитать, чтобы узнать больше об этом? Спасибо за ваше время и ответы!

1 Ответ

1 голос
/ 20 января 2020

Поскольку мы уже пришли к выводу, что MainActivity не получает categoryId, вам просто нужно передать это categoryId с помощью deep-link.

Однако никакой необходимости в этом нет. сообщение от Fragment до Activity. Вы можете достичь того же результата, общаясь только между Fragment до Fragment и Activity до Fragment.


То, что вы хотите сделать, - это присмотреться к deep-links. и android navigation в AndroidDocs, нажмите здесь .

Как вы можете сказать, есть разные способы go обойти это, начиная с arguments для каждого фрагмента. Назначение categoryId как argument фрагменту поможет вам использовать navigationController и navigate для нового Fragment, передавая ему categoryId.

Теперь я помните, что вы также можете sh запустить его с deep-link; есть также хорошее объяснение здесь . В соответствии с документами вы можете поместить arguments в deep-links следующим образом ...

Заполнители в форме {placeholder_name} соответствуют одному или нескольким символам , Например, http://www.example.com/users/{id} соответствует http://www.example.com/users/4. Компонент Navigation пытается выполнить синтаксический анализ значений заполнителей в соответствующие типы путем сопоставления имен заполнителей с определенными аргументами , которые определены для адресата глубокой ссылки. Если аргумент с таким же именем не определен, для значения аргумента используется тип String по умолчанию.


navigation - это нечто удивительное и способное, вы просто нужно знать обо всем, что он может на самом деле делать. Вы даже можете привязать его к BottomNavBar, с крайне минимальным количеством кода.

Попробуйте просмотреть AndroidDocs об этом, и он наверняка вырастет на вас.

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