通过 NavGraph 将数据从 Fragment 发送到 Main Activity
Send Data from Fragment to Main Activity through NavGraph
在我的应用程序中,我使用具有多个片段架构的单个 Activity,并使用导航库在它们之间导航。在其中一个片段中,我有多个类别,每个类别都与一个 ID 相关联。单击某个类别后,我会使用以下代码将用户带到相应的类别解释器屏幕。
val directions = MainNavGraphDirections.launchFragmentWithThisCategoryId(categoryId!!)
onRoute(AppRoute.Directions(directions))
以上代码将它们发送到与关联 categoryId
关联的解释器屏幕。到目前为止一切都很好,根据 categoryId
启动了正确的解释器屏幕。在这个解释器屏幕中,我有一个带有标签 chatbot://fragment/wizardintro
的 deep-link,它应该让主要 activity 知道要将用户发送到的特定后续片段。我用下面的代码表示所有可以接收这个 deep-link 的片段。
companion object{
const val DEEP_LINK = "chatbot://fragment/wizardintro"
}
在 MainActivity 中,我有一个方法可以接收所有不同的深层 linking 意图并将它们与将使用以下代码启动相应类别片段的标签相匹配。
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)
}
}
现在,当我尝试在 Main Activity 中检索此 categoryId
并将其传递给下一个片段时,我的问题出现了。我没有得到任何东西,只有默认的 Long 被传递。我认为 MainActivity 中的函数 override fun onNewIntent(intent: Intent?) { } 收到任何意图。需要明确的是,这些意图是从解释器片段发送的,从技术上讲,该片段是加载 json 的片段。在 json 中有一个 "route": {"type": "route", "url": "chatbot:///fragment/wizardintro"
在 MainActivity 中,onNewIntent 函数接收这些意图,用这一行解压缩它们 intent?.data?.toString().also ...
然后在 when 语句中选择一个具有匹配 chatbot:///fragment/wizardintro
[=21 的片段=]
我说这一切是为了说明主要的 activity 实际上并没有获得 categoryId,它只是选择启动必要的片段而实际上没有与 categoryId
[=21= 相关联的任何东西]
这让我觉得第一次点击的 categoryId 实际上并没有传递给 MainActivity。尽管对我来说,将 objects/data 从片段传递到 activity 似乎不应该这么难。我错过了什么?我可以阅读什么来在这方面对自己进行更多的教育?
感谢您的宝贵时间和回复!
因为我们已经得出 MainActivity
没有得到 categoryId
的结论,您只需要将 categoryId
与 deep-link
一起传递即可。
但是,Fragment
到 Activity
不需要任何通信。
您可以仅通过 Fragment
到 Fragment
和 Activity
到 Fragment
.
之间的通信来获得相同的结果
您要做的是更仔细地查看 AndroidDocs 中的 deep-links
和 android navigation
,click here.
正如您所知,有不同的方法可以解决这个问题,从每个片段的 arguments
开始。将 categoryId
作为 argument
分配给片段将帮助您将 navigationController
和 navigate
用于新的 Fragment
,同时将 categoryId
传递给它。
现在,我知道您也希望通过 deep-link
启动它;关于here. According to the docs也有很好的解释,你可以用下面的方式把arguments
放在deep-links
中...
Placeholders in the form of {placeholder_name}
match one or more characters. For example, http://www.example.com/users/{id}
matches http://www.example.com/users/4
. The Navigation component attempts to parse the placeholder values into appropriate types by matching placeholder names to the defined arguments that are defined for the deep link destination. If no argument with the same name is defined, a default String type is used for the argument value.
navigation
是令人惊奇和强大的东西,您只需要了解它实际可以做的一切。您甚至可以用极少的代码将它绑定到 BottomNavBar
。
试着复习一下 AndroidDocs,它肯定会在你身上成长。
在我的应用程序中,我使用具有多个片段架构的单个 Activity,并使用导航库在它们之间导航。在其中一个片段中,我有多个类别,每个类别都与一个 ID 相关联。单击某个类别后,我会使用以下代码将用户带到相应的类别解释器屏幕。
val directions = MainNavGraphDirections.launchFragmentWithThisCategoryId(categoryId!!)
onRoute(AppRoute.Directions(directions))
以上代码将它们发送到与关联 categoryId
关联的解释器屏幕。到目前为止一切都很好,根据 categoryId
启动了正确的解释器屏幕。在这个解释器屏幕中,我有一个带有标签 chatbot://fragment/wizardintro
的 deep-link,它应该让主要 activity 知道要将用户发送到的特定后续片段。我用下面的代码表示所有可以接收这个 deep-link 的片段。
companion object{
const val DEEP_LINK = "chatbot://fragment/wizardintro"
}
在 MainActivity 中,我有一个方法可以接收所有不同的深层 linking 意图并将它们与将使用以下代码启动相应类别片段的标签相匹配。
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)
}
}
现在,当我尝试在 Main Activity 中检索此 categoryId
并将其传递给下一个片段时,我的问题出现了。我没有得到任何东西,只有默认的 Long 被传递。我认为 MainActivity 中的函数 override fun onNewIntent(intent: Intent?) { } 收到任何意图。需要明确的是,这些意图是从解释器片段发送的,从技术上讲,该片段是加载 json 的片段。在 json 中有一个 "route": {"type": "route", "url": "chatbot:///fragment/wizardintro"
在 MainActivity 中,onNewIntent 函数接收这些意图,用这一行解压缩它们 intent?.data?.toString().also ...
然后在 when 语句中选择一个具有匹配 chatbot:///fragment/wizardintro
[=21 的片段=]
我说这一切是为了说明主要的 activity 实际上并没有获得 categoryId,它只是选择启动必要的片段而实际上没有与 categoryId
[=21= 相关联的任何东西]
这让我觉得第一次点击的 categoryId 实际上并没有传递给 MainActivity。尽管对我来说,将 objects/data 从片段传递到 activity 似乎不应该这么难。我错过了什么?我可以阅读什么来在这方面对自己进行更多的教育? 感谢您的宝贵时间和回复!
因为我们已经得出 MainActivity
没有得到 categoryId
的结论,您只需要将 categoryId
与 deep-link
一起传递即可。
但是,Fragment
到 Activity
不需要任何通信。
您可以仅通过 Fragment
到 Fragment
和 Activity
到 Fragment
.
您要做的是更仔细地查看 AndroidDocs 中的 deep-links
和 android navigation
,click here.
正如您所知,有不同的方法可以解决这个问题,从每个片段的 arguments
开始。将 categoryId
作为 argument
分配给片段将帮助您将 navigationController
和 navigate
用于新的 Fragment
,同时将 categoryId
传递给它。
现在,我知道您也希望通过 deep-link
启动它;关于here. According to the docs也有很好的解释,你可以用下面的方式把arguments
放在deep-links
中...
Placeholders in the form of
{placeholder_name}
match one or more characters. For example,http://www.example.com/users/{id}
matcheshttp://www.example.com/users/4
. The Navigation component attempts to parse the placeholder values into appropriate types by matching placeholder names to the defined arguments that are defined for the deep link destination. If no argument with the same name is defined, a default String type is used for the argument value.
navigation
是令人惊奇和强大的东西,您只需要了解它实际可以做的一切。您甚至可以用极少的代码将它绑定到 BottomNavBar
。
试着复习一下 AndroidDocs,它肯定会在你身上成长。