Android报错Cannot resolve symbol abc_ic_ab_back_material
问题现象
之前运行完全正常的ActionBar返回按钮设置代码,打开项目后IDE提示Cannot resolve symbol 'abc_ic_ab_back_material'错误,无法解析对应drawable资源,涉及代码如下:
final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_material); upArrow.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP); getSupportActionBar().setHomeAsUpIndicator(upArrow); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ finish(); } });
报错根因
abc_ic_ab_back_material是AppCompat支持库的内部私有资源,不属于公开可稳定引用的API:
- 旧版本AppCompat会把这个资源ID映射到当前App的R文件中,所以可以直接通过自己项目的
R.drawable引用 - 从AppCompat 1.4.0版本开始,这个资源不再被映射到业务App的R文件索引中,加上Gradle依赖自动升级、IDE缓存失效、索引异常等情况,就会触发资源找不到的报错。
解决方法
- 临时快速修复:直接引用AppCompat包下的资源ID,替换原有获取drawable的代码即可
如果你的项目已经迁移到AndroidX:
如果是还在使用旧Support库的项目:final Drawable upArrow = getResources().getDrawable(androidx.appcompat.R.drawable.abc_ic_ab_back_material);final Drawable upArrow = getResources().getDrawable(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material); - 长期稳定方案:自行导入返回箭头矢量图资源,彻底规避依赖库内部资源变动的风险
- 在Android Studio中右键
res/drawable目录,依次选择New -> Vector Asset - 打开Vector Asset配置面板后,点击Clip Art旁边的图标,在素材库搜索
arrow back,选中官方返回箭头素材,自定义命名后保存到drawable目录 - 将代码中引用的
R.drawable.abc_ic_ab_back_material替换为你自己导入的资源ID即可,后续不管怎么升级AppCompat版本,都不会再出现同类资源找不到的问题。
- 在Android Studio中右键
- 缓存异常排查:如果是拉取新代码、升级Gradle插件后突然出现的报错,可以先依次点击菜单栏的
Build -> Clean Project,等待清理完成后再点击Build -> Rebuild Project,重建资源索引,部分缓存导致的索引异常问题通过这步就能解决。
注意:日常开发不要直接引用依赖库的私有资源,这类资源没有兼容性承诺,版本迭代中随时可能被改名、移除,会导致不必要的编译错误。
内容的提问来源于stack exchange,提问作者Bhaskar Jyoti Dutta
相关产品推荐
相关产品推荐

