今回はAndroidの開発でよく書くfindViewById(ID)
をKotlin Android Extensionsを使ってさよならしたいと思います。
そもそもfindViewById
ですが、Androidの開発においてレイアウトを定義したXMLファイルに書いてあるidを参照して、Viewをコード側から触る時に使います。
1 | val button = findViewById(R.id.button) as Button |
のような感じです。(サンプルコードは全てKotlinです)
findViewById
の歴史を紐解いてみると、そこからButterKnife(KotterKnife)
を使ってViewのInjectionを行ったりし、最近だとDataBinding
がとてもアツいのでそれを使って以下のように書いたりします。
1 2 3 4 5 6 | // KotterKnife val nameTextView: TextView by bindView(R.id.name) // DataBinding val binding = DataBindingUtil.setContentView(activity, R.layout.hoge) binding.nameTextView.text = "おなまえ" |
ButterKnife(KotterKnife)
では結局IDを参照させないといけないし、DataBinding
は本質的な部分はViewとデータのバインディングにあるので、findViewById
を消すためだけに使用するのはなんかイマイチ違う気がしています(個人の感想です)。
そこで出てくるのがKotlin Android Extensionsです。
Kotlin Android ExtensionsはKotlinが公式で提供している、Androidアプリ開発をサポートしてくれる拡張機能です。
詳細はここ
色々機能はあるんですが、とりあえず
1 | apply plugin: 'kotlin-android-extensions' |
をbuild.gradle
に書いてあげて
1 2 3 4 | import kotlinx.android.synthetic.main.<layout>.* // R.layout.activity_mainなら import kotlinx.android.synthetic.main.activity_main.* |
のインポート文を書いてあげてください。
もうこれだけでインポートしたActivityではLayoutXMLで定義したidがそのまま使えます。
1 2 3 4 5 6 7 | <!-- activity_main.xml --> <TextView android:id="@+id/firstName" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ファーストネーム" /> |
1 2 3 4 5 | // MainActivity.kt import kotlinx.android.synthetic.main.activity_main.* //... firstName.text = "ふぁーすとねーむ" |
こんな感じで特別変数を用意する必要も、R.id.hogeを参照する必要もなくなりました。
✨すっきり✨
レイアウトのXMLファイルでのidをスネークケースで書くと、フィールドもスネークケースになるので注意
1 2 3 | <TextView android:id="@+id/text_view" .../> |
1 | text_view.text = "テキスト" // ←イマイチ |
この点に関してはDataBindingは勝手にキャメルケースにしてくれるので勝ちと言えそうですね。
Kotlin Android Extensionsを使うために、レイアウトファイル上でのidをキャメルケースにするかどうかはプロジェクトで要相談してください(僕は良いと思う)。
<< Retrofit2+RxJava2を使ってレスポンスのステータスコードによってパースするモデルクラスをよしなにしたい時 KotlinとSpring Bootを使ってサクッと叩けるAPIを作る >>
2018やぎ小屋