如何从数组中获取特定图片并在Android ImageView中使用?
安卓卡牌应用加载Drawable资源到ImageView解决方案
你的核心问题是误用了字符串路径处理Drawable资源,Android中必须通过资源ID才能正确加载并显示图片到ImageView。以下是具体修正方案:
1. 重构资源匹配逻辑(替换GameVariables中的代码)
放弃字符串截取路径的方式,直接通过卡牌的花色和数字生成资源名称,再获取对应的资源ID:
// 假设suit为卡牌花色(如"clubs"),number为卡牌数字/花牌(如"2"、"jack") val resourceName = "${suit.lowercase()}_${number.lowercase()}" // 通过资源名称获取ID,需传入Context(可通过构造或参数传递) val resourceId = context.resources.getIdentifier( resourceName, "drawable", context.packageName ) if (resourceId != 0) { // 0代表未找到对应资源,需做判断避免崩溃 cardOut = resourceId // 建议将cardOut的类型从String改为Int,直接存储资源ID }
2. 若需保留String数组的使用方式
如果你希望继续用定义的card_images数组管理卡牌资源,可以这样提取并转换为资源ID:
// 获取string数组 val cardImageArray = context.resources.getStringArray(R.array.card_images) // 查找匹配的资源项 val targetResourceEntry = cardImageArray.find { entry -> val resourceName = entry.substringAfter("@drawable/") resourceName == "${suit.lowercase()}_${number.lowercase()}" } targetResourceEntry?.let { val resourceName = it.substringAfter("@drawable/") val resourceId = context.resources.getIdentifier( resourceName, "drawable", context.packageName ) if (resourceId != 0) { cardOut = resourceId } }
3. 在GameActivity中设置图片到ImageView
拿到资源ID后,直接调用ImageView的setImageResource方法即可显示图片:
gameVariables.playerHands.forEach { hand -> val cardResourceId = gameVariables.updateHandImages(hand.firstCard, cardImageArray) if (cardResourceId != 0) { // 获取ImageView实例(推荐用ViewBinding替代findViewById) val cardImageView = findViewById<ImageView>(R.id.your_card_image_view) cardImageView.setImageResource(cardResourceId) } }
额外优化建议
- 将
cardOut的类型从String改为Int,直接存储资源ID,避免不必要的字符串操作和错误。 - 初始化时缓存所有卡牌的资源ID,提升运行时性能:
// 在初始化阶段执行一次,缓存所有卡牌ID val cardResourceIds = context.resources.getStringArray(R.array.card_images) .map { it.substringAfter("@drawable/") } .mapNotNull { val id = context.resources.getIdentifier(it, "drawable", context.packageName) if (id != 0) id else null }
内容的提问来源于stack exchange,提问作者schnondle
相关产品推荐
相关产品推荐

