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
相关产品推荐
相关产品推荐

