Kotlin Android Extensionsを使ってfindViewByIdとさよならする

Android Kotlin

Posted on Oct 18


今回はAndroidの開発でよく書くfindViewById(ID)をKotlin Android Extensionsを使ってさよならしたいと思います。

findViewById

そもそも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 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をキャメルケースにするかどうかはプロジェクトで要相談してください(僕は良いと思う)。

まとめ

  • Androidアプリ開発にKotlinを使っているならKotlin Android Extensionsを有効にしておこう
  • データのバインディングを行わないケースならDataBindingよりもこっちを使ったほうが良さそう
  • そろそろスネークケースとおさらばしたい気持ち

このエントリーをはてなブックマークに追加
comments powered by Disqus

<< Retrofit2+RxJava2を使ってレスポンスのステータスコードによってパースするモデルクラスをよしなにしたい時     KotlinとSpring Bootを使ってサクッと叩けるAPIを作る >>



2018やぎ小屋