2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

動的にリソースIDを取得する2つの方法

Last updated at Posted at 2021-01-08

静的に定義されたリソース 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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?