开启View Binding后自定义RecyclerView Adapter报Cannot resolve symbol R错误
问题成因
开启View Binding后仅Adapter出现Cannot resolve symbol R报错,核心原因是View Binding生成逻辑改变了IDE对R类的索引优先级,具体触发逻辑如下:
- 开启View Binding后,AGP(Android Gradle插件)会基于模块
build.gradle中配置的namespace生成所有绑定类,同时IDE会将该namespace对应包路径作为当前模块R类的默认检索范围 - 若你的自定义RecyclerView Adapter存放的包路径,不属于
namespace对应的包或其子包,IDE就无法自动定位到当前项目的R类,只会优先索引到第三方依赖的R类,因此会自动导入错误的R包、报找不到符号的错误 - Activity引用正常的原因是创建Activity时默认会放在
namespace对应包/子包下,属于IDE的默认检索范围 - 未开启View Binding的项目不会复现问题,是因为未启用View Binding时,IDE对当前项目R类的索引优先级更高,不受包路径从属关系的严格限制
需要手动导入项目.R文件的场景
只有两种场景需要手动导入项目R类:
- 类文件的存放路径不属于当前模块
namespace对应的包或其子包 - 需要同时引用多个模块的资源,需要通过显式导入区分不同模块的R类
R引用不是全局默认生效的原因
- Android的R类是模块级作用域,每个模块、每个第三方依赖都会生成独立的R类,不同R类的资源ID可能存在重复
- 如果设置为全局默认生效,会大概率出现资源ID冲突、引用到非预期资源的问题,因此IDE默认只会为
namespace从属路径下的类自动导入当前模块的R类,不在该范围的类需要手动指定要引用的R类
单个文件R无法解析的处理方案
按优先级依次执行排查:
- 先检查报错文件的包路径,确认是否和模块
build.gradle中配置的namespace是从属关系,例如namespace为com.example.demo,文件包名需要为com.example.demo或com.example.demo.xxx开头,若不匹配可选择调整文件存放路径,或在文件顶部手动添加import 你的namespace对应的包名.R - 检查是否开启了非传递性R类(AGP 8.0+默认开启),若你引用的资源属于其他模块,需要手动导入对应模块的R类
- 检查文件顶部已导入的R类是否是第三方库的R类,删除错误的导入语句后手动导入当前项目的R类即可
- 上述操作都无效的情况下,再执行清理重建、清除IDE缓存操作(
File > Invalidate Caches...)
内容的提问来源于stack exchange,提问作者prosp
相关产品推荐
相关产品推荐

