Android如何根据随机选中的神明名称自动匹配res对应drawable图片资源
实现方案
你之前的写法不可行的核心原因是:R.drawable是Android编译阶段生成的静态常量类,不支持运行时动态拼接变量读取资源ID,需要通过系统提供的Resources.getIdentifier()方法动态根据资源名称获取对应ID。
完整实现代码
final String[] godslist = {"Achilles", "Agni", "Ah Muzen Cab", "Ah Puch", "Amaterasu", "Anhur", "Anubis", "Ao Kuang", "Aphrodite", "Apollo", "Arachne", "Ares", "Artemis", "Artio"}; final ImageView godImage = findViewById(R.id.godImage); final TextView godName = findViewById(R.id.nameOfGod); int randomGod = (int) (Math.random() * godslist.length); // 建议直接用数组长度,避免后续新增元素后还要改数字 String selectedGod = godslist[randomGod]; godName.setText(selectedGod); // 转换为资源命名:全小写+去除所有空格 String resName = selectedGod.toLowerCase().replaceAll(" ", ""); // 动态获取drawable图片资源ID int drawableResId = getResources().getIdentifier(resName, "drawable", getPackageName()); if (drawableResId != 0) { // getIdentifier找不到资源会返回0 godImage.setImageResource(drawableResId); } else { // 兜底:找不到资源时显示默认占位图 godImage.setImageResource(R.drawable.default_placeholder); }
音频资源匹配逻辑
音频资源放在res/raw目录下,命名规则和图片保持一致,只需修改getIdentifier的资源类型参数即可复用逻辑:
int audioResId = getResources().getIdentifier(resName, "raw", getPackageName()); if (audioResId != 0) { // 示例:使用MediaPlayer播放音频 MediaPlayer mediaPlayer = MediaPlayer.create(this, audioResId); mediaPlayer.start(); // 记得在页面销毁时调用mediaPlayer.release()回收资源 }
注意事项
- 资源命名必须和转换后的
resName完全匹配,例如Ah Muzen Cab转换后为ahmuzencab,对应drawable下的图片必须命名为ahmuzencab.jpg - 如果代码写在Fragment中,需要替换为
requireContext().getResources()和requireContext().getPackageName()获取上下文相关参数 - 建议始终增加资源不存在的兜底判断,避免出现界面异常
内容的提问来源于stack exchange,提问作者Dodek750
相关产品推荐
相关产品推荐

