You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数组中获取特定图片并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:19:54