静的に定義されたリソース ID をプログラム上から取得する方法です。
getIdentifier を使う
Resources クラスで定義されている getIdentifier
を使います。
Resources | Android Developers
たとえば、strings.xml
内で、prefix_01
prefix_02
... prefix_10
のように文字列が連番で定義されているとします。これをプログラム上から動的に得るには、
for (i in 1..10) {
val id = resources.getIdentifier("prefix_${i.toString().padStart(2, '0')}", "string", packageName)
}
とします。
リフレクションを使う
リソースファイル内で定義されたリソース ID が連番になっていないなど、何らかの理由で上記の方法が使えない or 使いにくい場合は、リフレクションを使います。
たとえば、strings.xml
内で prefix_
から始まる文字列のリソース ID を全て取得したい場合は、次のようにします。
for (field in R.string::class.java.declaredFields) {
if (Modifier.isStatic(field.modifiers) && !Modifier.isPrivate(field.modifiers) && field.type == Int::class.javaPrimitiveType) {
try {
if (field.name.startsWith("prefix_")) {
val id = field.getInt(null)
// do something
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
異なるパッケージ内の R
を参照する場合は、パッケージネームを直接指定する必要があります。
com.example.R.string::class.java.declaredFields
参考
文字列からリソースIDを取得する - Qiita
android - How to easily iterate over all strings within the "strings.xml" resource file? - Stack Overflow