在不同包中的活动之间导航

Navigating between activities in different packages

在不同包中的活动之间实现底部导航的最佳方式是什么?包以自上而下的方式相互导入。

设置

我将我的项目构建为一组包;基本上分为主要 app、一些中间 PACKAGE 和最后的 end 包:

因此每个包都包含一个activity、一个或多个片段和一个导航图,该导航图管理它们之间的路由以及一个指向下一个包中的activity的节点 activity app.Main > PACKAGE.ACTIVITY > end.Final

导航

鉴于此结构,我想向每个 activity ACTIVITY 添加底部导航 |Main|...|Final|,这样就有一个 link 回到 Main另一个前进到 Final。向前链接到 Final 非常容易,因为它已经是每个 PACKAGE 导航图中的目标,但我不确定 link 回到 Main 的最佳方法.同样,我想提供 |Main|ACTIVITY|...|Final 的底部导航,以便用户返回到前面的 ACTIVITYMain

注意事项

  1. 为 parent 包中的活动提供导航目标的最佳方法是什么?对我来说,以下似乎可行

    1. 交叉导入 gradle 中的所有包。即 app 导入每个 PACKAGEend,每个 PACKAGE 导入 appendend 导入每个 PACKAGEapp。这不是很 DRY,但它将使所有活动都可以访问。
    2. Main 作为列表传递给 ACTIVITY,以编程方式将其添加到导航菜单。类似地,将 MainACTIVITY 作为列表传递给 Final。在这里我不确定,鉴于活动有生命周期,我是否应该将 activity class 或其实例传递给 child activity ?这里的优点是,如果它丢失了,我可以很容易地创建 backstack。
    3. 查询 "Activity" 返回堆栈,因为它已经详细说明了到 ACTIVITY(即它包含 Main)和 Final(即它包含 MainACTIVITY)。在这里,事后创建后台堆栈变得很棘手。
    4. 使用深度 linking ? (我还在阅读这篇文章)
    5. 是否应该简单地交叉引用每个 PACKAGESmanifest.xml<activity/> 下的每个 activity 设置 parentAttribute 以提供必要的导航目标?在这里我不确定如何最好地将它添加到底部导航 graph/menu ?此外,有必要根据到达 Final.
    6. 所采用的路线以编程方式设置 parentAttrbiute
  2. 取决于 1 中如何提供对活动的访问权限,我不确定使此类目标可访问的最佳方法是什么?

    1. 这可以在导航图中完成吗?我可以通过编程方式将 parent 包中的活动添加到导航图中吗?可以使用 Placeholder 来引用此类项目吗?是否可以编写自定义导航目标来表示此类项目。
    2. 是否应该简单地填充提供给 BottomNavigationView 使用的导航菜单的菜单?可以做到这一点并支持导航图提供的目标,也就是说可以覆盖 OnNavigationItemSelectedLsitener 并一起使用 setupWithNavController 吗?

注意:虽然我看到了一些类似的问题和答案,但我还没有看到任何处理单独包中活动的问题和答案。

我通过询问包管理器来确定在我的应用程序中可用的活动,在我的包名称下,我解决了这个问题。

MANIFEST.xml 下为每个 activity 添加元数据,使我能够过滤我想要引用的活动。添加 android:labelandroid:icon 属性允许我为导航视图中的按钮提供标签和图标,并将它们显示在应用栏上。此外,我可以为每个 activity 创建意图并将其设置在菜单项上(其中一个 android 文档提到任何未直接处理的菜单项都将调用其 intent 属性)。

我将所有这些都包装到一个界面中,现在可以将其附加到我希望在导航组件支持的导航图之外导航的活动中。

注意:深层链接可能用于此目的,但我还没有看到一个很好的例子。