android.content.res.Resources$NotFoundException: File res/drawable/ripple_round_blue.xml

本文解决了一个关于Android应用中按钮使用水波纹效果时遇到的兼容性问题,详细介绍了如何调整资源文件以确保低版本Android系统也能正常显示。

详细错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.demo.xxx/com.demo.xxx.ui.login.LoginActivity}: android.view.InflateException: Binary XML file line #195: Error inflating class Button

导致原因:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ripple_round_blue.xml from drawable resource ID #0x7f02010b
1、刚开始以为对应xml布局文件对应的button的id写错了,在activity当中找不到,检查发现,发现id是对的
2、然后想到会不会是button的id名字和drawable当中的命名冲突,于是又把button的id名字换了一个,运行发现依然不行,顺着错误下方找,发现下面如下图的错误
这里写图片描述
看到的第一反应是以为自己大意了 ripple_round_blue.xml布局文件没有写,查找发现,写了
那会是什么问题呢?
既然找不到,那么我是否可以把布局文件当中Button引用的ripple_round_blue.xml资源文件去掉呢?去掉运行,程序可以跑起来?
既然找不到,要么就是没写,再者其他情况就是不兼容,人家Button压根不支持,所以才提示找不到,再次返回仔细查看资源文件ripple_round_blue.xml,如下图:
这里写图片描述
是的,没错,ripple,这个只在Android5.0以上版本出现,5.0以下的版本都不支持
当然这个资源文件放到drawable-v21是可以的,如下图:
这里写图片描述
于是乎,把drawable目录下的资源文件ripple_round_blue.xml改成shape,如下图:
这里写图片描述
运行,OK
这里还是有遗憾,本意是想做控件水波纹效果,但是坑爹的Android低版本不兼容高版本的特性ripple,
待续,研究下,看有无通用的selector来实现通用的水波纹效果……

这个错误表明系统无法找到名为 `mp_ad_loading_anim` 的 Drawable 资源,尽管你认为已经定义了它。以下是可能的原因和解决方案: 1. **资源文件未正确放置**: - 确保 `mp_ad_loading_anim.xml` 文件位于 `res/drawable/` 目录下(或 `res/drawable-xxhdpi/` 等特定分辨率目录)。 - 检查文件名是否完全匹配(包括大小写),因为 Android 资源系统区分大小写。 2. **资源未正确生成**: - 清理并重新构建项目(在 Android Studio 中选择 `Build > Clean Project`,然后 `Build > Rebuild Project`)。 - 检查 `R.java` 文件(通常位于 `app/build/generated/` 目录)是否包含 `mp_ad_loading_anim` 的条目。如果没有,说明资源未被正确编译。 3. **资源引用错误**: - 确保你在代码中引用的资源 ID 是正确的。可以通过以下方式验证: ```kotlin val resId = resources.getIdentifier("mp_ad_loading_anim", "drawable", packageName) if (resId == 0) { Log.e("TAG", "Resource not found!") } else { val loadingDrawable = ContextCompat.getDrawable(this, resId) } ``` - 如果 `resId` 为 0,说明资源确实不存在或无法访问。 4. **模块或依赖问题**: - 如果资源位于库模块中,确保库模块已正确依赖到主模块中。 - 检查 `settings.gradle` 和 `build.gradle` 文件,确认所有模块和依赖项已正确配置。 5. **资源冲突或覆盖**: - 如果有多个模块或库定义了同名资源,可能会导致冲突。尝试使用完全限定名引用资源: ```kotlin val loadingDrawable = ContextCompat.getDrawable(this, resources.getIdentifier("com.tplink.apps.feature.advanced.heatmap:drawable/mp_ad_loading_anim", null, null)) ``` 6. **文件格式问题**: - 确保 `mp_ad_loading_anim.xml` 文件是有效的 XML 文件,没有语法错误。可以尝试用文本编辑器打开并验证其内容。 7. **ProGuard 或 R8 混淆问题**: - 如果启用了代码混淆,确保资源未被错误地移除或重命名。检查 `proguard-rules.pro` 文件,添加以下规则以保留资源: ```proguard -keep class com.tplink.apps.feature.advanced.heatmap.R$drawable { *; } ``` 如果以上方法都无法解决问题,可以尝试以下调试步骤: - 在 `res/drawable/` 目录下创建一个简单的测试资源(如 `test.xml`),并尝试在代码中引用它,以确认资源系统是否正常工作。 - 检查项目的 `mergeDebugResources` 或 `mergeReleaseResources` 任务日志,查看是否有关于资源合并的警告或错误。 希望这些建议能帮助你解决问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值