【Android Studio】~ちょこっとメモ~「findViewById()」を省略したい
きっかけ&ポンコツを発揮した話
以前Twitterにて「Android Extension使うとfindViewById()しなくてよくなるよ~」と教えていただいていたのにも関わらず、
「Extension」って単語から「拡張関数のことかな?」と勘違いして必死に”拡張関数”やら”拡張プロパティ”について調べてたというアホなお話。
その時は「???」状態だったのでとりあえず保留していたのだが、今回改めて調べてみると全く別物だったということが判明Σ(゚Д゚)
素直に「Android Extension」で調べればよかったのにね。。。
皆さんもお間違えないようにお気を付けください(たぶん誰も間違えん;)
いいね~ポンコツ発揮してるね俺~☆(殴
ってことで簡単にご紹介!
なにがしたいか
例えば、「ボタンを押すと複数のTextViewの内容が変更される」という処理があるとする
//ボタンを押すと呼ばれるメソッド fun onButtonClick(view: View){ val text1: TextView = findViewById(R.id.text1) val text2: TextView = findViewById(R.id.text2) val text3: TextView = findViewById(R.id.text3) val text4: TextView = findViewById(R.id.text4) val text5: TextView = findViewById(R.id.text5) text1.text = "私が神だ" text2.text = "お前だったのか" text3.text = "暇を持て余した" text4.text = "神々の" text5.text = "遊び" }
このように、
「findViewById()」っていっぱいあると長いし書くの面倒。
だから書きたくないよねぇぇってこと。
実はなんと、これができちゃうんですね~Σ(゚Д゚)
どうやるの?
まず前提として、この機能はKotlinでしか機能しない。
Kotlin有能('ω')
先ほどもちらっと出てきた「Android Extensions」の、
「View Binding」機能
を使う。
まずAndroid Extensions機能を有効にするために、「app/build.gradle」に、以下の記述が必要
apply plugin: 'kotlin-android-extensions'
これをしていないと動かない。
ただ、開発言語をKotlinに指定して始めた場合、デフォルトで記述されているらしい。
次に、使用するパッケージをインポートする
//activity_mainのビューを使う場合 import kotlinx.android.synthetic.main.activity_main.* //activity_subのビューを使う場合 import kotlinx.android.synthetic.main.activity_sub.*
以上。終わり。
めっちゃくちゃ簡単やあ~( ;∀;)
使い方
とっても簡単。
さっきのサンプルコードを使って説明すると、
//ボタンを押すと呼ばれるメソッド fun onButtonClick(view: View){ text1.text = "私が神だ" text2.text = "お前だったのか" text3.text = "暇を持て余した" text4.text = "神々の" text5.text = "遊び" }
これだけ。
もちろん、onCreate()内で初期化しているわけでもないので、実質各一行で処理の記述が済んでしまう。
じゃあ「text1~text5」って変数は何なの?いつ定義したの?って疑問が生まれるはず。。。(;'∀')
実はこの「text1」というのは「ビューのID」を示している。
以下はactivity_main.xmlの記述
<TextView android:id="@+id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text2" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text3" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text4" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text5" android:layout_width="match_parent" android:layout_height="wrap_content" />
このようにプログラムからビューIDを直接指定することで、
それを”ビューを格納した変数”として使えちゃうのだ(/・ω・)/
さらに、この時のデータ型は、ビューに対応した型(この例ではTextView型)にキャストされた状態で格納されている。
そのため、明示的なキャストは不要。
なんと便利な!
余談
ViewBindを使う前にbuild.gradleへの記述とインポートが必要なわけだが、
・開発言語をKotlinで開始
・IDEの自動インポート機能を使う
すると何も事前に書く必要がなく、すぐ使用することができる。
ただViewBinding機能はあくまでも
「findViewById()を省略して書く方法」
として使われるため、プロパティのバインドやリスナーのバインドなどはできない点に注意。
ものすごく簡単で便利な機能なので、これからも使っていこうと思う。