Catatan: Untuk pengguna Kotlin, kita akan mulai menggunakan Kotlin Extension di materi-materi selanjutnya, jadi Anda harus memperhatikan materi ini baik-baik ya! Untuk kamu pengguna Java bisa melewati materi ini, karena kita tidak menggunakannya di Java.
Kotlin Android Extensions adalah sebuah plugin yang memungkinkan kita untuk binding sebuah properti ke elemen view. Plugin ini secara otomatis akan memberi akses langsung ke semua view yang ada di dalam XML. Dengan demikian kita tidak perlu secara eksplisit melakukan binding ke elemen view menggunakan findViewByID() atau library lainnya.
Cara Kerja Kotlin Android Extensions
Lalu bagaimana Kotlin Android Extensions bekerja? Plugin akan mengganti setiap properti yang dipanggil ke fungsi yang meminta view. Dengan fungsi caching maka tak harus menemukan view setiap kali sebuah properti dipanggil. Perhatikan bahwa mekanisme caching ini hanya bekerja jika receiver yang dimaksud adalah Activity atau Fragment. Jika digunakan dalam fungsi ekstensi, caching akan dilewati karena plugin tidak akan dapat menambahkan kode yang diperlukan.
Kotlin Android Extensions tidak memerlukan library atau dependency tambahan. Sebabnya, ketika kita membuat proyek baru dan mengaktifkan dukungan Kotlin, otomatis plugin tersebut akan ditambah ke dalam build.gradle (module: app)
- apply plugin: 'kotlin-android-extensions'
Untuk menggunakan Kotlin Android Extensions pada Activity atau Fragment, kita cukup memanggil id dari view tersebut, kemudian secara otomatis Android Studio akan mengimpor kotlin.android.synthetic, diikuti dengan nama XML yang akan kita bind ke activity.
- import kotlinx.android.synthetic.main.activity_main.*
Kita bisa mengakses view yang dimaksud setelah fungsi setContentView dipanggil. Contohnya, jika kita memiliki sebuah TextView dengan id text_name seperti berikut:
- <TextView
- android:id="@+id/text_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
Untuk mengaksesnya, cukup panggil text_name setelah fungsi setContentView.
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- text_name.text = "Your Name"
- }
Selain bisa digunakan pada Activity atau Fragment, Kotlin Android Extensions juga bisa diaplikasikan pada sebuah custom view atau adapter. Perbedaannya hanya pada cara impornya. Kita perlu mengimpor kotlin.android.synthetic.main. + nama_xml + .view.*.
Jadi, misalnya Anda mempunyai sebuah XML dengan nama item_list.xml yang akan di-bind ke dalam sebuah adapter, maka tambahkan kode berikut pada adapter:
- import kotlinx.android.synthetic.main.item_list.view.*
Selanjutnya untuk mengakses view yang dibutuhkan, panggil itemView sebelum nama id, contoh:
- itemView.name.text = "Your Name"
Plugin Android Extensions menyertakan beberapa fitur eksperimental seperti dukungan LayoutContainerdan generator implementasi Parcelable. Fitur-fitur ini belum dianggap sebagai produksi, jadi Anda perlu mengaktifkan mode eksperimental di build.gradle agar dapat menggunakannya:
- androidExtensions {
- experimental = true
- }
- Dukungan LayoutContainer
Plugin Android Extensions mendukung berbagai jenis container. Yang paling mendasar adalah Activity, Fragment, dan View, tetapi Anda juga dapat mengubah kelas apa pun menjadi Android Extensions container dengan menerapkan interface LayoutContainer. Interface tersebut akan menyediakan sebuah view yang akan digunakan untuk menemukan subviews. Bayangkan kita memiliki ViewHolder yang memegang tampilan dengan tata letak seperti pada contoh ini. Dengan bantuan dari LayoutContainer, kode bisa lebih disederhanakan seperti:
- inner class CardViewViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
- fun bind(hero: Hero) {
- with(itemView) {
- Glide.with(itemView.context)
- .load(hero.photo)
- .apply(RequestOptions().override(350, 550))
- .into(img_item_photo)
- }
- }
- }
- Parcelable
Sejak Kotlin versi 1.1.4 plugin Android Extensions menyediakan generator untuk implementasi Parcelable sebagai fitur eksperimental. Untuk menggunakannya, Anda bisa memanfaatkan anotasi @Parcelize. Dengan anotasi tersebut, Anda bisa menerapkan Parcelable dengan cara yang sangat sederhana. Anda hanya perlu menambahkannya pada sebuah kelas dan plugin akan menerapkan Parcelable secara otomatis.
- import kotlinx.android.parcel.Parcelize
- @Parcelize
- data class Item (val name: String?, val image: Int?): Parcelable
Anda bisa membaca penjelasan lebih lanjut tentang Kotlin Android Extensions pada dokumentasi berikut:
Memfaktor Ulang (Refactor)
Untuk memahami lebih lanjut silakan memfaktor ulang (refactor) kode pada proyek MyListView sebelumnya dengan menggunakan Kotlin Android Extensions. Untuk project bisa diunduh di sini. Ikuti langkah-langkah di bawah ini:
- Hapus kode berikut pada class MainActivity.
- val listView: ListView = findViewById(R.id.lv_list)
- Ubahlah kode berikut:
- listView.adapter = adapter
- ...
- listView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
- Toast.makeText(this@MainActivity, heroes[position].name, Toast.LENGTH_SHORT).show()
- }
Menjadi:
- lv_list.adapter = adapter
- ...
- lv_list.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
- Toast.makeText(this@MainActivity, heroes[position].name, Toast.LENGTH_SHORT).show()
- }
Jika terjadi eror pada properti lv_list, letakkan kursor pada kode tersebut kemudian tekan ALT + ENTER, maka otomatis kotlinx.android.synthetic.main.activity_main.* akan diimpor. - Kemudian pada class RecyclerViewAdapter, ubahlah kode berikut:
- inner class ViewHolder constructor(private val view: View) {
- private val txtName: TextView = view.findViewById(R.id.txt_name)
- private val txtDescription: TextView = view.findViewById(R.id.txt_description)
- private val imgPhoto: ImageView = view.findViewById(R.id.img_photo)
- fun bind(hero: Hero) {
- txtName.text = hero.name
- txtDescription.text = hero.description
- imgPhoto.setImageResource(hero.photo)
- }
- }
menjadi:
- inner class ViewHolder constructor(private val view: View) {
- fun bind(hero: Hero) {
- with(view){
- txt_name.text = hero.name
- txt_description.text = hero.description
- img_photo.setImageResource(hero.photo)
- }
- }
- }
- Jalankan aplikasi. Jika tidak ada kesalahan, aplikasi akan tetap berfungsi seperti sebelumnya.
Sampai di sini Anda sudah mencoba menerapkan Kotlin Android Extensions pada proyek buatan Anda. Untuk materi-materi selanjutnya kita akan selalu menggunakan Kotlin Extension untuk kode yang menggunakan findViewById di Kotlin, sehingga ngoding jadi lebih cepat. Enak kan?