![見出し画像](https://assets.st-note.com/production/uploads/images/85052537/rectangle_large_type_2_e3d7e36b27fb7884bb2a191c13fede3e.png?width=800)
【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.
「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取得する方法でした。
この記事が気に入ったらサポートをしてみませんか?