android - 在不同包中的活动之间导航
问题描述
在不同包中的活动之间实现底部导航的最佳方法是什么?包以自上而下的方式相互导入。
设置
我将我的项目构建为一组包;基本上分为 main app
,一些中间PACKAGE
s 和 finalend
包:
app
- 提供主应用程序并作为项目构建目标。它包含一个活动,Main
,为应用程序提供主要入口点。导航图只是将唯一的片段映射到ACTIVITY
每个导入PACKAGE
的 ' 提供的 ' 上。PACKAGE
- 提供单个活动 ,ACTIVITY
来管理专用任务。导航图管理支持活动的各个片段之间的关系;此外,它还包括指向Final
从end
.end
- 提供单个活动 ,Final
每次PACKAGE
导入它都将其用作其导航图的终止导航链接。
因此,每个包都包含一个活动、一个或多个片段和一个导航图,该导航图管理它们之间的路由,以及一个指向按顺序排列的下一个包中的活动的节点app.Main > PACKAGE.ACTIVITY > end.Final
。
导航
鉴于这种结构,我想向|Main|...|Final|
每个活动添加底部导航,,以便ACTIVITY
有一个返回到 的链接Main
和另一个向前的链接Final
。向前链接Final
很容易,因为它已经是每个PACKAGE
导航图中的目标,但我不确定链接回的最佳方法Main
。同样,我想提供底部导航,|Main|ACTIVITY|...|
, 以便Final
用户返回到前面的ACTIVITY
或Main
。
注意事项
为父包中的活动提供导航目标的最佳方式是什么?对我来说,以下似乎可行
- 交叉导入 gradle 中的所有包。那就是
app
导入每个PACKAGE
andend
,每个都PACKAGE
导入app
andend
,然后end
导入每个PACKAGE
andapp
。这不是很干,但它将使所有活动都可以普遍访问。 Main
作为列表传递给ACTIVITY
,以编程方式将其添加到导航菜单。同样将Main
andACTIVITY
作为列表传递给Final
. 在这里我不确定,鉴于活动有生命周期,我是否应该将活动类或其实例传递给子活动?这里的好处是,如果它丢失了,我可以很容易地创建 backstack。- 询问“活动”返回堆栈,因为它已经详细说明了到
ACTIVITY
(即它包含Main
)和Final
(即它包含Main
和ACTIVITY
)的路由。在这里,事后创建 backstack 变得很棘手。 - 使用深度链接?(我还在读这个)
- 是否应该简单地交叉引用每个活动设置
parentAttribute
下的每个<activity/>
活动设置以提供必要的导航目标?在这里,我不确定如何最好地将其添加到底部导航图/菜单中?此外,有必要根据到达的路线以编程方式设置。PACKAGES
manifest.xml
parentAttrbiute
Final
- 交叉导入 gradle 中的所有包。那就是
根据 1 中提供对活动的访问方式,我不确定使此类目标可访问的最佳方法是什么?
- 这可以在导航图中完成吗?我可以以编程方式将父包中的活动添加到导航图吗?可以
Placeholder
用来引用这些项目吗?是否可以编写自定义导航目的地来表示此类项目。 - 是否应该简单地填充提供给使用的导航菜单的菜单
BottomNavigationView
?可以做到这一点并支持导航图提供的目标,即可以覆盖两者OnNavigationItemSelectedLsitener
并setupWithNavController
一起使用吗?
- 这可以在导航图中完成吗?我可以以编程方式将父包中的活动添加到导航图吗?可以
注意:虽然我看到了一些类似的问题和答案,但我还没有看到任何处理单独包中的活动的问题和答案。
解决方案
我通过询问包管理器以确定我的应用程序中可用的活动(在我的包名称下)解决了这个问题。
在 下为每个活动添加元数据MANIFEST.xml
允许我过滤我想要引用的活动。添加android:label
和android:icon
属性允许我为导航视图中的按钮提供标签和图标,并将它们显示在应用栏上。此外,我可以为每个活动创建意图并在菜单项上设置它们(其中一个 android 文档提到任何未直接处理的 menuItem 都将调用其意图属性)。
我将所有这些封装到一个界面中,现在可以将其附加到我希望在导航组件支持的导航图之外导航的活动上。
注意:深度链接可能会达到这个目的,但我还没有看到一个很好的例子。
推荐阅读
- javascript - 保存的图像说无效图像。这段代码有什么问题?
- python - 使用 PyQt5 获取滑块值
- java - .project 文件、.settings 文件夹、bin 文件夹在意外导入 IntelliJ Maven 后继续在 VSCode 中自动生成
- r - R中没有发现符号变化错误但不是excel
- java - 从多命名空间 XML 中删除命名空间的数据
- docker - 自动从 php fpm 镜像启动 Nginx
- matlab - MATLAB 表 - 选择满足条件的第一行
- windows - 在 Get cmdlet 中过滤掉空参数值
- mongodb - 无法从远程服务器导出 MongoDB 数据库
- symfony - 如何将 Bootstrap 添加到我的 Symfony 4.1 项目中?