Xamarin.Android类库API21/22下Resources+NotFoundException问题求助
解决Xamarin.Android类库API21/22下资源找不到的异常
这个问题我之前在项目里也碰到过,核心原因是API21/22环境下,类库对带版本后缀的资源目录(比如drawable-v21)的加载逻辑和更高版本有差异,或者资源打包配置没做好。咱们一步步来排查解决:
先排查基础配置问题
- 确认你的
btn_XXXX.xml文件确实放在类库的Resources/drawable-v21目录下,并且Build Action设置为AndroidResource。Xamarin里如果这个属性不对,资源根本不会被打包进类库,自然找不到。 - 清理整个解决方案,删除bin/obj目录,然后重新生成类库和宿主应用。有时候缓存会导致资源没有正确更新到目标版本中。
针对性解决方案
方案1:添加通用版本的资源
把btn_XXXX.xml复制一份到类库的Resources/drawable目录(不带任何API版本后缀)。这样:
- API23+的设备会优先加载
drawable-v21里的版本(符合你的设计需求) - API21/22的设备会加载
drawable目录下的通用版本,避免找不到资源的问题
注意:通用版本的XML里不要使用API21以上才支持的属性(比如
android:elevation是API21支持的就没事,API23+的属性要去掉或者用兼容方式)
方案2:使用兼容性API加载资源
替换掉直接调用SetButtonDrawable(Resource.Drawable.btn_XXXX)的代码,改用ContextCompat来获取Drawable,它会自动处理不同API版本的资源适配:
using Android.Support.V4.Content; // 记得引用这个命名空间 // 在你的控件/Activity代码中 var drawable = ContextCompat.GetDrawable(Context, Resource.Drawable.btn_XXXX); this.SetButtonDrawable(drawable);
这种方式能确保资源被正确加载,避免旧API下的资源查找逻辑问题。
方案3:检查类库的SDK版本配置
打开类库的项目属性,确认:
- Minimum Android version设置为API21或者更低(比如API19),确保API21/22的设备能正常加载类库的资源
- Target Android version设置为API23或者更高,和你测试的正常版本保持一致
额外排查点
如果以上方法都没用,检查宿主应用的资源是否和类库的资源ID冲突。不过从错误信息看是找不到文件,ID冲突一般会报其他错误,所以这个概率比较低,但可以通过查看生成的Resource.designer.cs文件确认btn_XXXX的ID是否正确。
内容的提问来源于stack exchange,提问作者sarath kumar
相关产品推荐
相关产品推荐

