こんにちは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に以下を追記します。
apply plugin: 'kotlin-android-extensions'
コード
layout
activityのレイアウトactivity_hoge.xml
に以下のtextviewがあるとします。(includeされた別のファイルでもよい)
<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では入力補完も効きます。ナイス!
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とか結構気に入ってたのだが。。。