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

Android Kotlin读取drawable图片名称返回空数组问题排查

问题排查与修复方案

你的代码返回空数组的核心原因是错误混淆了res/drawable资源目录和assets目录的访问方式,另外还有几个细节问题需要修正,以下是具体分析和修复:

1. 核心错误:用Assets API访问res/drawable

res.assets.list("drawable")是用来读取assets/drawable子目录下的文件,而非res/drawable目录。res目录下的资源会被Android编译处理,无法通过Assets API直接枚举,必须通过反射读取R.drawable类的字段来获取所有drawable资源名。

2. 次要问题:资源名可能带扩展名

即使你用Assets API拿到文件名(比如ic_launcher.png),getIdentifier需要的是不带.png这类扩展名的资源名,直接传入会导致返回0,无法匹配到资源ID。

修复后的代码

private fun getImageNames(): Array<String> {
    val imageNames = mutableListOf<String>()
    val packageName = packageName

    // 通过反射获取R.drawable类的所有字段(即所有drawable资源)
    val drawableClass = Class.forName("$packageName.R\$drawable")
    val fields = drawableClass.declaredFields

    for (field in fields) {
        // 获取资源名(不带扩展名)
        val resourceName = field.name
        // 过滤掉以"np"开头的资源,以及系统自动生成的资源
        if (!resourceName.startsWith("np") && !resourceName.startsWith("abc_") && !resourceName.startsWith("ic_launcher")) {
            val resourceId = resources.getIdentifier(resourceName, "drawable", packageName)
            if (resourceId != 0) {
                val imageUri = "android.resource://$packageName/$resourceId"
                imageNames.add(imageUri)
            }
        }
    }

    return imageNames.toTypedArray()
}

额外说明

  • 反射R.drawable类是枚举res/drawable资源的标准方式,Android编译后会把所有drawable资源的ID存入这个类的字段中。
  • 过滤条件里增加了对系统自动生成资源(如abc_开头的AppCompat资源、默认启动图标)的过滤,你可以根据自身需求调整。
  • imageUri的正确格式不需要末尾斜杠,标准格式为android.resource://包名/资源ID。

内容的提问来源于stack exchange,提问作者Tommie007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:03