見出し画像

【Android】findViewById()を使わず名前でビュー取得する方法

本当はブログの方に書こうと思ってたけど、
それほどでもない内容だったからnoteの方に書きます。

Android開発でこういうことが実現したかった……

  • ビュー取得はfindViewByIdを使う

  • でもそれを使わず名前でビュー取得したい

どういうことかというと次のような感じです。

ビュー取得には普通はfindViewByIdを使う

ほとんどの場合はfindViewByIdを使うはず

▼ 例えば一番シンプルな使用例

/// ビューIDでビュー取得
val view: View= findViewById(R.id.my_view)

このコードみたいに R.id.my_view のようなビューIDを渡す。

でも僕はビューの名前で取得したかったんですよ。
この例なら R.id.my_view では my_view がビュー名前になります。

▼ 疑似的なコードを示すなら……

/// ビュー名前からビュー取得
val view: View = findViewByName("my_view")

当然Androidにはそういうメソッドは用意されてません。

でもレイアウト上で連番だったり、規則的なプリフィックスのついてるビューが並んでる時。。。ビュー名前で取得できたら便利だなって考えました。

ビュー名前からView取得するコードがこれ

それ調べてたらその方法が分かりました。

端的に書くと Resources.getIdentifier() を使えばできる

▼ 公式リファレンスの説明

getIdentifier

public int getIdentifier (String name,
String defType,
String defPackage)

Return a resource identifier for the given resource name. A fully qualified resource name is of the form "package:type/entry". The first two components (package and type) are optional if defType and defPackage, respectively, are specified here.

https://developer.android.com/reference/android/content/res/Resources#getIdentifier(java.lang.String,%20java.lang.String,%20java.lang.String)

「Return a resource identifier for the given resource name. 」

今回の例なら R.id.*** のビューIDを取得したいので、name にはビューID・defTypeには "id" を渡してあげればいいってことです

▼ 実際にコードを書いてみた

val view: View = findViewById(
    resources.getIdentifier("my_view", "id", packageName)
)

エミュとかで確認したら問題なく動作しました。

めでたしめでたし、終わり

ついでにfindViewByName()としてメソッド化

ついでに汎用的な感じでメソッド化してみます。

▼ ついに findViewByName() が現実に

/**
 * @param name  ビューの名前
 **/
fun findViewByName(name: String): View{
    return findViewById(
        resources.getIdentifier(name, "id", packageName)
    )
}

なんか色々なことに応用できるかもしれません。

例えば文字列リソースだったら "id" を "string" に変えればいいし、
色リソースだったら "id" を "color" に変えればアレコレできます。

ということでビュー名前からView取得する方法でした。

この記事が気に入ったらサポートをしてみませんか?