Android KTX
Catatan: Modul ini hanya diperuntukkan untuk pengguna
bahasa Kotlin. Jika Anda termasuk pengguna Java, lewati saja
materi ini karena kita tidak menggunakannya di Java.
Kita sudah mempelajari Kotlin sebagai bahasa yang digunakan
untuk membuat aplikasi Android dengan kode yang jauh lebih
ringkas dan aman. Namun ternyata tak cukup sampai di situ. Tim
Android dari Google betul-betul ingin menjadikan Kotlin
sebagai tools untuk meningkatkan percepatan proses
pengembangan aplikasi Android dengan kode yang lebih
sederhana. Pada awal tahun 2018 tim Android telah mulai
mengembangkan sebuah library baru yang mind blowing dengan
nama Android KTX [12].
Android KTX adalah sekumpulan Kotlin extensions bagian
dari Android Jetpack yang diumumkan Google pada I/O 2018.
Android KTX berguna untuk mengoptimalkan penggunaan
Jetpack & Android API pada pengembangan aplikasi Android
dengan basis bahasa Kotlin, seperti function/properties, lambdas,
named properties, default parameter dan coroutines. Android
KTX sendiri tidak menambahkan fitur baru pada Android API yang
sudah ada.
Tujuan dari Android KTX sendiri adalah untuk membuat
pengembangan aplikasi Android dengan Kotlin jauh lebih ringkas,
sederhana, dan idiomatis. Android KTX menyediakan fungsi
ekstensi untuk bekerja dengan kelas firmware Android dan
banyak lagi. Saat ini beberapa ekstensi tersebut mencakup
beberapa kelas yang paling sering digunakan di Android
seperti Views, Canvas, Animator, Database, Util, dll. Tim
Android juga menambahkan dukungan Support
Library dan Architecture Component pada Android KTX.
Untuk bisa menggunakan Android KTX, kita perlu menambahkan
konfigurasi berikut pada berkas [Link]:
1. repositories {
2. google()
3. }
Namun, jika menggunakan Android Studio versi di atas 3.x.x,
Anda tidak perlu menambahkan konfigurasi tersebut karena
secara default sudah ditambahkan saat membuat proyek baru.
Android KTX dikelompokkan berdasarkan modul. Setiap
modulnya memiliki satu atau lebih package. Jika ingin
menggunakan salah satu modul dari Android KTX, Anda perlu
menambahkan dependensi dari modul yang diinginkan pada
berkas [Link]. Sebagai contoh, jika ingin menggunakan
modul core-ktx, maka tambahkanlah dependensi berikut ini:
1. implementation '[Link]:core-ktx:1.6.0'
Modul core-ktx memiliki beberapa package yang bisa digunakan
seperti di bawah ini.
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Sedangkan untuk daftar modul yang tersedia pada Android KTX,
silakan lihat tabel berikut:
Module (artifact) Package
[Link]:core-ktx Semua package yang ada module core-ktx
[Link]:fragment-ktx [Link]
[Link]:palette-ktx [Link]
[Link]:sqlite-ktx [Link]
Module (artifact) Package
[Link]:collection-ktx [Link]
[Link]:lifecycle-viewmodel-ktx [Link]
[Link]:lifecycle-reactivestreams-ktx [Link]
[Link]:navigation-common-ktx [Link]
[Link]:navigation-fragment-ktx [Link]
[Link]:navigation-runtime-ktx [Link]
[Link]:navigation-testing-ktx [Link]
[Link]:navigation-ui-ktx [Link]
[Link]:work-runtime-ktx [Link]
Untuk melihat modul lain yang ada dan versi terbarunya dapat
dilihat di sini:
Extensions List
Extensions Function di Dalam
Android KTX
Android KTX menyediakan berbagai macam extensions
function yang dapat menunjukkan seberapa besar Android KTX
akan meningkatkan proses pengembangan aplikasi Android.
Berikut adalah beberapa extensions function tersebut:
ViewModel
Apabila ingin menginisialisasi ViewModel, biasanya kita
perlu membuatnya melalui ViewModelProvider seperti ini:
1. val mainViewModel = ViewModelProvider(this,
[Link]()).get(MainViewMode
l::[Link])
Dengan Android KTX Anda bisa menuliskannya jauh lebih
singkat seperti ini:
2. private val mainViewModel: MainViewModel by viewModels()
Anda hanya membutuhkan
depedency [Link]:activity-ktx untuk di
Activity dan [Link]:fragment-ktx untuk di
Fragment.
Fragment
Ketika kita ingin melakukan fragment
transaction seperti replace atau add, biasanya kita perlu
menuliskan kode seperti berikut:
1. supportFragmentManager
2. .beginTransaction()
3. .replace(fragmentContainer, myFragment, FRAGMENT_TAG)
4. .commitAllowingStateLoss()
Dengan Android KTX, kita bisa menuliskannya hanya
dengan kode seperti berikut ini.
5. [Link](allowStateLoss = true)
6. replace(fragmentContainer, myFragment, FRAGMENT_TAG)
7. }
Lihat berkurangnya jumlah baris dari kode yang dituliskan.
Sangat mudah dan sederhana, bukan?
Content
Android KTX menambahkan beberapa fungsi dalam
paket Content. Sebagai contoh, ketika ingin
menggunakan System Servicebiasanya dibutuhkan kode
seperti berikut:
1. val alarmManager =
getSystemService(Context.ALARM_SERVICE) as AlarmManager
Namun dengan Android KTX, kode di atas bisa
disederhanakan menjadi:
2. val alarmManager = getSystemService<AlarmManager>()
Selanjutnya jika ingin
menggunakan ContentValues biasanya kode yang
digunakan adalah seperti berikut:
3. val contentValues = ContentValues()
4. [Link](COLUMN_USER , "dicoding")
5. [Link](COLUMN_ADDRESS , "Indonesia")
6. [Link](COLUMN_PHONE , "085777888999")
Dengan Android KTX, kode tersebut bisa dituliskan seperti
ini.
7. val contentvalues = contentValuesOf(
8. COLUMN_USER to "dicoding",
9. COLUMN_ADDRESS to "Indonesia",
10. COLUMN_PHONE to "085777888999"
11. )
SQLite
Saat ini SQLite hanya memiliki satu ekstensi dan mungkin
akan ditambahkan ekstensi lainnya pada update Android
KTX selanjutnya. Ketika ingin
melakukan database transaction pada SQLite, kode yang
kita tuliskan adalah sebagai berikut:
1. [Link]()
2.
3. try {
4. // do some transaction
5. [Link]()
6. } finally {
7. [Link]()
8. }
Namun, dengan Android KTX, kita cukup menuliskannya
dengan kode berikut:
9. [Link] {
10. // do some transaction
11. }
Net
Paket Net hanya memiliki satu fungsi ekstensi layaknya
SQLite, yaitu ekstensi yang memungkinkan untuk
mempermudah representasi dari sebuah String menjadi
sebuah Uri. Untuk mengubah String menjadi
sebuah Uri biasanya kita membutuhkan kode berikut:
1. val uriString = [Link](string)
Dengan Android KTX, cukup tuliskan kode seperti di bawah
ini:
2. val uriString = [Link]()
Text
Android KTX juga menyediakan beberapa ekstensi pada
paket Text. Beberapa ekstensi tersebut tersedia dalam
sebuah class dengan nama SpannableStringBuilder. Sebagai
contoh, ketika kita ingin menerapkan beberapa style pada
sebuah teks, kita bisa
menggunakan SpannableStringBuilderseperti berikut:
1. val mySpannable = SpannableStringBuilder("Klik
[Link] untuk info lebih lanjut")
2. [Link](StyleSpan([Link]) , 5 , 22 ,
0)
3. [Link](UnderlineSpan() , 5 , 22 , 0)
4. [Link](ForegroundColorSpan([Link]) , 5 ,
22 , 0)
Dengan Android KTX, kita bisa menyederhanakan kode di
atas menjadi seperti di bawah ini:
5. val mySpannable = "Klik [Link] untuk info
lebih lanjut".toSpannable()
6. mySpannable[5..22] = ForegroundColorSpan([Link])
7. mySpannable[5..22] = UnderlineSpan()
8. mySpannable[5..22] = StyleSpan([Link])
Atau, kita bisa juga secara langsung memanfaatkan
ekstensi buildSpannedStringseperti berikut:
9. [Link] = buildSpannedString {
10. append("Klik").bold {
11. underline {
12. color([Link]) {
13. append(" [Link] ")
14. }
15. }
16. }.append("untuk info lebih lanjut")
17. }
OS
Untuk paket OS, Android KTX juga menyediakan beberapa
fungsi ekstensi yang bisa digunakan. Salah satunya adalah
fungsi ekstensi untuk kelas Handlerseperti berikut:
1. [Link](uptimeMillis = 400) {
2. // create some magic
3. }
4.
5. [Link](delayInMillis = 400){
6. // create some magic
7. }
Animation
Android KTX juga menyediakan beberapa fungsi ekstensi
yang memungkinkan untuk kita menerapkan animation
listener dengan sangat mudah.
1. [Link] { handlingAnimation(it) }
Selain itu, kita juga bisa menambahkan callback yang lebih
spesifik ke dalam listenertersebut.
2. [Link](
3. onStart = { },
4. onCancel = { },
5. onEnd = { },
6. onRepeat = { }
7. )
Dengan memberikan callback secara spesifik, kita bisa
mengurangi callback yang mungkin tidak diperlukan.
Android KTX memungkinkan kita untuk menambahkan jeda
pada sebuah animasi yang sedang berjalan dengan sangat
mudah. Kita bisa memanfaatkan
fungsi addPauseListener()seperti berikut ini:
8. [Link] {
9. handleAnimation(it)
10. }
11.
12. // atau
13.
14. [Link](
15. onPause = {},
16. onResume = {}
17. )
Atau, Anda juga bisa menambahkan kode ke
dalam individual event pada sebuah animasi seperti berikut:
18. [Link] { handleAnimation(it) }
19. [Link] { handleAnimation(it) }
20. [Link] { handleAnimation(it) }
21. [Link] { handleAnimation(it) }
22. [Link] { handleAnimation(it) }
23. [Link] { handleAnimation(it) }
Transition
Sama halnya dengan Animator, Android KTX menyediakan
beberapa fungsi ekstensi untuk kelas Transition yang bisa
kita gunakan untuk mengetahui perubahan pada transisi
yang kita terapkan. Untuk melakukannya, kita cukup
memanggil fungsi addListener()seperti contoh di bawah ini.
1. [Link] {
2. handlingTransition(it)
3. }
4.
5. //atau:
6.
7. [Link](
8. onEnd = {},
9. onStart = {},
10. onCancel = {},
11. onResume = {},
12. onPause = {})
Kita juga bisa menggunakan fungsi tunggal untuk masing-
masing callback dari transisi:
13. [Link] { }
14. [Link] { }
15. [Link] { }
16. [Link] { }
17. [Link] { }
Views
Ekstensi yang bisa digunakan pada kelas View di antaranya
adalah ketika kita ingin mengatur callback dari
sebuah layout event, kita bisa memakai beberapa fungsi
berikut:
1. [Link] { }
2. [Link] { }
3. [Link] { }
Selanjutnya untuk
fungsi postDelayed dan postOnAnimationDelayed sekarang
jadi lebih mudah jika digunakan dengan Android KTX seperti
berikut:
4. [Link](delayInMillis = 5000){
5. // do some magic
6. }
7.
8. [Link](delayInMillis = 5000){
9. // do some magic
10. }
Kemudian jika kita ingin mengatur padding pada
sebuah view, dengan Android KTX kita bisa menggunakan
beberapa fungsi seperti di bawah ini.
11. [Link](16)
12. [Link](left = 10, right = 10, top = 10,
bottom = 10)
13. [Link](start = 10, end = 10, top
= 10, bottom = 10)
Selanjutnya untuk melakukan konversi instance dari
sebuah View menjadi Bitmapkita bisa menerapkan kode
seperti berikut:
14. val bitmap = [Link](config = bitmapConfig)
Masih terdapat banyak fungsi ekstensi lainnya yang akan
tersedia pada Android KTX. Meskipun saat ini masih dalam versi
beta, tetapi kita semua bisa berkontribusi untuk membantu
Android KTX selangkah lebih dekat ke versi yang stabil.
Sehingga, kita dapat mulai menggunakan library yang sangat
menarik ini ke dalam production project. Kontribusi yang bisa kita
berikan pun bermacam-macam, seperti melaporkan masalah,
menyarankan fitur baru, dokumentasi, memperbaiki bug, dan
menambahkan atau mengganti sebuah API. Untuk lebih
lengkapnya, silakan kunjungi [Link]
ktx.
Sebagai tambahan materi, Anda juga menyaksikan 2 video di
bawah ini.
Android Jetpack: KTX - Sweeter Kotlin Android
Development - Florina Muntenesce
Android Jetpack: Sweetening Kotlin Development with
Android KTX (Google I/O '18) - Jake Wharton
Android KTX: A Dash of Kotlin Makes All the Difference!
(KotlinConf 2018 ) - Dan Kim
Latihan Activity KTX dan Fragment KTX
Catatan: Modul ini hanya diperuntukkan untuk pengguna
bahasa Kotlin. Jika Anda pengguna Java, lewati saja materi ini
karena kita tidak menggunakannya di Java.
Tujuan
Pada codelab kali ini Anda akan belajar menerapkan Android KTX
pada project yang sudah Anda buat sebelumnya, yaitu
pada project latiha MySharedPreference dan MyFlexibleFrag
ment.
Alur Latihan
Berikut alur yang akan kita lakukan dalam latihan kali ini:
1. Meneruskan LiveData dengan SingleEvent.
2. Menambahkan library ke dalam project.
3. Mengubah inisialisasi ViewModel dalam kelas Activity
menggunakan Android KTX.
4. Menjalankan aplikasi.
5. Menutup project LiveData dengan SingleEvent dan
membuka project MyFlexibleFragment .
6. Menambahkan library ke dalam project.
7. Mengubah inisialisasi Fragment menggunakan Android
KTX.
8. Menjalankan aplikasi.
Codelab Activity KTX di Android
1. Bukalah proyek Latihan LiveData dengan
SingleEvent yang sudah Anda buat sebelumnya atau
silakan unduh di sini.
2. Pada codelab ini Anda akan menggunakan kode untuk
inisialisasi ViewModel yang terdapat pada library Activity-
KTX. Untuk menambahkannya,
buka [Link](module:app) dan tambahkan kode
berikut:
1. ...
2. dependencies {
3. ...
4. implementation "[Link]:activity-
ktx:1.3.1"
5. }
Setelah itu klik Sync Now untuk mengunduh library dan
sinkronisasi ke project.
3. Selanjutnya buka [Link] dan perhatikan kode
untuk inisialisasi ViewModel berikut:
1. class MainActivity : AppCompatActivity() {
2.
3. private lateinit var binding: ActivityMainBinding
4.
5. override fun onCreate(savedInstanceState: Bundle?) {
6. [Link](savedInstanceState)
7.
8. binding =
[Link](layoutInflater)
9. setContentView([Link])
10.
11. supportActionBar?.hide()
12.
13. val mainViewModel = ViewModelProvider(this,
[Link]()).get(MainViewMode
l::[Link])
14.
15. [Link](this,
{ restaurant ->
16. setRestaurantData(restaurant)
17. })
18. ...
19. }
Ubah kode tersebut menggunakan KTX sehingga menjadi
seperti ini:
20. class MainActivity : AppCompatActivity() {
21.
22. private lateinit var binding: ActivityMainBinding
23. private val mainViewModel by
viewModels<MainViewModel>()
24.
25. override fun onCreate(savedInstanceState:
Bundle?) {
26. [Link](savedInstanceState)
27.
28. binding =
[Link](layoutInflater)
29. setContentView([Link])
30.
31. supportActionBar?.hide()
32.
33. [Link](this,
{ restaurant ->
34. setRestaurantData(restaurant)
35. })
36. ...
37. }
4. Mudah, kan? Sekarang coba jalankan aplikasi untuk menguji
apakah ia tetap berjalan dengan baik atau tidak.
Secara
tampilan memang tidak ada perbedaan dengan
sebelumnya. Bedanya, sekarang kode yang digunakan
menjadi lebih sedikit dan mudah dibaca. Keren, kan?
Codelab Fragment KTX di Android
1. Bukalah proyek MyFlexibleFragment yang sudah Anda
buat sebelumnya atau silakan unduh di sini.
2. Pertama, buka berkas [Link](Module: app) dan
tambahkan baris berikut:
1. android {
2. ...
3. kotlinOptions {
4. jvmTarget = '1.8'
5. }
6. }
7.
8. dependencies {
9. ...
10. implementation "[Link]:fragment-
ktx:1.2.5"
11. }
Setelah itu klik Sync Now untuk mengunduh library dan
sinkronisasi ke project.
3. Selanjutnya buka [Link] dan perhatikan kode
berikut:
1. class MainActivity : AppCompatActivity() {
2. override fun onCreate(savedInstanceState: Bundle?) {
3. [Link](savedInstanceState)
4. setContentView([Link].activity_main)
5. ...
6. if (fragment !is HomeFragment) {
7. Log.d("MyFlexibleFragment", "Fragment Name :"
+ HomeFragment::[Link])
8. mFragmentManager
9. .beginTransaction()
10. .add([Link].frame_container,
mHomeFragment, HomeFragment::[Link])
11. .commit()
12. }
13. }
14. }
Ubah kode tersebut menggunakan Fragment KTX sehingga
menjadi seperti ini:
15. class MainActivity : AppCompatActivity() {
16. override fun onCreate(savedInstanceState: Bundle?)
17. [Link](savedInstanceState)
18. setContentView([Link].activity_main)
19. ...
20. if (fragment !is HomeFragment) {
21. Log.d("MyFlexibleFragment", "Fragment Name
:" + HomeFragment::[Link])
22. [Link] {
23. add([Link].frame_container,
mHomeFragment, HomeFragment::[Link])
24. }
25. }
26. }
27. }
4. Selanjutnya buka [Link] dan perhatikan kode
berikut:
1. class HomeFragment : Fragment(), [Link] {
2. ...
3. override fun onClick(v: View) {
4. if ([Link] == [Link].btn_category) {
5. val mCategoryFragment = CategoryFragment()
6. val mFragmentManager = fragmentManager
7. mFragmentManager?.beginTransaction()?.apply
8. replace([Link].frame_container,
mCategoryFragment,
CategoryFragment::[Link])
9. addToBackStack(null)
10. commit()
11. }
12. }
13. }
14. }
Ubah pula kode tersebut dengan menggunakan Fragment
KTX sehingga menjadi seperti ini:
15. class HomeFragment : Fragment(), [Link]
16. ...
17. override fun onClick(v: View) {
18. if ([Link] == [Link].btn_category) {
19. val mCategoryFragment = CategoryFragment()
20. val mFragmentManager =
parentFragmentManager
21. [Link] {
22. addToBackStack(null)
23. replace([Link].frame_container,
mCategoryFragment,
CategoryFragment::[Link])
24. }
25. }
26. }
27. }
5. Lakukan cara yang sama pada kode di
dalam [Link] sehingga menjadi seperti ini:
1. class CategoryFragment : Fragment(),
[Link] {
2. ...
3. override fun onClick(v: View) {
4. if ([Link] == [Link].btn_detail_category) {
5. ...
6. val mFragmentManager = parentFragmentManager
7. [Link] {
8. addToBackStack(null)
9. replace([Link].frame_container,
mDetailCategoryFragment,
DetailCategoryFragment::[Link])
10. }
11. }
12. }
13. }
Mudah, kan? Coba jalankan aplikasi untuk menguji dan
memastikan aplikasi sudah berjalan dengan baik.
Bedah Kode
Java 8
Pada saat Anda menambahkan dependency untuk KTX di
dalam [Link](module:app), Anda diminta untuk
menambahkan kode berikut:
1. android {
2. ...
3. kotlinOptions {
4. jvmTarget = JavaVersion.VERSION_1_8.toString()
5. }
6. }
Kode di atas digunakan karena KTX menggunakan fitur dari Java
8, seperti lambda expression sedangkan Android baru
mendukung Java 7. Alhasil, Anda perlu mengonfigurasinya.
Activity KTX
Lihatlah perbedaan antara dua kode berikut
pada [Link]:
Tanpa KTX
Dengan KTX
1. val mainViewModel = ViewModelProvider(this,
[Link]()).get(MainViewModel::cla
[Link])
Dengan bantuan KTX, Anda tak perlu lagi mengulang-ulang cara
pembuatan ViewModel menggunakan ViewModelProvider.
Sehingga, kode menjadi lebih bersih dan mudah dibaca. Anda
juga tidak perlu membuat ViewModelFactory jika ViewModel tidak
membutuhkan constructor. Lebih simpel, bukan?
Fragment KTX
Lihatlah perbedaan antara dua kode berikut
pada [Link]:
Tanpa KTX
Dengan KTX
1. mFragmentManager
2. .beginTransaction()
3. .add([Link].frame_container, mHomeFragment,
HomeFragment::[Link])
4. .commit()
Dengan bantuan KTX, Anda tak perlu lagi menggunakan
kata beginTransaction di setiap melakukan fragment transaction.
Jadi tidak bosan lagi deh ngoding-nya.
Selamat Anda sudah belajar mengimplementasikan KTX
pada project Anda sebelumnya. KTX ini dibuat karena fungsi-
fungsi pada Android sudah cukup tua. Dengan hadirnya Kotlin,
banyak kode yang bisa diringkas dengan pendekatan baru. Kode
pun menjadi lebih simpel dan mudah dibaca. Hidup Anda
sebagai developer pun jadi lebih mudah. Cheers!
Source code dapat Anda unduh di:
Source Code Android KTX