Android 6.0中NavigationView加载崩溃求助(7.0运行正常)
嘿,我来帮你搞定这个崩溃问题!从你提供的Logcat和代码来看,核心问题是NavigationView加载菜单时找不到某个资源(ID#0x7f07006b),这个问题在Android 7.0上正常,但6.0崩溃,大概率是矢量图标兼容性或者资源存放目录的问题,以下是具体的排查和解决步骤:
一、先定位问题根源
从Logcat的深层报错可以看到:
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f07006b
...
at android.support.v7.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:491)
这说明崩溃是在加载菜单@menu/nevigation里的某个菜单项图标时触发的,Android 6.0(API 23)对矢量图标的支持和高版本不同,如果你的菜单里用了矢量图标,就容易出现这个问题。
二、具体解决方案
1. 开启矢量图兼容支持
如果你的菜单item用了矢量图标(.xml格式的vector资源),需要让低版本系统也能识别它们:
- 在你的app模块的
build.gradle文件中,添加矢量图兼容配置:android { defaultConfig { // 开启矢量图支持库 vectorDrawables.useSupportLibrary = true } } - 然后在自定义Application类的
onCreate方法中初始化兼容(如果没有自定义Application,就新建一个并在Manifest中注册):public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 启用矢量图兼容 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } } - 同时,菜单文件
res/menu/nevigation.xml中,把菜单项的android:icon替换为app:icon,这样AppCompat库才能正确加载矢量图标:<item android:id="@+id/menu_item" android:title="标题" app:icon="@drawable/ic_vector_icon" /> <!-- 用app:icon代替android:icon -->
2. 检查资源存放目录
确保菜单中用到的所有图标资源都放在通用的drawable目录下,而不是只放在drawable-v23、drawable-v24这类高版本专属目录里。如果资源只在高版本目录,Android 6.0系统就找不到它们。
3. 验证资源ID对应的内容
你可以通过Android Studio快速定位这个缺失的资源:
- 打开
app/build/generated/source/r/debug/下的R.java文件,搜索0x7f07006b,找到对应的资源名称(比如ic_menu_xxx)。 - 然后在
res目录中查找这个资源,确认它存在且没有被错误地放在高版本目录中。
4. 统一Support库版本
确保你的项目中所有Support库的版本保持一致,避免版本不兼容导致的问题。比如你的目标SDK是26,那么依赖应该是:
implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:design:26.1.0' implementation 'com.android.support:support-v4:26.1.0'
所有Support库的版本号要完全相同。
三、额外检查点
- 确认你的
MainActivity继承的是AppCompatActivity(你已经做到了,这点没问题)。 - 检查布局文件中
NavigationView的app:menu引用是否正确(你写的是@menu/nevigation,注意拼写是navigation,如果文件名是nevigation.xml那没问题,否则要修正文件名)。
按照这些步骤排查后,应该就能解决Android 6.0上的崩溃问题了!
内容的提问来源于stack exchange,提问作者Reality

