如何利用字符串动态设置ImageView加载Drawable中的扑克牌图片?
解决方案
方法一:通过字符串转资源ID(适配现有HashMap)
你现在的核心问题是setImageResource需要的是R.drawable.xxx对应的整数资源ID,而非图片文件名字符串。可以通过getResources().getIdentifier()方法将文件名转换为资源ID,步骤如下:
- 先去掉文件名的
.png后缀(R.drawable中的资源名不带文件后缀) - 调用
getIdentifier获取对应的资源ID - 检查ID有效性后,设置到ImageView中
示例代码:
// 从HashMap获取带后缀的文件名,比如"clubsace.png" String imgFileName = cards.get(1); // 移除.png后缀,得到资源名"clubsace" String imgResName = imgFileName.replace(".png", ""); // 根据资源名获取drawable的资源ID int resId = getResources().getIdentifier(imgResName, "drawable", getPackageName()); // 检查资源是否存在,避免无效ID导致崩溃 if (resId != 0) { dealt2.setImageResource(resId); } else { // 可选:设置默认占位图 dealt2.setImageResource(R.drawable.default_card); }
方法二:直接在HashMap中存储资源ID(更高效推荐)
如果可以调整HashMap的结构,建议直接将数字映射到R.drawable的整数ID,这样省去字符串转ID的运行时开销,代码也更简洁:
// 初始化HashMap,直接存储资源ID HashMap<Integer, Integer> cards = new HashMap<>(); cards.put(1, R.drawable.clubsace); cards.put(2, R.drawable.clubs2); // ... 依次添加剩余50张牌的资源ID // 使用时直接获取ID设置到ImageView Integer cardResId = cards.get(yourCardNumber); if (cardResId != null) { dealt2.setImageResource(cardResId); }
注意事项
getIdentifier方法找不到对应资源时会返回0,必须添加非0判断,防止应用崩溃- 方法二性能更优,因为直接使用编译时生成的资源ID,无需运行时查找资源名
内容的提问来源于stack exchange,提问作者Blake Only
相关产品推荐
相关产品推荐

