当前位置: 首页 > news >正文

Android 学习之 Navigation导航

1. Navigation 介绍

Navigation 组件 是 Android Jetpack 的一部分,用于简化应用内导航逻辑,支持 Fragment、Activity 和 Compose 之间的跳转。核心优势:

  • 单 Activity 架构:减少 Activity 冗余,通过 Fragment 或 Compose 实现界面切换。
  • 可视化导航图:通过 XML 或代码声明页面跳转关系。
  • 统一返回栈管理:自动处理返回按钮和手势导航。
  • 类型安全的参数传递:通过 Safe Args 插件或 Compose 的 Route 实现。

2. 项目中导入 Navigation 插件

传统 View 项目 (XML + Fragment)

build.gradle (Module) 中添加依赖:

dependencies {
    def nav_version = "2.7.7"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    // Safe Args 插件(可选)
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}

Compose 项目

build.gradle (Module) 中添加:

dependencies {
    def nav_version = "2.7.7"
    implementation "androidx.navigation:navigation-compose:$nav_version"
}

在导入时要尤其注意导入的是 navigation-fragment 还是 navigation-compose 两者的使用有很大区别


3. 实现 Navigation 导航(XML + Fragment)

步骤 1:创建导航图

res/navigation 目录下新建 nav_graph.xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.HomeFragment"
        android:label="Home">
        <action
            android:id="@+id/action_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment"
        android:label="Detail" />
</navigation>

其中的action属于显式定义动作,如果是跳转页面的话可以不显式定义,但如果使用androidx.navigation:safe-args插件必须定义动作才能生成参数类。

步骤 2:配置 NavHost

在 Activity 的布局中添加 NavHostFragment

<androidx.fragment.app.FragmentContainerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true" />

步骤 3:执行导航操作

在 Fragment 中通过 NavController 跳转:

// HomeFragment.kt
button.setOnClickListener {
    findNavController().navigate(R.id.action_to_detail)
}

参数传递(Safe Args)

  1. nav_graph.xml 中定义参数:
<fragment android:id="@+id/detailFragment">
    <argument
        android:name="userId"
        app:argType="string" />
</fragment>
  1. 通过 Safe Args 传递参数:
val action = HomeFragmentDirections.actionToDetail("user123")
findNavController().navigate(action)

4. 基于 Compose 的 Navigation 导航

步骤 1:定义路由

在 Compose 中通过字符串定义路由:

object Routes {
    const val HOME = "home"
    const val DETAIL = "detail/{userId}"
}

步骤 2:配置 NavController

MainActivity 中初始化导航控制器:

val navController = rememberNavController()
NavHost(navController = navController, startDestination = Routes.HOME) {
    composable(Routes.HOME) {
        HomeScreen(onNavigateToDetail = { userId ->
            navController.navigate("detail/$userId")
        })
    }
    composable(Routes.DETAIL) { backStackEntry ->
        val userId = backStackEntry.arguments?.getString("userId")
        DetailScreen(userId = userId)
    }
}

步骤 3:触发导航

HomeScreen 中点击按钮跳转:

Button(onClick = { onNavigateToDetail("user123") }) {
    Text("Go to Detail")
}

5. 总结

  • 传统 XML 方式:适合已有 Fragment 项目,通过可视化导航图管理跳转逻辑。
  • Compose 方式:声明式 API,更适合现代化 Compose 项目,路由管理更灵活。
  • 核心优点:统一导航逻辑、类型安全、简化返回栈管理。

推荐场景

  • 新项目优先使用 Compose Navigation。
  • 旧项目逐步迁移时,可混合使用 XML 和 Compose 导航。
http://www.dtcms.com/a/116629.html

相关文章:

  • 实时图表工具GLG Toolkit 在 Web HMI/SCADA 领域的卓越实践
  • ubuntu wifi配置(命令行版本)
  • 设计模式之解释器模式:原理、实现与应用
  • 大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)
  • 【项目管理】第4章 信息系统管理 --知识点整理
  • Perl语言的WebAssembly
  • idea 打不开terminal
  • 工业4.0时代:RK3588边缘工业计算机助力AGV导航升级
  • 一句话,十分钟,一部片!
  • 第一部分——Docker篇 第二章 Docker安装
  • 2025数字中国初赛wp
  • 【C++】运算符重载
  • 电机的了解到调试全方面讲解
  • Docker 25.0+版本全特性解析:Rootless模式、Compose V2实战
  • powershell绑定按钮事件的两种方式
  • Elasticsearch|名词解释
  • 【SAP-FI】总账会计系统配置
  • 宝塔面板使用CDN 部署后获取真实客户端 IP教程
  • 如何免费使用Meta Llama 4?
  • Altium Designer——规则设置
  • Linux服务器调用API发送通知邮件的实现方案
  • win10安装gitbash工具
  • WAF防护规则配置技巧与企业级安全实践指南
  • ICMP 协议深度解析
  • Java 大视界 -- 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)
  • 深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画
  • MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper
  • 用VAE作为标题显示标题过短,所以标题变成了这样
  • 6135. 奶牛体检-枚举
  • JavaScript学习24-防抖