当前位置: 首页 > 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"><fragmentandroid:id="@+id/homeFragment"android:name="com.example.HomeFragment"android:label="Home"><actionandroid:id="@+id/action_to_detail"app:destination="@id/detailFragment" /></fragment><fragmentandroid:id="@+id/detailFragment"android:name="com.example.DetailFragment"android:label="Detail" />
</navigation>

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

步骤 2:配置 NavHost

在 Activity 的布局中添加 NavHostFragment

<androidx.fragment.app.FragmentContainerViewandroid: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"><argumentandroid: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 导航。

6. 拓展

1. 多模块导航

核心场景
  • 大型项目中按功能拆分模块(如登录模块、支付模块、个人中心模块)。
  • 模块间解耦,允许独立开发和测试。
实现方案
步骤 1:创建子模块
  1. 新建模块

    • 在 Android Studio 中右键项目 → New → Module → 选择 Phone & Tablet ModuleAndroid Library
    • 命名模块(如 feature-auth),包名建议为 com.example.feature.auth
  2. 模块结构

    project-root/|- app/                  // 主模块|- feature-auth/         // 子模块|- src/main/|- res/navigation/auth_nav_graph.xml  // 子模块导航图
    
步骤 2:子模块定义导航图

在子模块中创建独立的导航图:

<!-- feature-auth/res/navigation/auth_nav_graph.xml -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/auth_nav_graph"app:startDestination="@id/loginFragment"><fragmentandroid:id="@+id/loginFragment"android:name="com.example.feature.auth.LoginFragment"><actionandroid:id="@+id/action_to_register"app:destination="@id/registerFragment" /></fragment><fragment android:id="@+id/registerFragment" ... />
</navigation>
步骤 3:主模块集成子模块
  1. 添加依赖
    在主模块的 build.gradle 中引入子模块:

    dependencies {implementation project(":feature-auth")
    }
    
  2. 合并导航图
    在主导航图中通过 <include> 引入子模块导航图:

    <!-- app/res/navigation/main_nav_graph.xml -->
    <navigation ...><fragment android:id="@+id/homeFragment"><actionandroid:id="@+id/action_to_auth"app:destination="@id/auth_nav_graph" /></fragment><include app:graph="@navigation/auth_nav_graph" />  <!-- 关键 -->
    </navigation>
    
  3. 跨模块跳转
    直接使用子模块的 Action ID 或 Destination ID:

    // 从主模块跳转到子模块的登录页
    findNavController().navigate(R.id.action_to_auth)
    
参数传递
  1. 子模块定义参数

    <!-- auth_nav_graph.xml -->
    <fragment android:id="@+id/registerFragment"><argument android:name="email" app:argType="string" />
    </fragment>
    
  2. 主模块传递参数

    // 使用生成的 Directions 类(需主模块依赖子模块的 Safe Args)
    val directions = LoginFragmentDirections.actionToRegister(email = "user@example.com")
    findNavController().navigate(directions)
    
注意事项
  • 资源冲突:子模块资源需添加前缀(如 auth_),避免与主模块重复。
  • 依赖版本一致:主模块和子模块的 Navigation 版本必须相同。
  • ProGuard 规则:保留子模块生成的导航类。

2. 深层链接(DeepLink)

核心场景
  • 从外部链接直接跳转到应用内指定页面(如邮件中的订单详情链接)。
  • Web 页面与应用页面对接。
实现方案
XML + Fragment 方式
  1. 在导航图中定义 DeepLink

    <fragment android:id="@+id/detailFragment"><deepLink app:uri="example://app/detail/{id}" />  <!-- 定义 URI 模板 -->
    </fragment>
    
  2. 配置 AndroidManifest
    <activity> 标签内添加 Intent Filter:

    <activity ...><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><!-- 协议和域名 --><dataandroid:scheme="example"android:host="app"android:pathPrefix="/detail" /></intent-filter>
    </activity>
    
  3. 处理 DeepLink 参数

    class DetailFragment : Fragment() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)arguments?.let {val id = it.getString("id")  // 从 URI 中提取参数}}
    }
    
Compose 方式
  1. 定义 DeepLink 路由

    composable(route = "detail/{id}",deepLinks = listOf(navDeepLink { uriPattern = "example://app/detail/{id}" })
    ) { backStackEntry ->val id = backStackEntry.arguments?.getString("id")DetailScreen(id = id)
    }
    
  2. 触发 DeepLink

    // 通过 URI 跳转
    val request = NavDeepLinkRequest.Builder.fromUri("example://app/detail/123".toUri()).build()
    navController.navigate(request)
    
测试 DeepLink

使用 ADB 命令模拟 DeepLink:

adb shell am start -d "example://app/detail/123" com.example.app
注意事项
  • 路径匹配:URI 的 pathPattern 需与导航图中定义一致。
  • 安全性:验证外部传入参数,避免恶意数据注入。
  • 多模块 DeepLink:子模块的 DeepLink 需在主模块的 AndroidManifest 中声明。

总结

  • 多模块导航:通过模块拆分和 <include> 标签整合导航图,实现功能解耦和代码复用。
  • 深层链接:通过 URI 映射应用内页面,提升用户体验和外部系统集成能力。

推荐实践

  • 在电商应用中,订单模块可独立为子模块,通过 DeepLink 实现从推送通知直接跳转订单详情。
  • 社交应用中将个人主页模块化,通过 feature-profile 子模块管理,支持外部链接直达用户主页。

GitHub 多模块示例 | DeepLink 官方指南

相关文章:

Android 学习之 Navigation导航

1. Navigation 介绍 Navigation 组件 是 Android Jetpack 的一部分&#xff0c;用于简化应用内导航逻辑&#xff0c;支持 Fragment、Activity 和 Compose 之间的跳转。核心优势&#xff1a; 单 Activity 架构&#xff1a;减少 Activity 冗余&#xff0c;通过 Fragment 或 Com…...

初识 Three.js:开启你的 Web 3D 世界 ✨

3D 技术已经不再是游戏引擎的专属&#xff0c;随着浏览器技术的发展&#xff0c;我们完全可以在网页上实现令人惊艳的 3D 效果。而 Three.js&#xff0c;作为 WebGL 的封装库&#xff0c;让 Web 3D 的大门向更多开发者敞开了。 这是我开启这个 Three.js 专栏的第一篇文章&…...

PyTorch 笔记

简介与安装 PyTorch 是一个开源的 Python 机器学习库&#xff0c;基于 Torch 库&#xff0c;底层由C实现&#xff0c;应用于人工智能领域&#xff0c;如计算机视觉和自然语言处理。 PyTorch 最初由 Meta Platforms 的人工智能研究团队开发&#xff0c;现在属 于Linux 基金会的…...

day24学习Pandas库

文章目录 三、Pandas库4.函数计算3遍历3.1.遍历Series对象3.2.遍历DataFrame对象 4排序4.1 sort_index4.2 sort_values 5.去重drop_duplicates6.先分组在计算6.1 groupby6.2 filter过滤 7.合并未完待续.. 三、Pandas库 4.函数计算 3遍历 3.1.遍历Series对象 在讲解Series部…...

AI日报 - 2025年4月8日

AI日报 - 2025年4月8日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; 模型进展 | Llama 4发布引爆讨论 (性能、应用、部署、训练争议)&#xff0c;OpenAI保持高速迭代&#xff0c;香港大学推Dream 7B扩散模型。 Meta Llama 4 Scout & Maveric…...

Linux学习笔记(2) 命令基础:从概念到实践(期末,期中复习笔记全)

前言 一、认识命令行与命令 二、Linux 命令的基础格式 三、命令示例解析 &#xff08;1&#xff09;ls -l /home/itheima &#xff08;2&#xff09;cp -r test1 test2 四结语 前言 在 Linux 系统的世界里&#xff0c;命令行是与系统交互的重要方式。熟练掌握 Linux 命令…...

langgraph简单Demo4(checkpoint检查点)

在 langgraph 里&#xff0c;检查点&#xff08;checkpoint&#xff09;是一项重要的功能&#xff0c;它能够记录工作流在执行过程中的中间状态。当工作流因某些原因中断时&#xff0c;可以从检查点恢复继续执行&#xff0c;避免从头开始&#xff0c;提升效率。 示例&#xff…...

【题解】AtCoder AT_abc400_c 2^a b^2

题目大意 我们定义满足下面条件的整数 X X X 为“好整数”&#xff1a; 存在一个 正整数 对 ( a , b ) (a,b) (a,b) 使得 X 2 a ⋅ b 2 X2^a\cdot b^2 X2a⋅b2。 给定一个正整数 N N N&#xff08; 1 ≤ N ≤ 1 0 18 1\le N\le 10^{18} 1≤N≤1018&#xff09;&#xff…...

七种驱动器综合对比——《器件手册--驱动器》

目录 九、驱动器 概述 定义 功能 分类 1. 按负载类型分类 2. 按功能特性分类 工作原理 优势 应用领域 详尽阐述 1 隔离式栅极驱动器 定义 工作原理 应用场景 优势 2 变压器驱动器 定义 工作原理 应用场景 优势 设计注意事项 3 LED驱动 定义 功能与作用 应用场景 设计…...

GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…...

西湖大学团队开源SaProt等多款蛋白质语言模型,覆盖结构功能预测/跨模态信息搜索/氨基酸序列设计等

2025 年 3 月 22—23 日&#xff0c;上海交通大学「AI 蛋白质设计峰会」正式举行。 本次峰会汇聚了来自清华大学、北京大学、复旦大学、浙江大学、厦门大学等知名高校的 300 多位专家学者&#xff0c;以及 200 余位行业领军企业代表和技术研发人员&#xff0c;深入探讨了 AI 在…...

ansible+docker+docker-compose快速部署4节点高可用minio集群

目录 github项目地址 示例服务器列表 安装前 修改变量文件group_vars/all.yml 修改ansible主机清单 修改setup.sh安装脚本 用法演示 安装后验证 github项目地址 https://github.com/sulibao/ansible_minio_cluster.git 示例服务器列表 安装前 修改变量文件group_var…...

说话人分离中的聚类方法:深入解析Agglomerative聚类、KMeans聚类和Oracle聚类

说话人分离&#xff08;Speaker Diarization&#xff09;是将音频流根据说话人身份划分为同质片段的过程。这一过程中的关键步骤是聚类&#xff0c;即将说话人嵌入&#xff08;embeddings&#xff09;分组为不同的簇&#xff0c;每个簇代表一个独特的说话人。在pyannote.audio管…...

蓝桥杯真题——前缀总分、遗迹

蓝桥杯2024年第十五届省赛真题-前缀总分 题目描述 给定 n 个由小写英文字母组成的字符串 s1, s2, , sn &#xff0c;定义前缀总分为V ∑i<j P(si, sj) &#xff0c;其中 P(si, sj) 表示 si, sj 的最长公共前缀的长度。 小蓝可以选择其中一个字符串&#xff0c;并修改其…...

性能比拼: MySQL vs PostgreSQL

本内容是对知名性能评测博主 Anton Putra MySQL vs PostgreSQL Performance Benchmark (Latency - Throughput - Saturation) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 MySQL vs PostgreSQL 数据库性能对比** 在本内容中&#xff0c;我们将对比 MySQL 和 Pos…...

TypeScript 中的 infer 关键字用途

infer 是 TypeScript 中的高级类型关键字&#xff0c;主要用于条件类型中推断类型。它允许我们在条件类型的 extends 子句中声明一个类型变量&#xff0c;然后在该条件类型的 true 分支中使用这个推断出的类型。 1. 基本语法 type SomeType<T> T extends infer U ? U…...

关于Spring MVC中@RequestParam注解的详细说明,用于在前后端参数名称不一致时实现参数映射。包含代码示例和总结表格

以下是关于Spring MVC中RequestParam注解的详细说明&#xff0c;用于在前后端参数名称不一致时实现参数映射。包含代码示例和总结表格&#xff1a; 1. 核心作用 RequestParam用于显式绑定HTTP请求参数到方法参数&#xff0c;支持以下场景&#xff1a; 参数名不一致&#xff1…...

Spring Boot中Spring MVC相关配置的详细描述及表格总结

以下是Spring Boot中Spring MVC相关配置的详细描述及表格总结&#xff1a; Spring MVC 配置项详解 1. 异步请求配置 spring.mvc.async.request-timeout 描述&#xff1a;设置异步请求的超时时间&#xff08;单位&#xff1a;毫秒&#xff09;。默认值&#xff1a;未设置&…...

Shell脚本编程之正则表达式

一、概念 在 Shell 脚本中&#xff0c;正则表达式是一种强大且常用的文本处理工具&#xff0c;它可以用来匹配、搜索、替换和截取字符串。 正则表达式是由一些字符去描述规则&#xff0c;在正则表达式中有两类字符 (1)元字符(Meta Character)&#xff1a;Shell 环境中具有特殊含…...

spring-ai-openai调用Xinference1.4.1报错

1、Xinference 报错logs 此处是调用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …...

XC7K160T-2FFG676I Kintex‑7系列 Xilinx 赛灵思 FPGA 详细技术规格

XC7K160T-1FFG676I XC7K160T-1FFG676C XC7K160T-2FFG676C 1. 基本概述 XC7K160T-2FFG676I 属于 Xilinx Kintex‑7 系列 FPGA&#xff0c;该系列芯片采用 28nm &#xff08;HKMG&#xff09;工艺制造&#xff0c;旨在提供高性能与低功耗的平衡。该芯片主要面向对高速数据处理、…...

C++学习之udp通信

1.UDP特点 c /* udp 传输层协议, 和tcp是一样的 特点: 面向无连接的, 不安全的, 报式传输协议 1. 无连接: udp通信的时候不需要connect 1). 通信不需要建立连接 2). 如果想给对方发送数据, 只需要指定对方的IP和端口 2. udp会丢包 1). 数…...

2020年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析

2020年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...

【数据标准】数据标准化实施流程与方法-保障机制篇

导读&#xff1a;1、数据标准化保障机制&#xff08;组织架构、协作流程&#xff09;是​​战略落地的基石​​&#xff0c;确保责权分明与资源协同&#xff1b;2、数据标准化制度建设&#xff08;政策、标准、工具&#xff09;构建了​​统一治理框架​​&#xff0c;规范数据…...

ZLMediaKit部署与配置

ZLMediaKit编译 # 安装编译器 sudo apt install build-essential cmake# 其它依赖库 sudo apt-get install libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git cd /usr/local/srcgit clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit.git cd ZLMediaKit# …...

38、web前端开发之Vue3保姆教程(二)

三、Vue3语法详解 1、组件 1 什么是组件? 组件是 Vue.js 中最重要的概念之一。它是一种可复用的 Vue 实例,允许我们将 UI 拆分为独立的、可复用的部分。组件可以提高代码的组织性和可维护性。 2 创建组件 在 Vue 3 中,组件通常使用单文件组件(SFC)编写,其包含三个主…...

知识中台如何重构企业信息生态?关键要素解析

在信息化快速发展的时代&#xff0c;企业面临着如何高效整合和管理知识资源的挑战。知识中台作为企业信息管理的核心工具&#xff0c;正在帮助企业提升运营效率和创新力。本文将探讨知识中台如何重构企业信息生态&#xff0c;并解析其关键要素。 一、什么是知识中台&#xff1f…...

蓝桥杯python组备赛(记录个人模板)

文章目录 栈队列堆递归装饰器并查集树状数组线段树最近公共祖先LCAST表字典树KMPmanacher跳表(代替C STL的set)dijkstra总结 栈 用list代替 队列 用deque双端队列替代 堆 用heapq 递归装饰器 众所周知&#xff0c;python的递归深度只有1000&#xff0c;根本满足不了大部…...

C++的多态 - 下

目录 多态的原理 虚函数表 1.计算包含虚函数类的大小 2.虚函数表介绍 多态底层原理 1.父类引用调用 2.父类指针调用 3.动态绑定与静态绑定 单继承和多继承关系的虚函数表 函数指针 1.函数指针变量 (1)函数指针变量创建 (2)函数指针变量的使用 (3)两段有趣的代码 …...

XSS(跨站脚本攻击)

什么是 XSS 攻击&#xff1f; XSS 攻击&#xff08;Cross-Site Scripting&#xff09;是一种常见的网络攻击手段&#xff0c;攻击者通过在网站上注入恶意的 JavaScript 代码&#xff0c;让网站在用户的浏览器中执行这些恶意代码&#xff0c;进而达到 窃取信息、篡改网页内容 或…...

LLM Agents的历史、现状与未来趋势

引言 大型语言模型&#xff08;Large Language Model, LLM&#xff09;近年在人工智能领域掀起革命&#xff0c;它们具备了出色的语言理解与生成能力。然而&#xff0c;单纯的LLM更像是被动的“回答者”&#xff0c;只能根据输入给出回复。为了让LLM真正“行动”起来&#xff…...

最简rnn_lstm模型python源码

1.源码 GitCode - 全球开发者的开源社区,开源代码托管平台 不到120行代码&#xff0c;参考了《深度学习与交通大数据实战》3.2节。注意这本书只能在京东等在线商城网购&#xff0c;才能拿到相应的数据集和源码。我的是在当地新华书店买的——买清华出版社&#xff0c;记得这个…...

基于Android的图书借阅和占座系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 基于Android的图书借阅和占座系统设计的目的是为用户提供图书信息、图书馆、图书资讯等内容&#xff0c;用户可以进行图书借阅、预约选座等操作。 与PC端应用程序相比&#xff0c;图书借阅和占座系统的设计主要面向于广大用户&#xff0c;旨在为用户提供一个图书借阅及占…...

vue3+element-plus动态与静态表格数据渲染

一、表格组件&#xff1a; <template> <el-table ref"myTable" :data"tableData" :header-cell-style"headerCellStyle" header-row-class-name"my-table-header" cell-class-name"my-td-cell" :row-style"r…...

数据库50个练习

数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…...

Open CASCADE学习|读取点集拟合样条曲线(续)

问题 上一篇文章已经实现了样条曲线拟合&#xff0c;但是仍存在问题&#xff0c;Tolerance过大拟合成直线了&#xff0c;Tolerance过大头尾波浪形。 正确改进方案 1️⃣ 核心参数优化 通过调整以下参数控制曲线平滑度&#xff1a; Standard_Integer DegMin 3; // 最低阶…...

HTML基础教程:创建双十一购物狂欢节网页

页面概况&#xff1a; 在这篇技术博客中&#xff0c;我将详细讲解如何使用HTML基础标签创建一个简单而美观的双十一购物狂欢节主题网页。我们将逐步分析代码结构&#xff0c;了解每个HTML元素的作用&#xff0c;以及如何通过HTML属性控制页面布局和样式。 页面整体结构 首先&…...

ES6 新增特性 箭头函数

简述&#xff1a; ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…...

【C++算法】49.分治_归并_计算右侧小于当前元素的个数

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 315. 计算右侧小于当前元素的个数 题目描述&#xff1a; 解法 归并排序&#xff08;分治&#xff09; 当前元素的后面&#xff0c;有多少个比我小。&#xff08;降序&…...

Multi-class N-pair Loss论文理解

一、N-pair loss 对比 Triplet loss 对于N-pair loss来说&#xff0c;当N2时&#xff0c;与triplet loss是很相似的。对anchor-positive pair&#xff0c;都只有一个negative sample。而且&#xff0c;N-pair loss&#xff08;N2时&#xff09;为triplet loss的平滑近似Softpl…...

uniapp微信小程序地图marker自定义气泡 customCallout偶尔显示不全解决办法

这个天坑问题&#xff0c;在微信开发工具上是不会显示出来的,只有在真机上才会偶尔出现随机样式偏移/裁剪/宽长偏移&#xff0c;询问社区也只是让你提交代码片段&#xff0c;并无解决办法。 一开始我怀疑是地图组件加载出现了问题&#xff0c;于是给地图加了一个v-if"reL…...

蓝桥杯嵌入式总结

1.lcd显示和led引脚冲突 在lcd使用到的函数中加入两行代码 uint16_t temp GPIOC->ODR; GPIOC->ODR temp; 2.关于PA15,PB4pwm波输入捕获 首先pwm输入捕获中断 使用 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 再在输入捕获中断回调函数中使用 void HAL…...

C#的反射机制

C#反射机制详解 什么是反射&#xff1f; 反射(Reflection)是C#中的一项强大功能&#xff0c;它允许程序在运行时动态获取类型信息、访问和操作对象成员。简单来说&#xff0c;反射使程序可以在不预先知道类型的情况下&#xff0c;查看、使用和修改程序集中的代码。 常见反射…...

Java并发编程高频面试题

一、基础概念 1. 并行与并发的区别&#xff1f; 并行&#xff1a;多个任务在多个CPU核心上同时执行&#xff08;物理上同时&#xff09;。并发&#xff1a;多个任务在单CPU核心上交替执行&#xff08;逻辑上同时&#xff09;。类比&#xff1a;并行是多个窗口同时服务&#x…...

Invalid bound statement (not found)

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

【Vue-路由】学习笔记

目录 <<回到导览路由1.单页应用和多页面2.路由基本使用2.1.路由的含义2.2.VueRouter插件2.3.配置路由规则和导航2.4.组件目录存放2.5.路由模块封装 3.rounter3.1.router-link实现高亮3.2.自定义匹配类名3.3.声明式导航3.3.1.查询参数传参3.3.2.动态路由传参3.3.3.总结 3.…...

前端服务配置详解:从入门到实战

前端服务配置详解&#xff1a;从入门到实战 一、环境配置文件&#xff08;.env&#xff09; 1.1 基础结构 在项目根目录创建 .env 文件&#xff1a; # 开发环境 VUE_APP_API_BASE_URL http://localhost:3000/api VUE_APP_VERSION 1.0.0# 生产环境&#xff08;.env.produc…...

Java安全管理器 - SecurityManager

什么是Java安全管理器&#xff1f; Java安全管理器是Java提供的保护JVM和程序安全的机制&#xff0c;它能限制用户的代码对文件、内存、资源、网络的操作和访问&#xff0c;防止恶意代码入侵程序。常用来控制用户提交的代码对各种资源的访问权限&#xff0c;防止用户恶意提交代…...

Arrays操作工具 Lambda表达式 集合 迭代器 数据结构 泛型 set集合 list集合

Arrays操作工具 自己定义的排序规则 简单理解如果是&#xff1a;o1 - o2 升序排列 o2 - o1 降序排列 Lambda表达式 函数式编程 函数式编程&#xff08;Functional programming&#xff09;是一种思想特点。 面向对象&#xff1a;先去找对象&#xff0c;让对象做事情。。函数式…...

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射

DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…...