うきっとラボ~中卒から始めるプログラミング~

中卒のポンコツ太郎が立派なプログラマになるまでの道のり

【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()を省略して書く方法
として使われるため、プロパティのバインドやリスナーのバインドなどはできない点に注意。

ものすごく簡単で便利な機能なので、これからも使っていこうと思う。