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
相关产品推荐
相关产品推荐

