そんなAPIはないから自分で頑張るんだよォ!
(ネタ記事です)
コード
stringリソースの一覧を得る
kotlin
val fields = R.string::class.java.fields
リソースIDを得る
kotlin
val ids = R.string::class.java.fields
.map {
it.getInt(null)
}
もっと安全に
kotlin
val ids = R.string::class.java.fields
.filter {
Modifier.isStatic(it.modifiers)
}
.map {
it.getInt(null)
}
最大限安全に
kotlin
val ids = R.string::class.java.fields
.filter {
Modifier.isPublic(it.modifiers)
&& Modifier.isStatic(it.modifiers)
&& Modifier.isFinal(it.modifiers)
}
.filter {
it.type == java.lang.Integer.TYPE
}
.map {
it.getInt(null)
}
リソースIDからリソース名を得る
kotin
val names = R.string::class.java.fields
.filter {
Modifier.isPublic(it.modifiers)
&& Modifier.isStatic(it.modifiers)
&& Modifier.isFinal(it.modifiers)
}
.filter {
it.type == java.lang.Integer.TYPE
}
.map {
it.getInt(null)
}
.map {
resources.getResourceEntryName(it)
}
stringだけと言わずRの中全部欲しい
kotlin
val ids = R::class.java.classes
.filter {
// styleableだけリソースIDじゃないので闇が深くて除外
it != R.styleable::class.java
}
.flatMap {
it.fields.asIterable()
}
.filter {
Modifier.isPublic(it.modifiers)
&& Modifier.isStatic(it.modifiers)
&& Modifier.isFinal(it.modifiers)
}
.filter {
it.type == java.lang.Integer.TYPE
}
.map {
it.getInt(null)
}
学び
全然関係ない学びがあった。
- Class<int>が存在している
- Class<int>は
Integer.TYPE
で取得できる- 他のプリミティブ型も各々のラッパークラスにTYPEが定義されてる
- Classをどう作ってるのか調べたら、配列型を使ってゴニョゴニョしてて笑った
-
Integer.class
!=Integer.TYPE
(Class<int>)