LoginSignup
3
5

More than 5 years have passed since last update.

Androidのリソース名/IDを一覧する

Posted at

そんな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>)
3
5
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
3
5