Android
Kotlin
KotlinAndroidExtension

Kotlin Android ExtensionsでfindViewByIdとさよなら

More than 1 year has passed since last update.

こんにちはsekitakaです。

JavaのAndroid開発でButterknifeを使っていたのでKotlinではKotterknifeを使おうと思ったのですが、ちょっとぐぐってみたところKotlinには

Kotlin Android Extensionsという、Android用の拡張機能があったので使い方を共有します。


なにができるの

Android開発をしているとfindByIdをキャスト付きで書く事が多いですが、それを省略できます。


Kotterknifeにくらべて何がいいの?

layout.xmlに対応する特殊なパッケージをimportするだけで、Activityのコードではクラス変数としてアクセスできます。変数名はxmlで指定したidです。よってコードの記述量が少なくてすみidと変数名も一致して分かりやすいコードになります。またキャストするために型を記述する必要もありません。

一方Kotterknifeは以下のようにActivityのクラス変数としての宣言が必要です。

val firstName: TextView by bindView(R.id.first_name)


使い方


build.gradle

appのbuild.gradleに以下を追記します。


buld.gradle

apply plugin: 'kotlin-android-extensions'



コード


layout

activityのレイアウトactivity_hoge.xmlに以下のtextviewがあるとします。(includeされた別のファイルでもよい)


activity_hoge.xml

<TextView

android:id="@+id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>


activity

Activityのktファイルでactivity_hoge.xmlのView要素を使用するために以下のようにパッケージをインポートします。

import kotlinx.android.synthetic.main.activity_hoge.*

それ以外の宣言などは必要なく、onCreateではいきなり以下のようにidで指定した変数名でTextViewにアクセスすることができます。

Android Studioでは入力補完も効きます。ナイス!


HogeActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hoge)
myTextView.text = "aa" // idで指定したmyTextViewという名前でアクセスできる
}


OnClickはどうかくの?

Butterknifeではアノテーションでクリック時の処理をわかりやすく関数化できましたが、Kotlin Android ExtensionやKotterknifeでは出来ないようです。ただラムダ式が簡単に記述できるので、まぁいいかなという感じはします。

hogeButton.setOnClickListener {

// クリック時の処理
}


Adapterとかでも使える?

RecyclerViewのAdapterなどでも使えます。しかもこちらも入力補完が効きます。

Adapter内にViewHolderクラスを持つ構成の場合、AdapterのKotlinファイルで以下のようにAdapter内ではview.*としてインポートすれば良いです。

import kotlinx.android.synthetic.main.<アイテム用のxml>.view.*


まとめ

Viewへの変数の定義などはただの定形作業なので、そのあたり省略できるのがいいですね。

これからKotlin開発では使っていこうと思います。

とはいえ、ButterknifeのアノテーションでのOnClickとか結構気に入ってたのだが。。。