多module(模块)使用Navigation功能

使用 Navigation + Dynamic Feature Module 实现模块化 androidx navigation 2.3.0 加入了对 dynamic feature module 的导航支持,因此我们利用这个来分离出多个功能 module 来实现模块化 国内基本不用的 dynamic feature module Android App Bundle 是官方 18 年推出的动态发布方案,类似国内各种插件化方案。不过它需要 Google Play Store 支持,这导致在国内无法使用 借着 navigation 组件支持 dynamic feature module 阅读详情

Navigation相信大家都熟悉,网上也有很多教程,但是很少有多Module切换的时候,要怎么使用的,用百度搜索了各种都没找到,后来用Google,一会就搜到了方法

思路是这样的:通过包名,导航文件,找到导航id,而不用module之间相互依赖

interface NavigationGraphRoute {

    val navigation: String
        get() = "navigation"

    var navGraph: NavGraph

    /**
    The .xml name for the nav-graph
     */
    val graphName: String

    /**
    The full package name where the nav-graph is located
     */
    val packageName: String

    /**
     * The navController
     */
    var localNavController:NavController

    fun addNavGraphDestination(
            navController: NavController,
            context:Context
    ): NavGraph {
        val navigationId =
                context.resources.getIdentifier(graphName,
                        navigation, packageName)

        val newGraph = navController.navInflater.inflate(navigationId)

        navController.graph.addDestination(newGraph)
        navGraph = newGraph
        localNavController = navController

        return newGraph
    }

    fun navigateTo() {
        localNavController.navigate(navGraph.id)
    }
}

这是基类,然后根据各种业务,写一写个性化定制:

class SecondFragmentRoute() : NavigationGraphRoute {

    /**
     * Contains the destination graph once inflated
     * */
    override lateinit var navGraph: NavGraph

    /**
     * navController
     */
    override lateinit var localNavController: NavController

    override val graphName: String
        get() = "nav_fragment2"

    override val packageName: String
        get() = BuildConfig.APPLICATION_ID


}

如上,Fragment1和Fragmet2,处于两个不同的Module,并且没有相互依赖,现在要从Fragment1跳转到Fragment2

Button btnNext = view.findViewById(R.id.btn_next);
        final SecondFragmentRoute route = new SecondFragmentRoute();
        route.addNavGraphDestination(Navigation.findNavController(btnNext),getContext());

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Navigation.findNavController(v).navigate(R.id.action_firstFragment_to_secondFragment);
                route.navigateTo();
            }
        });

这里只是部分核心代码片段,需要注意两点:

1.两个Module的导航文件,命名一定要不同,因为他是在同样的包名下寻找的,一样的话系统会找混,导致跳转失败

2.导航文件的导航界面,id也命名不同,否则,也会无法正常跳转,它会认为自己跳转自己,如果他们命名id一样

 

这是nav_fragment的导航文件

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/firstFragment"
    android:id="@+id/nav_fragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.navigationtest.FirstFragment"
        android:label="first_layout"
        tools:layout="@layout/first_layout" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigationtest.SecondFragment"
        android:label="second_layout"
        tools:layout="@layout/second_layout" />
</navigation>

然后是nav_fragment2的文件

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/secondFragment"
    android:id="@+id/nav_fragment2">

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigationtest.SecondFragment"
        android:label="second_layout"
        tools:layout="@layout/second_layout" />
</navigation>

可以看到 navigation的命名节点的id是不同的,原来是相同的,无法跳转,改成不同的,就可以正常跳转了

android-multi-module-navigation:带有多模块项目的新导航组件的展示应用程序 android-multi-module-navigation 带有多模块项目的新导航组件的展示应用程序 查看有关Medium的文章: 立即下载

相关推荐

android-multi-modules-navigation-demo:关于多模块项目导航的Android演示

android-multi-modules-navigation-demo 关于在多模块项目上导航的Android演示。 有关更多详细信息,请参见。

Compose Navigation用于Android多module项目最佳实践

在本文中,我们将采取同一个项目并扩展它以实现最佳实践。该项目具有文章、设置和关于屏幕的抽屉导航。项目的输出如下所示:当你有一个多屏幕的项目时,每个屏幕至少必须有自己单独的模块。在我们的例子中,我为每个屏幕创建了三个单独的模块,并在应用程序模块中使用它们来实现基本的导航。

虎哥LoveDroid 1224

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 446

Android JetPack底部导航Navigation 组件的介绍与使用

在以前的应用中,针对多导航模块的使用,常见的有tabhost或者FragmentTabHost,但是这些在使用的过程中,非常臃肿,包括加载和管理也不如人意。在AndroidX中,官方引入Navigation模块,通过布局绑定fragment来完成

1670

新手如何学习车载底层嵌入式软件开发(AutoSar)

汽车嵌入式开发

ACarSoft的博客 4222

从CCD数据上报看wxHOOK的封号风险与规避

本文深入分析了微信CCD数据上报机制对wxHOOK的检测逻辑与封号风险,揭示了调试器路径暴露、非白名单DLL加载和内存校验失败等关键风险点。通过实战案例和规避方案,帮助开发者理解如何安全使用wxHOOK技术,避免封号风险,包括内存镜像欺骗、内核级隐蔽和硬件辅助方案等高级技巧。

weixin_27875131的博客 633

基于Hilt的依赖注入跨模块导航框架的Kotlin实现

基于Hilt的依赖注入跨模块Android App 导航框架,使用Kotlin语言实现,采用了清洁架构的思想,支持MVVM,协程,适合多模块或者多组件的项目使用,在设计上让导航相关的代码更干净、更规范。

savelove911的专栏 1393

Python爬虫实战:爬取携程旅游平台数据,我拆解了动态反爬+Cookie续命(附完整可运行代码)

反爬类型表现形式应对思路sign参数返回403/空数据逆向JS还原加密逻辑Cookie时效登录后1小时Cookie失效定时刷新Cookie/保存登录态行为检测爬取过快触发验证码模拟真人延时/随机点击IP封禁单IP爬取超50条数据被封付费代理池/降低请求频率爬取携程旅游平台数据的核心,不是“简单的HTTP请求”,而是“理解平台的反爬逻辑并合规适配”——从sign参数破解到Cookie维护,再到行为模拟,每一步都是对HTTP协议、前端加密、用户行为的深度理解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

在多模块应用中使用navigation不知不觉都是这么用

核心common模块定义了Route1->screen1,Route2->screen2,Route3->screen3.....如果我现在单独使用 featureB,但是featureB中因为导航的这个逻辑,又要不得不去关联featureA。假设我们有主模块 app, 功能模块 featureA, featureB,所以,我们不该在内部的功能部分看到navigate的导航逻辑。所以,需要把导航的逻辑到需要通过lambda来提升到外部去。我们把导航逻辑写到模块中带来的问题是,

github_35581409的博客 263

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「前端可视化项目实战:智慧农业监控大屏开发详解」 「农作物可视化监控:用 Vue 和 ECharts 构建大屏应用」 「从零开始开发一个智慧农业数据大屏(代码+图表展示)」 「前端新手也能实现!智慧农业监控大屏开发教程」 「用 Vue 和 ECharts 搭建动态数据大屏:详细图文教程」 「学习前端大屏开发:

sky10100100的博客 1535

Dify基础:Dify平台的本地化部署(含windows部署中,常见问题及解决方案)

第一种比较简单,只需要在浏览器中,打入https://dify.ai/就可以。这个指令虽然看起来简单,但实际上涉及到对docker的使用。这个项目既然有github地址,那它一般就是开源的。我们点开这个github地址,便能看到dify的私有化部署方式。我们可以看到,还是上面那个图,有个按钮,是指向该项目的Github地址的。第二步:按照dify的github给出的指令,对dify进行安装。第一步:我们把dify下载到自己的电脑(或者服务器)上。这里,我们只考虑第二种方式,也就是私有化部署。

xiezhipu的博客 1万+

【鸿蒙】Navigation的使用(路由跳转)

NavDestination的生命周期可以参考文档(如:onShown,onWillShow等),直接在组件后.onShown使用。下面是自定义组件中使用,需要声明,然后用 NavDestination 包裹。6、在页面中使用也需要用 NavDestination 包裹,否则跳转不过来。还有基于Navigation封装的第三方插件。并在文件中写入如下实例代码。或pop时携带有参数。

qq_22015625的博客 1433

PLC凸轮开关指令编程应用——控制算法

凸轮开关指令的作用是在PLC程序中根据凸轮开关(Cam Switch)的状态执行不同的操作。凸轮开关通常是机械式的开关装置,它的位置会随着机械运动的变化而改变。凸轮开关的状态可以用来检测机器的位置、角度或其他相关信息,从而触发相应的控制动作。总结起来,凸轮开关指令是PLC编程中常用的一种控制算法,通过检测凸轮开关的状态来触发相应的操作。本文将介绍凸轮开关指令的应用和相应的控制算法,并提供相关的源代码示例。在这个示例中,凸轮开关状态的值代表不同的位置,根据凸轮开关状态的不同,执行相应的动作。

LiJavascript的博客 1035

React Native Safe Module 使用教程

React Native Safe Module 使用教程 项目介绍 react-native-safe-module 是一个用于 React Native 的开源库,旨在提供一种安全的方式来处理模块和组件。它通过抽象层来确保模块的正确加载和使用,从而避免了一些常见的错误和问题。 项目快速启动 安装 首先,你需要在你的 React Native 项目中安装 react-native-safe-mo...

gitblog_00755的博客 745

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

纯血鸿蒙NEXT-组件导航 (Navigation)

Navigation组件导航的使用

知识共享,你我皆是知识的搬运工 2852

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HarmonyOS 页面路由Router切换组件导航Navigation

Router切换Navigation主要需要主要以下几点,页面配置和生命周期有点区别,Navigation具有更强的功能和自定义能力,目前最新版本的 api中已经废弃Router相关方法,推荐使用Navigation组件作为应用的路由框架。组件导航(Navigation)主要用于实现页面间以及组件内部的页面跳转,支持在不同组件间传递跳转参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能。

cj641809386的专栏 1815

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在鸿蒙 (HarmonyOS)中Navigation路由跳转的使用

Navigation天然具备标题、内容、回退按钮的功能联动Navigation天然⽀持⼀多,Router不⽀持;Navigation没有路由数量限制,Router限制32个;Navigation可以嵌套在模态对话框中,也就是说可以模态框中定义路由,Router不⽀持他们的主要区别就是router适用于简单场景的跳转一般来说项目小跳转量不多简易的页面可以使用router 第二步:实例化后存入到Provide中因为后续其他页面组件中也需要使用到 第三步:例如在首页创建一个Component子组件那就

qihao886的博客 1085

Android Navigation-SafeArgs模块的引入问题

Android Navigation-SafeArgs模块的引入问题

qq_40517035的博客 2922

在安卓kotlin中使用Navigation

Step 1 Add navigation components to the project At the top of the project-level build.gradle file, along with the other ext variables, add a variable for the navigationVersion. To find the latest navigation version number, see Declaring dependencies in the

weixin_44727250的博客 505

Compose 调用 - 导航 Navigation3 正式版

路径可以是任何类型但通常是简单的可序列化数据类。使用密封接口方便调用和限制结构。路径无参用 data object,有参用 data class。添加 @Serializable 注解,使其可以序列化。继承 NavKey 接口,作为可以被数据持久化的标记。//无参//有参//嵌套路径。

HugMua的博客 1226

记录Android 组件化中使用Navigation中的一个坑.

问题如下: 所有Fragment分布在不同的Module内. 例如: Fragment_1在Module_1中. Fragment_2在Module_2中. navigation文件有且只能在app这个依赖所有module的壳中.因为不在app内,则无法引用所有的Fragment. 那跳转可以使用 int yId = getResources().getIdentifier(“actionname”,“id”,“packname”);寻找资源 Navigation.findNavController(bi

qq_33902817的博客 969

Navigation路由跳转

Navigation是路由容器组件,一般作为首页的根容器,适用于模块内和跨模块的路由切换。Navigation子页是NavDestination包含的子组件,使用NavPathStack实现页面路由。作用: 组件导航(Navigation)支持更丰富的动效、具有一次开发多端部署能力和更灵活的栈操作。当然,我们今天只说明一下navigation路由的页面跳转。

m0_73863018的博客 701

RN-Navigation

在React Native 项目中导入 Navigation模块 这个过程的学习费了差不多一天的工作量;人间地狱 其实也简单,就是重复冒出慕名奇妙的错误让我抓狂 先是 yarn add 后react-native版本不兼容,然后升级版本,有出现端口占用,清除占用端口,然后就是react-native-gesture-handler这个JB玩意在作怪。 期间出现几个RN例常错误: 1,null is...

u014773226的博客 467

在功能模块中使用导航 | MAD Skills

这是关于导航 (Navigation) 的第二个 MAD Skills 系列,本文是导航组件系列的第四篇文章,如果您想回顾过去发布的内容,请通过下面链接查看:导航组件概览导航到对话框在应用...

Android开发者 427
上一篇: 基于Android的Camera2封装,可以实时获取到预览画面和图片
下一篇: Android soundpool release卡住
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值