1

在我的应用程序中,我使用具有多个片段架构的单个活动,并使用导航库在它们之间导航。在其中一个片段中,我有多个类别,每个类别都与一个 ID 相关联。当点击一个类别时,我会使用下面的代码将用户带到相应的类别解释器屏幕。

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

上面的代码将它们发送到与相关联的解释器屏幕categoryId。一切都很好,直到此时,正确的解释器屏幕基于categoryId. 在这个解释器屏幕中,我有一个带有标签的深层链接,该标签chatbot://fragment/wizardintro应该让主要活动知道要将用户发送到的特定后续片段。我用下面的代码表示所有可以接收此深层链接的片段。

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现在,当我尝试在 Main Activity 中检索它并将其传递给下一个片段时,我的问题就出现了。我什么也没得到,只有默认的 Long 被传递。我认为 MainActivity 中的函数覆盖 fun onNewIntent(intent: Intent?) { } 接收任何意图。需要明确的是,这些意图是从解释器片段发送的,从技术上讲,它是一个加载 json 的片段。在 json 中有一个 "route": {"type": "route", "url": "chatbot:///fragment/wizardintro"

在 MainActivity 中,onNewIntent 函数接收这些意图并使用这一行将它们解包,intent?.data?.toString().also ...然后在 when 语句中选择一个具有匹配项的片段chatbot:///fragment/wizardintro

我说这一切是为了说主要活动实际上并没有获得 categoryId,它只是选择启动必要的片段,而实际上没有任何与categoryId

这让我觉得第一次点击的 categoryId 实际上并没有传递给 MainActivity。尽管在我看来,将对象/数据从片段传递到活动似乎并不难。我错过了什么?我可以阅读什么来对自己进行更多的教育?感谢您的时间和回复!

4

1 回答 1

1

MainActivity既然我们已经得出了没有得到的结论categoryId,你只需要categoryId通过deep-link.

Fragment但是,从到不需要任何通信Activity。您可以通过仅在FragmenttoFragmentActivityto之间进行通信来获得相同的结果Fragment


您要做的是更仔细地查看deep-links和查看android navigationAndroidDocs,单击此处

如您所知,有不同的方法可以解决这个问题,从arguments每个片段开始。categoryId将as分配argument给 Fragment 将帮助您将navigationControllerand传递navigate给 new Fragment,同时将 the 传递categoryId给它。

现在,我知道您还希望使用deep-link;启动它。这里也有很好的解释。根据文档,您可以argumentsdeep-links以下方式放置...

占位符形式{placeholder_name}匹配一个或多个字符。例如,http://www.example.com/users/{id}匹配http://www.example.com/users/4。导航组件尝试通过将占位符名称与为深度链接目标定义的已定义参数匹配,将占位符值解析为适当的类型。如果未定义具有相同名称的参数,则将默认 String 类型用于参数值。


navigation是令人惊奇和有能力的东西,你只需要知道它实际上可以做什么。你甚至可以BottomNavBar用极少的代码将它绑定到一个 .

尝试查看有关它的AndroidDocs,它肯定会在你身上成长。

于 2020-01-20T20:20:49.903 回答