Android module switch语句报错问题

Android主项目与Module中R类的区别详解 前言 大家都知道 Android 项目中会通过自动生成一个 R.java 类的方式来保存项目中所有资源文件的标识。在主项目中生成的 R.java 中的资源声明是一个静态常量,而在 module 中它却是一个静态变量。这是为什么呢?我们知道在 java 中如果某个值被声明成常量(用 final 修饰),则在编译后,该常量会被直接替换成值。而在 java 语法中,注解的属性和 switch-case 中的 case 表达式,必须使用常量或者直接使用值,否则会报语法错误。 下面我们会展开讨论下为什么 module 中的 R 类中声明的资源标识不是 final 的,这些又导致了哪些现象?下面话不多说了 立即下载

在实际的项目中,大家经常将我们的项目差分成多个module以方便项目的并行开发。在moudle中,有一个问题很多人都遇见过,如下:
这里写图片描述
这种问题咋一看有点不理解,为什么我们的id不能在case中使用了呢?为了弄明白这个问题,我们先看下tv_title这个变量的定义,也就是R文件中的定义:
这里写图片描述
我们看到,这里的tv_title变量不是一个final的,但是我们switch中case条件必须是常量或者final的,也就是说case条件必须是一个不能在编译之后变化的值。这就能解释为什么会遇到上面的问题了。
但是,我们显然不能就这么满足了,技术想要精湛,必须要打破砂锅问到底,这里就有两个问题必须要解决:
1. 为什么module中的id不是final的?
2. 为什么switch的case条件必须是常量或者final的?
我们一个一个地探索这些问题。

为什么module中的id不是final的?

其实我们展开刚才studio提示的错误,就能看到:
这里写图片描述
这里给出了一部分回答,简单来说就是自从sdk tools r14之后,module中的所有的id都不是final的,也就是说只要我们使用的编译工具是>14的,都会出现这个问题。但是这里并没有给出为什么14之后moudle中的id不是final的答案。为了弄明白这个问题,我们需要知道android的资源编译问题。
在android中国中所有的资源都是编号使用的,而不是直接使用的,这样有利于将资源和代码解耦,并且方便灵活管理。这样处理有一个重要的前提,那就是需要保证在整个项目中是唯一的,并且一旦确定就不能在改变,不然就会出现资源冲突。于是,早期的做法就是所有的资源id都是final的这样在代码静态角度就固定死了这个id不能变化。但是这样有一个问题,那就是如果我们的工程比较庞大,有若干个module,每次一个module编译的时候,其他的module的编译的都要重新进行一次,这样才能保证资源id唯一性。这样显然会减慢构建的速度,并且发布module提供给别人使用的时候也是很不方便的,因为你的id都是final的,而我们给出去的又是一个aar文件,这样的话别人是没有办法使用的。后来也就是14之后,google将module中的资源id定义为非final的,这样的话,每个module就可以独立进行编译了,可以只编译发生变化的module,这样可以加快构建的速度,并且没有发布的限制。
对于这个问题,google有一个说明文档,大家可以看看:
https://sites.google.com/a/android.com/tools/tips/non-constant-fields

为什么switch的case条件必须是常量或者final的?

这个问题涉及java switch语句的编译问题。关于这个问题大家可以看看这个文章:
https://book.2cto.com/201507/53004.html
这个文章说明switch语句会根据case条件值的离散程度分别使用switchtable或者lookupswitch指令执行swtch语句。但是不论是那种执行指令,都是使用一个确定的常量作为查询表index的,这些值都是在编译的时候就确定的。这样做的目的是可以在运行的时候加快查询的速度,比如我们在lookupswitch中可以使用二分查找方法快速找到我们的index,而不用执行慢速的线性扫描法。因此我们switch语句中的case条件值必须是在编译的时候就能确定的。

这个问题的解决办法?

其实studio已经给出的解决办法:
这里写图片描述
就是转换成if条件语句!!

Unity XR Interaction Toolkit(二)手柄交互 XR Interaction 手柄事件和抓取设置 阅读详情

相关推荐

交叉编译Qt6.5.3(RK3568开发板)

注意,如果使用其它版本的交叉编译器的话,请确保你的交叉编译器能够支持 C++17标准。为确保后续交叉编译没问题,需要确保开发板使用的GLIBC版本不小于2.34版本。到 linaro 网站上下载交叉编译工具,我下载的是 gcc-linaro-11.3.1-2022.06-x86_64_aarch64-linux-gnu.tar.xz。安装 CMake ,最低要求3.16版本,如果要静态编译,需要3.21及以上版本。我使用的3.27版本。:指定为最后交叉编译后的Qt6.5.3库的安装目录。

m0_46309425的博客 5102

Android 开发解决 switch 语句报错 Constant expression required 问题

Android 开发解决switch语句报错问题。

枫飘长安的博客 5212

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

安卓原生控件Switch无法滑动监听问题的解决办法

业务场景: 在人员信息编辑页面有一个Switch用于设置该人员为队长。这里有两种情况,一个是页面初始化或用户其它操作仅需对Switch的状态进行改变的;另一个是当用户主动点击Switch需请求服务器数据做其它业务逻辑的,也就是代码设置Switch状态和用户主动设置Switch状态是两种不同业务逻辑。 分析: 第一个想到的是用setOnCheckedChangeListener,它不管是手动改变还是代码改变的状态都会监听到,不符合需求。 第二个想到的是用setOnClickListener,可以实现需

look_up_at的博客 1333

利用Python脚本在ADS2024 Update2中动态绘制与验证LPDDR5眼图模板

本文详细介绍了如何在ADS2024 Update2中,利用Python脚本动态绘制与验证LPDDR5眼图模板。通过调用DDS Python接口,工程师可在仿真后无需重新运行,即可灵活添加、修改矩形或六边形眼图模板,并实现批量自动化处理,从而极大提升高速信号(如LPDDR5)的调试与验证效率。

raspberrypi5的博客 603

逐飞vs龙邱:英飞凌miniwiggler仿真器硬件接口差异全解析(附拆机对比图)

本文通过拆解对比逐飞与龙邱两家厂商的英飞凌miniwiggler仿真器,详细解析了其硬件接口的核心差异。重点分析了Type-C接口的取舍、DAP调试协议(SWD)的支持、电源设计(跳线帽vs拨码开关)以及工艺用料,为嵌入式开发者与智能车竞赛选手提供了清晰的选型参考和实际应用建议。

weixin_29189003的博客 113

Android studio:错误: 需要常量表达式

将一个项目作为library,通过import Moudle导入一个新项目引用时,爆出这个错误:需要常量表达式,定位到switch。

KYGALYX的博客 3828

微信文件自动归档!手把手教你用OpenClaw搭个自己的“数字员工”,告别重复劳动

很多人说“AI是未来”,但未来不是靠喊口号的。OpenClaw的真正价值,是让你把重复劳动交出去,把时间留给真正需要创造力的事。这事真能干,而且不难。下载OpenClaw(GitHub仓库按我写的步骤跑一遍遇到坑,评论区留言——我亲自帮你看作者后记:上周五,我让AI自动归档了文件后,终于在5点准时下班。回家路上,我给它发了条消息:“干得漂亮”。它没回,但我知道——它在默默等我的下一条指令。

2601_94871597的博客 413

【Android基于JAVA8的switch报错】Constant expression required 我猜很多人都遇到了……

我猜应该很多人都遇见了无法使用或者的问题,会提示,虽然无法使用String,但是R.id.xxx报错的问题我这边查了个大概只能用。

cantclimbthetree的博客 3848

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1493

YOLO26改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的YOLO26目标检测轻量化改进方法研究。主要用于轻量化应用部署,相关轻量化改进与其整体架构非常适配。通过整合、以及优化的,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中、、、和五种模型,以满足不同的需求。MobileNetV4: Universal Models for the Mobile Ecosystem是一系列适用于移动生态系统的通用高效模型。以下将详细介绍其轻量化设计的出发点、原理、结构和优势:的实现代码如下: 四、修改步骤 4.1 修

Limiiiing的博客 827

module 常用命令

Envrionment modules工具用来快速的设置和修改用户编译运行环境。Envrionment modules通过加载和卸载modulefile文件可直接改变用户的环境变量,用户不需要修改.bashrc,从而避免误操作。使用module来管理编译器,库函数的版本,

HHFQ的博客 4553

大疆RoboMaster嵌入式面试,电机FOC调不出来当场走人

摘要:大疆RoboMaster嵌入式工程师面试以实战能力著称,重点考察FreeRTOS任务调度、FOC电机控制和CAN总线三大核心技能。FreeRTOS部分涉及优先级调度、栈溢出排查及信号量与互斥锁的区别;FOC控制要求现场编写电流环代码,并解释Clarke/Park变换原理;CAN总线则关注仲裁机制、CANopen协议应用及错误帧排查方法。面试强调工程实践,需具备STM32开发经验,建议搭建实际环境进行练习。该岗位被誉为"硬件版修罗场",充分体现大疆对实际开发能力的严格要求。

郑伟强dev的专栏 150

android studio的R.报错,AndroidStudio library module的R文件报错

最近在写一个Android的library module,打算在库项目里面写一个自定义控件。自定义控件里面有自己特有的属性。在attr.xml里面生成自己的自定义属性。代码如下:但是在代码里面使用这些属性的时候却报错了。TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.GradientIconView);BitmapDr...

weixin_28952633的博客 986

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

AndroidStudio library module的R文件报错

最近在写一个Android的library module,打算在库项目里面写一个自定义控件。 自定义控件里面有自己特有的属性。在attr.xml里面生成自己的自定义属性。 代码如下:

黑化肥发挥会挥发 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android Studio module里面放switch语句报错 R文件找不到

最近在写一个Android的library module,打算在库项目里面写一个自定义控件。 自定义控件里面有自己特有的属性。在attr.xml里面生成自己的自定义属性。 代码如下: [html] view plain copy xml version="1.0" encoding="utf-8"?>   resources>  

Tom_xiaoxie的博客 3257

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Validates using resource IDs in a switch statement in Android library module

昨天在项目里导入项目作为library module时报错,提示Validates using resource IDs in a switch statement in Android library module,很奇怪,主module里也有这种写法啊,怎么就没报错,立马查了一下,看到答案的那一刻才想起来以前遇到过这个问题,看来好记性确实不如烂笔头啊,还是记录一下吧。        首先,这

袁较瘦的技术博客 5527

【Android 报错】Resource IDs cannot be used in a switch statement in Android library modules

问题 在library module中对监听的控件使用switch控制中,发现会报 Resource IDs cannot be used in a switch statement in Android library modules,翻译过来就是 资源ID不能在安卓库模块的switch语句中使用,之前这样写没有问题啊。 原因: 查了一下发现原因是在library module中资源ID类型不是...

风帆的笔记 4626

Android开发问题之--Validates using resource IDs in a switch statement in Android library module

Validates using resource IDs in a switch statement in Android library module 因项目需求,需在开放平台发布SDK,在SDK开发过程中遇到library module时报错,提示Validates using resource IDs in a switch statement in Android library mod...

whenwant的博客 445

Android switch报错:Resource IDs cannot be used in a switch statement in Android library modules

报错情况 在开发过程中使用实现多个按钮监听的时候,重写onClick方法,在其中需要根据按钮ID判断按下的是哪个按钮,一般我们用switch来代替if else来判断,如下: @Override public void onClick(View v) { int position = (Integer) ((Button) v).getTag(); ...

欢迎交流 3020

在AS上导入第三方module项目后报错提示:Resource IDs cannot be used in a switch statement in Android library modules

在AS上导入第三方module项目后报错提示:Resource IDs cannot be used in a switch statement in Android library modules 错误在哪,我不说多,直接说吧 百度上说是:用switch来进行判断操作时,会报这个错误,原因是R.id.XXX这类资源id在主application中是final,是常量,而在library中,是没有final的。 app的R.java文件: library的R.java文件 as版本3.0.0以下可能查

彬sir哥的博客 2646

解决问题:resource IDS cannot be used in a switch statement in Android library

# 发现问题 在抽取lib的时候发现了这样一个问题,如图所示: 1. 很正常的onClick事件的处理,使用的swtich语句,但是却报了resource IDS cannot be used in a switch statement in Android library这个问题,原因是... 2. android项目的library module里不能使用资源ID作为switch语句的c...

yeluofengchui的博客 3323

Android应用双开供系统在主副屏展示使用总结及问题总结

项目中用到了双屏,需要我们做跳转处理。 总结了一下: Demo代码总结与问题总结一、新建三个module二、library modles(即app包)中Gradle Scripts中把原本的application改成library。三、在新建的modules(leftapp和rightapp中实现跳转app主界面的逻辑),以leftapp为例。遇到的问题:无法获取到跳转的主界面类四、出现的问题:**Resource IDs cannot be used in a switch statement in An

ambitionLlll的博客 1612

在Android library中不能使用switch-case语句访问资源ID

报错提示:Resource IDs cannot be used in a switch statement in Android library modules 翻译如下:在Android library中不能使用switch-case语句访问资源ID 原因分析 : 当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误,报的错误是case分支后面跟的参数必须为final类型

大前端秘籍 793

将Android项目作为module导入到主项目中

      导入module流程: 1.主项目中import需要导入项目的app模块; 2.修改该module中build.gradle里的com.android.application为com.android.library; 3.删除该module的applicationId; 4.File->打开工程结构,导入module,若没有,则在setting.gradle中手动添...

Luka的異想世界 3789
上一篇: 优秀的Android开源框架(持续更新)
下一篇: 基于RecyclerView实现的动态图片轮播器
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值