Android Studio Java项目点击选项菜单报ResourcesNotFoundException崩溃
错误根因
你遇到的Resources$NotFoundException崩溃,是系统加载菜单资源时找不到对应ID的drawable文件导致的,从错误堆栈可以定位到问题出在解析mymenu.xml里的菜单项图标阶段。
解决方案
按优先级依次排查修改:
- 检查drawable资源存放路径
确认basketball、butterfly两个图片资源存放在通用的res/drawable目录下,不要仅存放在drawable-v24等带版本限定的目录中。如果你的应用最低兼容版本低于24,高版本限定目录下的资源在低版本系统运行时会找不到,直接触发该报错。 - 检查资源文件名合法性
确保图片文件名全为小写、无空格或特殊字符,和mymenu.xml中引用的@drawable/basketball、@drawable/butterfly完全一致,Android的资源文件名大小写敏感,拼写不一致也会触发资源找不到错误。 - 清理重建项目消除缓存异常
如果确认资源存放和命名都没问题,大概率是Android Studio的构建缓存异常导致资源ID不匹配,点击顶部菜单栏Build > Clean Project,再执行Rebuild Project后重新运行即可。 - 修复SecondScreenActivity逻辑漏洞
你当前SecondScreenActivity里的switch分支没有加break,会出现选中Animals分类时,先执行Animals的赋值逻辑,再继续执行Sport的赋值逻辑,导致最终内容被覆盖,修改后的代码如下:
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; public class SecondScreenActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second_screen); TextView tvCat = findViewById(R.id.tvCat); ImageView ivPic = findViewById(R.id.ivPic); Intent intent = getIntent(); String option = intent.getStringExtra(FirstScreenActivity.EXTRA_OPTION); switch(option) { case "Animals": tvCat.setText("Animals"); tvCat.setTextSize(30); ivPic.setImageResource(R.drawable.butterfly); break; case "Sport": tvCat.setText("Sport"); tvCat.setTextSize(30); ivPic.setImageResource(R.drawable.basketball); break; } } }
可选优化:强制显示溢出菜单图标
Android默认会隐藏溢出菜单(即你设置app:showAsAction="never"的菜单项)的图标,如果你需要溢出菜单也显示图标,可以在FirstScreenActivity的onCreateOptionsMenu方法中加入反射逻辑实现,修改后的代码如下:
package com.example.myapplication; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import java.lang.reflect.Method; public class FirstScreenActivity extends AppCompatActivity { public static final String EXTRA_OPTION="category"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first_screen); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.mymenu,menu); // 强制显示溢出菜单图标 if(menu.getClass().getSimpleName().equals("MenuBuilder")){ try{ Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e){ e.printStackTrace(); } } return true; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { String option = "default"; switch(item.getItemId()) { case R.id.Animals: option = "Animals"; break; case R.id.Sport: option = "Sport"; break; } Intent intent = new Intent(this, SecondScreenActivity.class); intent.putExtra(EXTRA_OPTION,option); startActivity(intent); finish(); return true; } }
内容的提问来源于stack exchange,提问作者MORAN
相关产品推荐
相关产品推荐

