You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle升级后R.id识别异常及Material UI组件ID引用问题

解决方案

1. 匹配AGP与Gradle版本(优先推荐)

Gradle 8.x需要对应版本的Android Gradle Plugin(AGP),版本不匹配会导致资源合并异常,应用R类无法正确包含Material库的资源ID。

  • Gradle 8.3.x 对应 AGP 8.1.x
  • Gradle 8.4.x 对应 AGP 8.2.x

修改项目根目录的build.gradle(或build.gradle.kts)中的AGP版本:

// Groovy语法
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:8.2.0' // 对应Gradle 8.4
    }
}
// Kotlin DSL语法
buildscript {
    dependencies {
        classpath("com.android.tools.build:gradle:8.2.0")
    }
}

同步项目后,应用R类会自动包含Material库的资源ID,直接使用binding.myId.findViewById(R.id.text_input_end_icon)即可生效。

2. 针对Java/Kotlin的代码层面优化(保留android.nonFinalResIds=false时)

如果必须保留android.nonFinalResIds=false来兼容旧代码,可按语言类型处理:

Java项目

避免通配符导入(IDE会标记未使用),改为静态导入单个常用的Material资源ID:

import static com.google.android.material.R.id.text_input_end_icon;

// 使用时直接引用ID常量
binding.myId.findViewById(text_input_end_icon);

Kotlin项目

创建扩展属性简化调用,无需重复写全路径:

// 在单独的扩展文件(如MaterialViewExtensions.kt)中定义
import android.view.View
import com.google.android.material.R.id.text_input_end_icon

val View.textInputEndIcon: View?
    get() = findViewById(text_input_end_icon)

之后在代码中直接使用:

binding.myId.textInputEndIcon?.let {
    // 对找到的View执行操作
}

3. 清理缓存并重新构建

如果上述方案无效,尝试清理项目缓存:

  • 执行File > Invalidate Caches... > Invalidate and Restart
  • 或终端运行:
    # Mac/Linux
    ./gradlew clean build
    
    # Windows
    gradlew clean build
    

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:28:20