Xamarin.Android通过代码获取尺寸抛出Resources+NotFoundException问题咨询
嘿,我之前在Xamarin.Android开发时也踩过这个坑!Android.Content.Res.Resources+NotFoundException在获取尺寸时出现,通常是资源引用或者上下文的问题,咱们来逐一排查可能的原因:
资源ID引用错误或资源未定义
首先检查你引用的尺寸是否真的存在于Resources/values/dimens.xml(或对应密度的values文件夹)中,并且名称拼写完全一致。Xamarin会自动生成Resource.Dimension.xxx的ID,如果你的dimens文件里没有这个条目,或者名称大小写/拼写错了(比如把my_small_size写成mySmallSize),就会触发异常。上下文(Context)使用不当
获取资源时,不同的上下文可能会影响资源的加载。比如在Application的OnCreate方法中过早调用资源获取,或者使用ApplicationContext而非当前Activity的上下文——有些尺寸是和主题绑定的,ApplicationContext没有加载当前Activity的主题配置,导致找不到对应的资源。建议换成当前Activity的上下文,比如在Activity里直接用this.Resources或者Resources.GetDimension(...)。资源配置不匹配
如果你为不同屏幕密度(如hdpi、xhdpi、xxhdpi)单独定义了dimens文件夹,要确保目标设备对应的密度文件夹里存在你要获取的尺寸。如果某个密度文件夹缺失该尺寸,系统会 fallback 到默认的values文件夹,但如果默认文件夹里也没有,就会抛异常。最好在默认values/dimens.xml里定义基础尺寸,再在其他密度文件夹里做适配。混淆/资源压缩误删资源
如果你开启了ProGuard/R8混淆或者资源压缩功能,可能会把你需要的尺寸资源误判为无用资源而删除。可以在res/raw/keep.xml中添加规则保留指定的尺寸:<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@dimen/your_target_dimension" />同时检查混淆规则,确保没有误删资源相关的代码。
Xamarin资源生成异常
有时候Xamarin的资源生成器(aapt)会出问题,导致Resource.designer.cs里没有生成对应尺寸的ID。试试先Clean Solution,然后Rebuild Solution,让Xamarin重新生成所有资源ID,这往往能解决这类奇怪的问题。错误的资源获取方法调用
如果你用Resources.GetIdentifier来动态获取资源ID,要确保参数正确:int dimenId = Resources.GetIdentifier("your_dimension_name", "dimen", PackageName); if (dimenId != 0) { float size = Resources.GetDimension(dimenId); } else { // 资源不存在的处理逻辑 }这里第二个参数必须是
"dimen",包名也要正确,如果参数错误会返回0,后续调用GetDimension就会触发异常。
举个正确获取尺寸的示例:
// 在Activity内部的正确写法 float dpSize = Resources.GetDimension(Resource.Dimen.my_custom_dp_size); // 如果需要直接获取像素值 int pixelSize = Resources.GetDimensionPixelSize(Resource.Dimen.my_custom_dp_size);
内容的提问来源于stack exchange,提问作者Drake




