Jetpack中Navigation的简单使用

2024-06-04 03:12

本文主要是介绍Jetpack中Navigation的简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 效果图
  • 添加引用
  • 准备好fragment
  • 创建导航图 Navigation Graph
  • 在 xml 中引入NavHostFragment
  • 在代码中获取controller并写跳转逻辑
  • 带参数的页面跳转
  • demo下载地址
  • 参考文献

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加引用

  1. 在gradle文件夹下的libs.versions.toml中添加如下代码
[versions]
...
navigation = "2.7.7"[libraries]
...
androidx-navigation-ui-ktx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navigation" }
androidx-navigation-fragment-ktx = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navigation" }
  1. 在 app 下的build.gradle中添加如下代码
dependencies {...// Kotlinimplementation(libs.androidx.navigation.fragment.ktx)implementation(libs.androidx.navigation.ui.ktx)
}
  1. 如果需要用到传参,就需要一下步骤,否则跳过

    1. 在gradle文件夹下的libs.versions.toml中添加如下代码
    [versions]
    ...
    navigation = "2.7.7"[libraries]
    # 选如果需要传参,就添加
    androidx-navigation-safe-args-gradle-plugin = { module = "androidx.navigation:navigation-safe-args-gradle-plugin", version.ref = "navigation" }
    
    1. 在项目的build.gradle文件中添加如下代码
    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {dependencies {classpath(libs.androidx.navigation.safe.args.gradle.plugin)}
    }
    plugins {...
    }
    
    1. 在 app 的 build.gradle 文件中添加引用
    plugins {...id("androidx.navigation.safeargs.kotlin")
    }
    

准备好fragment

这个自己准备

创建导航图 Navigation Graph

  1. res目录下创建navigation文件夹
  2. navigation文件夹下新建 navigation_phone.xml
<?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"android:id="@+id/navigation_phone"app:startDestination="@id/fragmentHome"><!--id: 给fragment起的名字,后续是用来跳转用的name:是具体fragment的路径layout:是用来预览用的--><fragmentandroid:id="@+id/fragmentHome"android:name="com.test.navigationdemo.fragment.HomeFragment"tools:layout="@layout/fragment_home" />...<fragmentandroid:id="@+id/fragmentMine"android:name="com.test.navigationdemo.fragment.MineFragment"tools:layout="@layout/fragment_mine"><!--id: 也是后续用来跳转用的destination:跳转的目的地,也是 fragment 标签的identerAnim ,exitAnim,popEnterAnim,popExitAnim 是用来设置进入和退出动画的--><actionandroid:id="@+id/action_fragmentMine_to_fragmentPrivacy"app:destination="@id/fragmentPrivacy"app:enterAnim="@anim/slide_in_right"app:exitAnim="@anim/slide_out_left"app:popEnterAnim="@anim/slide_in_left"app:popExitAnim="@anim/slide_out_right" /></fragment></navigation>

在 xml 中引入NavHostFragment

<!-- app:defaultNavHost="true"设置为true,代表回退栈由navController管理如果想自己管理,就不设置-->
<!-- 注意:这里我用的是FragmentContainerView,如果使用的是 fragment 标签,在 MainActivity代码中获取controller有区别
-->
<androidx.fragment.app.FragmentContainerViewandroid:id="@+id/fragmentStart"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toTopOf="@id/rbGroup"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:navGraph="@navigation/navigation_phone" />

在代码中获取controller并写跳转逻辑

val hostFragment = supportFragmentManager.findFragmentById(R.id.fragmentStart) as NavHostFragment
val navController = hostFragment.navController
// 添加动画
val options = NavOptions.Builder().setEnterAnim(R.anim.fade_in).setExitAnim(R.anim.fade_out).build()
bind.rbGroup.setOnCheckedChangeListener { _, checkedId ->when (checkedId) {bind.rbHome.id -> navController.navigate(R.id.fragmentHome, null, options)bind.rbNews.id -> navController.navigate(R.id.fragmentNews, null, options)bind.rbHots.id -> navController.navigate(R.id.fragmentHots, null, options)bind.rbMine.id -> navController.navigate(R.id.fragmentMine, null, options)}
}

带参数的页面跳转

  1. 在 navigation graph中 需要接收参数的fragment下面添加argument标签
<?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"android:id="@+id/navigation_phone"app:startDestination="@id/fragmentHome">...<fragmentandroid:id="@+id/fragmentParam"android:name="com.test.navigationdemo.fragment.ParamsFragment"tools:layout="@layout/fragment_parmas"><!--name:参数名argType:参数类型defaultValue:默认值--><argumentandroid:name="name"android:defaultValue="nobody"app:argType="string" /><argumentandroid:name="age"android:defaultValue="0"app:argType="integer" /></fragment></navigation>
  1. kotlin 代码如下
val navDirections =MineFragmentDirections.actionFragmentMineToFragmentParam(bind.edtName.text.toString().trim(),bind.edtAge.text.toString().toIntOrNull() ?: 0)
findNavController().navigate(navDirections)

demo下载地址

demo下载地址

参考文献

1. Navigation | Android Developers

这篇关于Jetpack中Navigation的简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028904

相关文章

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M