Android Studio新版本的一个资源id无法找到的bug解决

news2024/12/16 20:26:30

Android Studio新版本的一个资源id无法找到的bug解决

文章目录

  • Android Studio新版本的一个资源id无法找到的bug解决
    • 一、前言
    • 二、Android Studio的无法获取到资源id的bug
      • 1、一段简单的Java代码
      • 1、错误现象
      • 2、错误解决方法
    • 三、其他
      • 1、小结
      • 2、gradle.properties文件 其他相关属性
      • 3、Android13系统签名应用代码在旧Gradle无法编译的小bug

一、前言

Android Studio 导入以前的项目发现资源文件明明有id声明了,但是无法Java代码中无法识别的问题。

比如switch 的case R.id.textView: 会编译报错,这个textView 已经在res的布局文件中有声明了。

后面验证对比了一下,发现是Android Studio Gradle版本的一个bug:

gradle 6.5 没有这个问题
gradle 8.7 就有这个问题

新下载的Android Studio默认都是使用的最新的gradle版本8.7,当然也能兼容旧版本的gradle。

这是一个小问题,在配置文件中多配置一个属性“android.nonFinalResIds”就行了。

下面简单记录一下。

二、Android Studio的无法获取到资源id的bug

1、一段简单的Java代码

    //首先layout的一个TextView已经声明了textView的id
    private void test(View view) {
        if (v.getId() == R.id.textView) { //这里不会编译报错
            return;
        }
        switch (view.getId()) {
            case R.id.textView: //这行会编译报错!
                break;
            default:
                break;

        }

    }

把上面这段代码加载新版本的Android Studio项目的任意一个类中直接编译是会报错的。

1、错误现象

在这里插入图片描述

上面可以看到报错信息是:
Constant expression required (需要常量表达)
简单的理解就是,gradle 编译环境认为 R.id.textView 不是一个数值。
这个算是Android Studio 新版本的有个误判吧。

网上也有人是这样说的:

Android Studio 中使用switch语句时报错Constant expression required:
在Android Studio中使用JDK17以上版本,会出现switch语句报错:
"Constant expression required"的问题,
这是因为在JDK17中switch语句的条件表达式支持使用枚举类型,而这个特性还没有被支持。

但是我用gradle 8.7搭配JDK8 也是有问题的,说明还是和Android Studio的编译环境有关。

2、错误解决方法

通过网上搜索还是能发现了解决方法如下:

在这里插入图片描述

在 gradle.properties 文件添加一个ResIds跳过检测的属性。

Demo\gradle.properties

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.nonTransitiveRClass=true
android.nonFinalResIds=false //id 找不到文件解决!

上面三个配置属性是默认就有的,第四个需要自己添加进去;

如果还有其他需求属性也是可以自己添加进入比如.kt代码,要加对应的支持属性,才能编译。

三、其他

1、小结

如果是新版本Android Studio 遇到 switch语句时报错Constant expression required,
可以在gradle.properties文件添加android.nonFinalResIds=false 试试,
看看是否能解决这个编译报错问题。

2、gradle.properties文件 其他相关属性

下面这些属性大部分没啥用,有兴趣的可以看看。

(1)构建环境配置属性
org.gradle.jvmargs:
    用于指定 Gradle 守护进程的 JVM参数,对于调整内存设置特别有用。
    例如org.gradle.jvmargs=-Xmx1536m,表示将 Gradle守护进程的最大堆内存设置为 1536MB,
    可根据项目的复杂程度和系统资源情况适当调整此值,以优化构建性能.
org.gradle.parallel:
    当设置为true时,Gradle会在多模块项目中以并行模式运行,能够显著提高构建速度,
    但该选项只适用于解耦的项目,即各个模块之间的依赖关系相对简单的情况。

org.gradle.caching:
    设置为true时,Gradle会缓存构建过程中的输出结果,
    当下次执行相同的构建任务时,如果输入没有变化,
    Gradle 会直接使用缓存的结果,从而大大提高构建速度,
    尤其适用于频繁进行构建操作的项目,如在持续集成环境中.

(2)Android 项目配置属性

COMPILE_SDK_VERSION、MIN_SDK_VERSION、TARGET_SDK_VERSION:
    分别用于指定项目的编译 SDK 版本、最低支持的 SDK 版本和目标 SDK 版本。
    在多开发者协作或项目需要兼容不同设备的场景下,将这些版本号统一配置在gradle.properties文件中,
    可以确保所有开发者使用相同的SDK版本进行开发,避免因版本不一致导致的构建问题.

android.useAndroidX:
    如果设置为true,表示在项目中使用 AndroidX 库。

android.enableJetifier:
    当android.useAndroidX为true时,若项目中依赖了使用旧版 Android Support Library的第三方库,
    设置android.enableJetifier=true可以让 Gradle自动将这些库转换为使用 AndroidX,
    方便项目的集成和升级.提高旧项目的兼容性。
android.nonTransitiveRClass:
    当设置android.nonTransitiveRClass=true时,R类的引用将不再具有传递性。
    在默认情况下(android.nonTransitiveRClass=false),
    如果一个库项目(例如,Android Library)暴露了它的R类,
    那么使用这个库的其他项目(主项目或者其他依赖此库的二级库)可以访问这个库中的所有资源引用,
    包括它所依赖的其他库的资源引用。

android.nonFinalResIds:
    设置为false可以规避gradle高版本编译报错:Constant expression required的问题


(3)依赖管理属性

versions.properties引用:
    可以在gradle.properties文件中定义依赖库的版本号,
    然后在build.gradle文件中通过变量引用这些版本号。
    这样,当需要更新依赖库版本时,只需要在gradle.properties文件中修改相应的版本号,
    而无需在多个build.gradle文件中逐个查找和修改,
    提高了依赖管理的效率和可维护性。
    例如:appcompat_version=1.4.0,
    然后在build.gradle中使用implementation "com.android.support:appcompat-v7:$appcompat_version".
mavenCentral()配置:
    如果项目需要从 Maven Central仓库获取依赖库,
    可以在gradle.properties文件中配置 Maven Central仓库的地址,
    确保项目能够正确地下载和使用所需的依赖。
    例如:repositories { mavenCentral() },
    不过通常情况下,Android Studio 默认会配置 Maven Central 仓库,
    但在某些特殊情况下,
    如需要使用特定的镜像仓库或添加其他私有仓库时,
    就可以在此文件中进行配置。

(4)代码风格与编译选项属性

kotlin.code.style:
    用于设置 Kotlin 的代码风格,可设置为official等,
    以确保项目中的 Kotlin代码遵循统一的风格规范,
    提高代码的可读性和可维护性.

kapt.verbose:
    设置为true时,会启用 Kapt 的详细日志输出,
    显示有关 Kapt 注解处理的警告和详细信息,
    有助于在开发过程中排查与 Kapt 相关的问题,
    特别是在使用 Kotlin 的注解处理器时,
    方便查看注解的处理过程和结果.

kapt.incremental.apt和kapt.use.worker.api:
    这两个属性一起使用可以启用 Kapt 的增量注解处理功能,
    并使用多线程并行编译注解,
    能够显著提高 Kotlin 项目的编译速度,减少编译时间.

3、Android13系统签名应用代码在旧Gradle无法编译的小bug

如果是要用Android Studio编译Android13 或者更新版本的系统签名应用,
需要使用新版本的gradle8.7 ,之前使用gradle6.5 怎么搞都不行;
网上很多人说是更新JDK,我试了也不行,后面更新Android Studio 也不行;
因为旧项目默认使用的是gradle6.5 进行编译的,后面使用gradle8.7 就可以了。
当时情况是使用Android13 系统签名文件放到项目中编译会失败;
使用Android11的系统签名文件放到项目中编译是OK的;

具体情况也可能有不同,
这里只简单说明一下Android13 版本签名文件在Android Studio 旧Gradle无法编译的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

负载均衡器到底是个啥?

引言 目前在项目中,我们正在使用ELB(弹性负载均衡),我希望能够完全理解其内部功能,因此写了这篇文章。 关于本文 这篇文章的最终目标是深刻理解“ELB是什么?”,并达到能够自信解释的程度。 …

远程调试软件对比与使用推荐

远程调试软件对比与使用推荐 远程调试是现代软件开发中不可或缺的一部分,尤其是在处理分布式系统、云端服务或远程服务器上的问题时。以下是对几种常见远程调试工具的详细对比和推荐使用场景。 1. GDB (GNU Debugger) 特点 开源:完全免费且开源&…

【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!

在上一篇文章中,我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来,让我们开始新建一个项目吧! 新建项目 首先进入unityHub的项目页面,点击“新项目”: 我们这个系列将会以2D平台…

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构,由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树,根朝上,分支向下。 根结点没有前驱结点,可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…

1. 机器学习基本知识(3)——机器学习的主要挑战

1.5 机器学习的主要挑战 1.5.1 训练数据不足 对于复杂问题而言,数据比算法更重要但中小型数据集仍然很普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时不要抛弃算法。 1.5.2 训练数据不具有代表性 采样偏差&#…

CentOS 上如何查看 SSH 服务使用的端口号?

我们知道,linux操作系统中的SSH默认情况下,端口是使用22,但是有些线上服务器并不是使用的默认端口,那么这个时候,我们应该如何快速知道SSH使用的哪个端口呢? 1、通过配置文件查看 cat /etc/ssh/sshd_confi…

【Java学习笔记】泛型

一、泛型的好处 好处:减少了类型转换的次数,提高了效率 二、泛型介绍 泛型:接受任何数据类型 的 数据类型 (特别强调: E 具体的数据类型在定义 Person 对象的时候指定,即在编译期间,就确定 E 是什么类型…

benchANT (Time Series: Devops) 榜单数据解读

近日,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录 &a…

多进程并发跑程序:pytest-xdist记录

多进程并发跑程序:pytest-xdist记录 pytest -s E:\testXdist\test_dandu.py pytest -s testXdist\test_dandu.py pytest -s :是按用例顺序依次跑用例 pytest -vs -n auto E:\testXdist\test_dandu.py pytest -vs -n auto,auto表示以全部进程…

网络层IP协议(TCP)

IP协议: 在了解IP协议之前,我们市面上看到的"路由器"其实就是工作在网络层。如下图: 那么网络层中的IP协议究竟是如何发送数据包的呢? IP报头: IP协议的报头是比较复杂的,作为程序猿只需要我们重…

前端传入Grule,后端保存到 .grl 文件中

前端传入Grule,后端保存到 .grl 文件中 通过简单的输入框,将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言,有 then 关键字…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

遗传算法与深度学习实战(27)——进化卷积神经网络

遗传算法与深度学习实战(27)——进化卷积神经网络 0. 前言1. 自定义交叉算子2. 自定义突变操作符3. 进化卷积神经网络小结系列链接 0. 前言 DEAP toolbox 中提供的标准遗传操作符对于自定义的网络架构基因序列来说是不够的。这是因为任何标准的交叉算子…

react-dnd 拖拽事件与输入框的文本选中冲突

问题描述 当我们使用拖拽库的时候,往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点,当拖拽的事件绑定在该元素身上时候,发现子孙的输入框不能进行文本选中了,会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…

经典NLP案例 | 推文评论情绪分析:从数据预处理到模型构建的全面指南

NLP经典案例:推文评论情绪提取 项目背景 “My ridiculous dog is amazing.” [sentiment: positive] 由于所有推文每秒都在传播,很难判断特定推文背后的情绪是否会影响一家公司或一个人的品牌,因为它的病毒式传播(积极&#xff0…

杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

上一节,我们分清了主次矛盾,并搞定了主要矛盾(去掉黄色的字),这一节解决次要矛盾(矩形色带)。 我们的想法如图: 1,我们找到稳定黄色的最左边,最右边两点&…

第24周:文献阅读

目录 摘要 Abstract 一、现有问题 二、提出方法 三、创新点 模型结构创新 强化学习与GAN结合 属性特征与通顺性优化 四、方法论 生成对抗网络(GAN) 强化学习(RL) 模型组件 五、实验研究 数据集 数据预处理 评价指…

SQL server学习05-查询数据表中的数据(上)

目录 一,基本格式 1,简单的SQL查询语句 2,关键字TOP 3,关键字DISTINCT 二,模糊查询 1,通配符 三,对结果集排序 1,不含关键字DISTINCT 2,含关键字DISTINCT 3&…

【Azure 架构师学习笔记】- Azure Function (1) --环境搭建和背景介绍

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Function 】系列。 前言 随着无服务计算的兴起和大数据环境中的数据集成需求, 需要使用某些轻量级的服务,来实现一些简单操作。因此Azure Function就成了微软云上的一个必不可少的组成部分。 …

KeepAlive与RouterView缓存

参考 vue动态组件<Component>与<KeepAlive> KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…