API 23及以下版本启动时触发android.content.res.Resources$NotFoundException怎么解决?
解决API23及以下版本菜单加载崩溃的问题
嘿,这个坑我之前踩过!只测高版本确实容易忽略低版本的资源兼容问题,结合你说的报错是Resources相关,给你几个具体的排查和修复方向:
检查菜单资源的属性兼容性
API23及以下对AppCompat属性和矢量图的支持有限:- 如果菜单里用了矢量图标,一定要在模块的
build.gradle(Module级)里添加配置:
同时在Application的android { defaultConfig { vectorDrawables.useSupportLibrary = true } }onCreate()方法里开启兼容:AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - 菜单中的
showAsAction属性,要同时兼容旧版和新版,比如:<item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="ifRoom" app:showAsAction="ifRoom"/>
- 如果菜单里用了矢量图标,一定要在模块的
切换到AppCompat的MenuInflater
如果你当前继承的是Activity而非AppCompatActivity,低版本系统的原生MenuInflater无法解析AppCompat相关的菜单属性。建议改成继承AppCompatActivity,然后用兼容的菜单加载方法:MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.actionbar_menu, menu);这一步是很多人忽略的关键点,我当初就是因为用了原生
getMenuInflater()在API22上崩溃了。排查资源文件的版本限制
检查R.menu.actionbar_menu里引用的所有资源(图标、字符串、样式等),有没有标记为仅API24+可用的(比如放在drawable-v24、layout-v24目录下,或者XML里用了tools:targetApi="24")。如果有,要么复制一份兼容版到通用目录,要么调整资源属性让它支持低版本。解析完整的异常日志
你提到的android.content.res.Resources$...报错,完整的异常信息(比如NotFoundException、XmlPullParserException)能精准定位问题:- 如果是
NotFoundException:说明某个资源在低版本系统中找不到,检查资源的目录结构和引用路径 - 如果是
XmlPullParserException:说明菜单XML里有低版本不支持的标签或属性,比如某些仅高版本可用的XML属性
- 如果是
内容的提问来源于stack exchange,提问作者Andrew Heschl
相关产品推荐
相关产品推荐

