Codelab ini adalah bagian dari kursus Dasar-Dasar Android Kotlin. Anda akan mendapatkan manfaat maksimal dari kursus ini jika menyelesaikan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Codelab ini merangkum cara menggunakan ViewModel dan fragmen bersama-sama untuk menerapkan navigasi. Ingatlah bahwa tujuannya adalah menempatkan logika kapan untuk menavigasi ke ViewModel, tetapi menentukan jalur dalam fragmen dan file navigasi. Untuk mencapai tujuan ini, Anda menggunakan model tampilan, fragmen, LiveData, dan pengamat.
Codelab ini diakhiri dengan menunjukkan cara cerdas untuk melacak status tombol dengan kode minimal, sehingga setiap tombol diaktifkan dan dapat diklik hanya jika pengguna perlu mengetuk tombol tersebut.
Yang harus sudah Anda ketahui
Anda harus memahami:
- Membangun antarmuka pengguna (UI) dasar menggunakan aktivitas, fragmen, dan tampilan.
- Menavigasi antar-fragmen dan menggunakan
safeArgsuntuk meneruskan data antar-fragmen. - Melihat model, melihat factory model, transformasi, dan
LiveDataserta pengamatnya. - Cara membuat database
Room, membuat objek akses data (DAO), dan menentukan entity. - Cara menggunakan coroutine untuk interaksi database dan tugas berjalan lama lainnya.
Yang akan Anda pelajari
- Cara memperbarui catatan kualitas tidur yang ada di database.
- Cara menggunakan
LiveDatauntuk melacak status tombol. - Cara menampilkan snackbar sebagai respons terhadap suatu peristiwa.
Yang akan Anda lakukan
- Perluas aplikasi TrackMySleepQuality untuk mengumpulkan rating kualitas, tambahkan rating ke database, dan tampilkan hasilnya.
- Gunakan
LiveDatauntuk memicu tampilan snackbar. - Gunakan
LiveDatauntuk mengaktifkan dan menonaktifkan tombol.
Dalam codelab ini, Anda akan membuat perekaman kualitas tidur dan UI akhir aplikasi TrackMySleepQuality.
Aplikasi memiliki dua layar, yang diwakili oleh fragmen, seperti yang ditunjukkan pada gambar di bawah.
Layar pertama, yang ditampilkan di sebelah kiri, memiliki tombol untuk memulai dan menghentikan pelacakan. Layar menampilkan semua data tidur pengguna. Tombol Hapus akan menghapus semua data yang telah dikumpulkan aplikasi untuk pengguna secara permanen.
Layar kedua, yang ditampilkan di sebelah kanan, adalah untuk memilih rating kualitas tidur. Di aplikasi, rating ditampilkan secara numerik. Untuk tujuan pengembangan, aplikasi menampilkan ikon wajah dan nilai numeriknya.
Alur pengguna adalah sebagai berikut:
- Pengguna membuka aplikasi dan melihat layar pelacakan tidur.
- Pengguna mengetuk tombol Mulai. Tindakan ini akan merekam waktu mulai dan menampilkannya. Tombol Mulai dinonaktifkan, dan tombol Berhenti diaktifkan.
- Pengguna mengetuk tombol Berhenti. Tindakan ini akan mencatat waktu berakhir dan membuka layar kualitas tidur.
- Pengguna memilih ikon kualitas tidur. Layar ditutup, dan layar pelacakan menampilkan waktu berakhirnya tidur dan kualitas tidur. Tombol Berhenti dinonaktifkan dan tombol Mulai diaktifkan. Aplikasi siap untuk malam lainnya.
- Tombol Hapus diaktifkan setiap kali ada data dalam database. Saat pengguna mengetuk tombol Hapus, semua datanya akan dihapus tanpa dapat dipulihkan—tidak ada pesan "Apakah Anda yakin?".
Aplikasi ini menggunakan arsitektur yang disederhanakan, seperti yang ditunjukkan di bawah dalam konteks arsitektur lengkap. Aplikasi hanya menggunakan komponen berikut:
- Pengontrol UI
- Lihat model dan
LiveData - Database Room
Codelab ini mengasumsikan bahwa Anda tahu cara menerapkan navigasi menggunakan fragmen dan file navigasi. Untuk menyimpan pekerjaan Anda, sebagian besar kode ini disediakan.
Langkah 1: Periksa kode
- Untuk memulai, lanjutkan dengan kode Anda sendiri dari akhir codelab terakhir, atau download kode awal.
- Dalam kode awal Anda, periksa
SleepQualityFragment. Class ini meng-inflate tata letak, mendapatkan aplikasi, dan menampilkanbinding.root. - Buka navigation.xml di editor desain. Anda melihat bahwa ada jalur navigasi dari
SleepTrackerFragmentkeSleepQualityFragment, dan kembali lagi dariSleepQualityFragmentkeSleepTrackerFragment.
- Periksa kode untuk navigation.xml. Secara khusus, cari
<argument>bernamasleepNightKey.
Saat pengguna beralih dariSleepTrackerFragmentkeSleepQualityFragment,, aplikasi akan meneruskansleepNightKeykeSleepQualityFragmentuntuk malam yang perlu diperbarui.
Langkah 2: Menambahkan navigasi untuk pelacakan kualitas tidur
Grafik navigasi sudah mencakup jalur dari SleepTrackerFragment ke SleepQualityFragment dan kembali lagi. Namun, handler klik yang menerapkan navigasi dari satu fragmen ke fragmen berikutnya belum dikodekan. Anda menambahkan kode tersebut sekarang di ViewModel.
Di handler klik, Anda menetapkan LiveData yang berubah saat Anda ingin aplikasi membuka tujuan lain. Fragmen mengamati LiveData ini. Saat data berubah, fragmen akan membuka tujuan dan memberi tahu model tampilan bahwa fragmen telah selesai, yang akan mereset variabel status.
- Buka
SleepTrackerViewModel. Anda perlu menambahkan navigasi sehingga saat pengguna mengetuk tombol Stop, aplikasi akan membukaSleepQualityFragmentuntuk mengumpulkan rating kualitas. - Di
SleepTrackerViewModel, buatLiveDatayang berubah saat Anda ingin aplikasi menavigasi keSleepQualityFragment. Gunakan enkapsulasi untuk hanya mengekspos versiLiveDatayang dapat diambil keViewModel.
Anda dapat menempatkan kode ini di mana saja di tingkat teratas isi kelas.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()
val navigateToSleepQuality: LiveData<SleepNight>
get() = _navigateToSleepQuality- Tambahkan fungsi
doneNavigating()yang mereset variabel yang memicu navigasi.
fun doneNavigating() {
_navigateToSleepQuality.value = null
}- Di pengendali klik untuk tombol Stop,
onStopTracking(), picu navigasi keSleepQualityFragment. Tetapkan variabel _navigateToSleepQualitydi akhir fungsi sebagai hal terakhir di dalam bloklaunch{}. Perhatikan bahwa variabel ini ditetapkan kenight. Saat variabel ini memiliki nilai, aplikasi akan membukaSleepQualityFragment, sambil meneruskan malam.
_navigateToSleepQuality.value = oldNightSleepTrackerFragmentperlu mengamati _navigateToSleepQualityagar aplikasi mengetahui kapan harus melakukan navigasi. DiSleepTrackerFragment, dionCreateView(), tambahkan observer untuknavigateToSleepQuality(). Perhatikan bahwa impor untuk ini ambigu dan Anda perlu mengimporandroidx.lifecycle.Observer.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})
- Di dalam blok observer, buka dan teruskan ID malam ini, lalu panggil
doneNavigating(). Jika impor Anda ambigu, imporandroidx.navigation.fragment.findNavController.
night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
sleepTrackerViewModel.doneNavigating()
}- Build dan jalankan aplikasi Anda. Ketuk Start, lalu ketuk Stop, yang akan mengarahkan Anda ke layar
SleepQualityFragment. Untuk kembali, gunakan tombol Kembali sistem.
Dalam tugas ini, Anda akan merekam kualitas tidur dan kembali ke fragmen pelacak tidur. Layar akan diperbarui secara otomatis untuk menampilkan nilai yang diperbarui kepada pengguna. Anda perlu membuat ViewModel dan ViewModelFactory, serta memperbarui SleepQualityFragment.
Langkah 1: Buat ViewModel dan ViewModelFactory
- Di paket
sleepquality, buat atau buka SleepQualityViewModel.kt. - Buat class
SleepQualityViewModelyang menggunakansleepNightKeydan database sebagai argumen. Sama seperti yang Anda lakukan untukSleepTrackerViewModel, Anda harus meneruskandatabasedari pabrik. Anda juga harus meneruskansleepNightKeydari navigasi.
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}- Di dalam class
SleepQualityViewModel, tentukanJobdanuiScope, lalu gantionCleared().
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}- Untuk kembali ke
SleepTrackerFragmentmenggunakan pola yang sama seperti di atas, deklarasikan_navigateToSleepTracker. TerapkannavigateToSleepTrackerdandoneNavigating().
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()
val navigateToSleepTracker: LiveData<Boolean?>
get() = _navigateToSleepTracker
fun doneNavigating() {
_navigateToSleepTracker.value = null
}- Buat satu pengendali klik,
onSetSleepQuality(), untuk semua gambar kualitas tidur yang akan digunakan.
Gunakan pola coroutine yang sama seperti di codelab sebelumnya:
- Luncurkan coroutine di
uiScope, dan beralih ke dispatcher I/O. - Dapatkan
tonightmenggunakansleepNightKey. - Menetapkan kualitas tidur.
- Perbarui database.
- Memicu navigasi.
Perhatikan bahwa contoh kode di bawah melakukan semua pekerjaan di pengendali klik, alih-alih memisahkan operasi database dalam konteks yang berbeda.
fun onSetSleepQuality(quality: Int) {
uiScope.launch {
// IO is a thread pool for running operations that access the disk, such as
// our Room database.
withContext(Dispatchers.IO) {
val tonight = database.get(sleepNightKey) ?: return@withContext
tonight.sleepQuality = quality
database.update(tonight)
}
// Setting this state variable to true will alert the observer and trigger navigation.
_navigateToSleepTracker.value = true
}
}- Di paket
sleepquality, buat atau bukaSleepQualityViewModelFactory.ktdan tambahkan classSleepQualityViewModelFactory, seperti yang ditunjukkan di bawah. Class ini menggunakan versi kode boilerplate yang sama seperti yang pernah Anda lihat sebelumnya. Periksa kode sebelum Anda melanjutkan.
class SleepQualityViewModelFactory(
private val sleepNightKey: Long,
private val dataSource: SleepDatabaseDao) : ViewModelProvider.Factory {
@Suppress("unchecked_cast")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SleepQualityViewModel::class.java)) {
return SleepQualityViewModel(sleepNightKey, dataSource) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}Langkah 2: Perbarui SleepQualityFragment
- Buka
SleepQualityFragment.kt. - Di
onCreateView(), setelah mendapatkanapplication, Anda perlu mendapatkanargumentsyang disertakan dengan navigasi. Argumen ini ada diSleepQualityFragmentArgs. Anda harus mengekstraknya dari paket.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)- Selanjutnya, dapatkan
dataSource.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao- Buat factory, dengan meneruskan
dataSourcedansleepNightKey.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)- Dapatkan referensi
ViewModel.
val sleepQualityViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepQualityViewModel::class.java)- Tambahkan
ViewModelke objek binding. (Jika Anda melihat error pada objek binding, abaikan saja untuk saat ini.)
binding.sleepQualityViewModel = sleepQualityViewModel- Tambahkan observer. Saat diminta, impor
androidx.lifecycle.Observer.
sleepQualityViewModel.navigateToSleepTracker.observe(this, Observer {
if (it == true) { // Observed state is true.
this.findNavController().navigate(
SleepQualityFragmentDirections.actionSleepQualityFragmentToSleepTrackerFragment())
sleepQualityViewModel.doneNavigating()
}
})Langkah 3: Perbarui file tata letak dan jalankan aplikasi
- Buka file tata letak
fragment_sleep_quality.xml. Di blok<data>, tambahkan variabel untukSleepQualityViewModel.
<data>
<variable
name="sleepQualityViewModel"
type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
</data>- Untuk setiap enam gambar kualitas tidur, tambahkan pengendali klik seperti di bawah. Cocokkan rating kualitas dengan gambar.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"- Bersihkan dan bangun ulang project Anda. Tindakan ini akan mengatasi error apa pun pada objek pengikatan. Jika tidak, hapus cache (File > Invalidate Caches / Restart) dan bangun kembali aplikasi Anda.
Selamat! Anda baru saja membuat aplikasi database Room lengkap menggunakan coroutine.
Sekarang aplikasi Anda berfungsi dengan baik. Pengguna dapat mengetuk Mulai dan Berhenti sebanyak yang mereka inginkan. Saat pengguna mengetuk Berhenti, mereka dapat memasukkan kualitas tidur. Saat pengguna mengetuk Hapus, semua data akan dihapus secara diam-diam di latar belakang. Namun, semua tombol selalu diaktifkan dan dapat diklik, yang tidak merusak aplikasi, tetapi memungkinkan pengguna membuat malam tidur yang tidak lengkap.
Dalam tugas terakhir ini, Anda akan mempelajari cara menggunakan peta transformasi untuk mengelola visibilitas tombol sehingga pengguna hanya dapat membuat pilihan yang tepat. Anda dapat menggunakan metode serupa untuk menampilkan pesan yang ramah setelah semua data dihapus.
Langkah 1: Perbarui status tombol
Idenya adalah untuk menyetel status tombol sehingga pada awalnya, hanya tombol Start yang diaktifkan, yang berarti tombol tersebut dapat diklik.
Setelah pengguna mengetuk Mulai, tombol Berhenti akan diaktifkan dan Mulai tidak. Tombol Hapus hanya diaktifkan jika ada data dalam database.
- Buka file tata letak
fragment_sleep_tracker.xml. - Tambahkan properti
android:enabledke setiap tombol. Propertiandroid:enabledadalah nilai boolean yang menunjukkan apakah tombol diaktifkan atau tidak. (Tombol yang diaktifkan dapat diketuk; tombol yang dinonaktifkan tidak dapat diketuk.) Berikan properti nilai variabel status yang akan Anda tentukan sebentar lagi.
start_button:
android:enabled="@{sleepTrackerViewModel.startButtonVisible}"stop_button:
android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"clear_button:
android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"- Buka
SleepTrackerViewModeldan buat tiga variabel yang sesuai. Tetapkan transformasi yang mengujinya ke setiap variabel.
- Tombol Start harus diaktifkan saat
tonightadalahnull. - Tombol Berhenti harus diaktifkan jika
tonightbukannull. - Tombol Hapus hanya boleh diaktifkan jika
nights, dan dengan demikian database, berisi malam tidur.
val startButtonVisible = Transformations.map(tonight) {
it == null
}
val stopButtonVisible = Transformations.map(tonight) {
it != null
}
val clearButtonVisible = Transformations.map(nights) {
it?.isNotEmpty()
}- Jalankan aplikasi Anda, dan bereksperimenlah dengan tombol.
Langkah 2: Gunakan snackbar untuk memberi tahu pengguna
Setelah pengguna menghapus database, tunjukkan konfirmasi kepada pengguna menggunakan widget Snackbar. Snackbar memberikan masukan singkat tentang operasi melalui pesan di bagian bawah layar. Snackbar akan menghilang setelah waktu tunggu habis, setelah interaksi pengguna di tempat lain di layar, atau setelah pengguna menggeser snackbar keluar dari layar.
Menampilkan snackbar adalah tugas UI, dan harus terjadi di fragmen. Keputusan untuk menampilkan snackbar terjadi di ViewModel. Untuk menyiapkan dan memicu snackbar saat data dihapus, Anda dapat menggunakan teknik yang sama seperti untuk memicu navigasi.
- Di
SleepTrackerViewModel, buat acara yang dienkapsulasi.
private var _showSnackbarEvent = MutableLiveData<Boolean>()
val showSnackBarEvent: LiveData<Boolean>
get() = _showSnackbarEvent- Kemudian, implementasikan
doneShowingSnackbar().
fun doneShowingSnackbar() {
_showSnackbarEvent.value = false
}- Di
SleepTrackerFragment, dionCreateView(), tambahkan observer:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })- Di dalam blok observer, tampilkan snackbar dan segera reset peristiwa.
if (it == true) { // Observed state is true.
Snackbar.make(
activity!!.findViewById(android.R.id.content),
getString(R.string.cleared_message),
Snackbar.LENGTH_SHORT // How long to display the message.
).show()
sleepTrackerViewModel.doneShowingSnackbar()
}- Di
SleepTrackerViewModel, picu peristiwa dalam metodeonClear(). Untuk melakukannya, tetapkan nilai peristiwa ketruedi dalam bloklaunch:
_showSnackbarEvent.value = true- Bangun dan jalankan aplikasi Anda.
Project Android Studio: TrackMySleepQualityFinal
Menerapkan pelacakan kualitas tidur di aplikasi ini seperti memainkan musik yang sudah dikenal dalam kunci baru. Meskipun detailnya berubah, pola dasar dari apa yang Anda lakukan di codelab sebelumnya dalam pelajaran ini tetap sama. Dengan mengetahui pola ini, coding menjadi jauh lebih cepat karena Anda dapat menggunakan kembali kode dari aplikasi yang sudah ada. Berikut beberapa pola yang digunakan dalam kursus ini sejauh ini:
- Buat
ViewModeldanViewModelFactory, lalu siapkan sumber data. - Memicu navigasi. Untuk memisahkan masalah, letakkan handler klik di model tampilan dan navigasi di fragmen.
- Gunakan enkapsulasi dengan
LiveDatauntuk melacak dan merespons perubahan status. - Gunakan transformasi dengan
LiveData. - Buat database singleton.
- Siapkan coroutine untuk operasi database.
Memicu navigasi
Anda menentukan kemungkinan jalur navigasi antar-fragmen dalam file navigasi. Ada beberapa cara berbeda untuk memicu navigasi dari satu fragmen ke fragmen berikutnya. Ini mencakup:
- Tentukan pengendali
onClickuntuk memicu navigasi ke fragmen tujuan. - Atau, untuk mengaktifkan navigasi dari satu fragmen ke fragmen berikutnya:
- Tentukan nilai
LiveDatauntuk merekam apakah navigasi harus terjadi. - Lampirkan observer ke nilai
LiveDatatersebut. - Kemudian, kode Anda akan mengubah nilai tersebut setiap kali navigasi perlu dipicu atau selesai.
Menetapkan atribut android:enabled
- Atribut
android:enabledditentukan diTextViewdan diwarisi oleh semua subclass, termasukButton. - Atribut
android:enabledmenentukan apakahViewdiaktifkan atau tidak. Arti "diaktifkan" bervariasi menurut subkelas. Misalnya,EditTextyang tidak diaktifkan mencegah pengguna mengedit teks yang ada di dalamnya, danButtonyang tidak diaktifkan mencegah pengguna mengetuk tombol. - Atribut
enabledtidak sama dengan atributvisibility. - Anda dapat menggunakan peta transformasi untuk menetapkan nilai atribut
enabledtombol berdasarkan status objek atau variabel lain.
Poin lain yang dibahas dalam codelab ini:
- Untuk memicu notifikasi kepada pengguna, Anda dapat menggunakan teknik yang sama seperti yang Anda gunakan untuk memicu navigasi.
- Anda dapat menggunakan
Snackbaruntuk memberi tahu pengguna.
Kursus Udacity:
Dokumentasi developer Android:
Bagian ini mencantumkan kemungkinan tugas pekerjaan rumah untuk siswa yang mengerjakan codelab ini sebagai bagian dari kursus yang dipimpin oleh instruktur. Instruktur menentukan hal berikut:
- Memberikan pekerjaan rumah jika diperlukan.
- Memberi tahu siswa cara mengirimkan tugas pekerjaan rumah.
- Memberi nilai tugas pekerjaan rumah.
Instruktur bisa menggunakan saran ini sesuai kebutuhan, dan bebas menugaskan pekerjaan rumah lain yang dirasa cocok.
Jika Anda menyelesaikan codelab ini sendiri, gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Jawab pertanyaan-pertanyaan berikut
Pertanyaan 1
Salah satu cara untuk mengaktifkan aplikasi Anda memicu navigasi dari satu fragmen ke fragmen berikutnya adalah dengan menggunakan nilai LiveData untuk menunjukkan apakah akan memicu navigasi atau tidak.
Apa langkah-langkah untuk menggunakan nilai LiveData, yang disebut gotoBlueFragment, untuk memicu navigasi dari fragmen merah ke fragmen biru? Pilih semua yang berlaku:
- Di
ViewModel, tentukan nilaiLiveDatagotoBlueFragment. - Di
RedFragment, amati nilaigotoBlueFragment. Terapkan kodeobserve{}untuk menavigasi keBlueFragmentjika sesuai, lalu reset nilaigotoBlueFragmentuntuk menunjukkan bahwa navigasi telah selesai. - Pastikan kode Anda menetapkan variabel
gotoBlueFragmentke nilai yang memicu navigasi setiap kali aplikasi perlu beralih dariRedFragmentkeBlueFragment. - Pastikan kode Anda menentukan pengendali
onClickuntukViewyang diklik pengguna untuk membukaBlueFragment, tempat pengendalionClickmengamati nilaigoToBlueFragment.
Pertanyaan 2
Anda dapat mengubah apakah Button diaktifkan (dapat diklik) atau tidak dengan menggunakan LiveData. Bagaimana Anda memastikan bahwa aplikasi Anda mengubah tombol UpdateNumber sehingga:
- Tombol diaktifkan jika
myNumbermemiliki nilai lebih besar dari 5. - Tombol tidak diaktifkan jika
myNumbersama dengan atau kurang dari 5.
Asumsikan bahwa tata letak yang berisi tombol UpdateNumber menyertakan variabel <data> untuk NumbersViewModel seperti yang ditunjukkan di sini:
<data>
<variable
name="NumbersViewModel"
type="com.example.android.numbersapp.NumbersViewModel" />
</data>Asumsikan bahwa ID tombol dalam file tata letak adalah sebagai berikut:
android:id="@+id/update_number_button"
Apa lagi yang perlu Anda lakukan? Pilih semua yang sesuai.
- Di class
NumbersViewModel, tentukan variabelLiveData,myNumber, yang merepresentasikan angka. Tentukan juga variabel yang nilainya ditetapkan dengan memanggilTransform.map()pada variabelmyNumber, yang menampilkan boolean yang menunjukkan apakah angka tersebut lebih besar dari 5 atau tidak.
Secara khusus, diViewModel, tambahkan kode berikut:
val myNumber: LiveData<Int>
val enableUpdateNumberButton = Transformations.map(myNumber) {
myNumber > 5
}- Dalam tata letak XML, tetapkan atribut
android:enableddariupdate_number_button buttonkeNumberViewModel.enableUpdateNumbersButton.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"- Di
Fragmentyang menggunakan classNumbersViewModel, tambahkan observer ke atributenabledtombol.
Secara khusus, diFragment, tambahkan kode berikut:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
myNumber > 5
})- Dalam file tata letak, tetapkan atribut
android:enableddariupdate_number_button buttonke"Observable".
Mulai pelajaran berikutnya:
Untuk link ke codelab lain dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Android Kotlin.