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
safeArgs
untuk meneruskan data antar-fragmen. - Melihat model, melihat factory model, transformasi, dan
LiveData
serta 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
LiveData
untuk 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
LiveData
untuk memicu tampilan snackbar. - Gunakan
LiveData
untuk 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
SleepTrackerFragment
keSleepQualityFragment
, dan kembali lagi dariSleepQualityFragment
keSleepTrackerFragment
. - Periksa kode untuk navigation.xml. Secara khusus, cari
<argument>
bernamasleepNightKey
.
Saat pengguna beralih dariSleepTrackerFragment
keSleepQualityFragment,
, aplikasi akan meneruskansleepNightKey
keSleepQualityFragment
untuk 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 membukaSleepQualityFragment
untuk mengumpulkan rating kualitas. - Di
SleepTrackerViewModel
, buatLiveData
yang berubah saat Anda ingin aplikasi menavigasi keSleepQualityFragment
. Gunakan enkapsulasi untuk hanya mengekspos versiLiveData
yang 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 _navigateToSleepQuality
di 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 = oldNight
SleepTrackerFragment
perlu mengamati _navigateToSleepQuality
agar 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
SleepQualityViewModel
yang menggunakansleepNightKey
dan database sebagai argumen. Sama seperti yang Anda lakukan untukSleepTrackerViewModel
, Anda harus meneruskandatabase
dari pabrik. Anda juga harus meneruskansleepNightKey
dari navigasi.
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}
- Di dalam class
SleepQualityViewModel
, tentukanJob
danuiScope
, lalu gantionCleared()
.
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
- Untuk kembali ke
SleepTrackerFragment
menggunakan pola yang sama seperti di atas, deklarasikan_navigateToSleepTracker
. TerapkannavigateToSleepTracker
dandoneNavigating()
.
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
tonight
menggunakansleepNightKey
. - 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.kt
dan 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 mendapatkanarguments
yang 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
dataSource
dansleepNightKey
.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
- Dapatkan referensi
ViewModel
.
val sleepQualityViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepQualityViewModel::class.java)
- Tambahkan
ViewModel
ke 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:enabled
ke setiap tombol. Propertiandroid:enabled
adalah 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
SleepTrackerViewModel
dan buat tiga variabel yang sesuai. Tetapkan transformasi yang mengujinya ke setiap variabel.
- Tombol Start harus diaktifkan saat
tonight
adalahnull
. - Tombol Berhenti harus diaktifkan jika
tonight
bukannull
. - 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 ketrue
di 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
ViewModel
danViewModelFactory
, lalu siapkan sumber data. - Memicu navigasi. Untuk memisahkan masalah, letakkan handler klik di model tampilan dan navigasi di fragmen.
- Gunakan enkapsulasi dengan
LiveData
untuk 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
onClick
untuk memicu navigasi ke fragmen tujuan. - Atau, untuk mengaktifkan navigasi dari satu fragmen ke fragmen berikutnya:
- Tentukan nilai
LiveData
untuk merekam apakah navigasi harus terjadi. - Lampirkan observer ke nilai
LiveData
tersebut. - Kemudian, kode Anda akan mengubah nilai tersebut setiap kali navigasi perlu dipicu atau selesai.
Menetapkan atribut android:enabled
- Atribut
android:enabled
ditentukan diTextView
dan diwarisi oleh semua subclass, termasukButton
. - Atribut
android:enabled
menentukan apakahView
diaktifkan atau tidak. Arti "diaktifkan" bervariasi menurut subkelas. Misalnya,EditText
yang tidak diaktifkan mencegah pengguna mengedit teks yang ada di dalamnya, danButton
yang tidak diaktifkan mencegah pengguna mengetuk tombol. - Atribut
enabled
tidak sama dengan atributvisibility
. - Anda dapat menggunakan peta transformasi untuk menetapkan nilai atribut
enabled
tombol 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
Snackbar
untuk 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 nilaiLiveData
gotoBlueFragment
. - Di
RedFragment
, amati nilaigotoBlueFragment
. Terapkan kodeobserve{}
untuk menavigasi keBlueFragment
jika sesuai, lalu reset nilaigotoBlueFragment
untuk menunjukkan bahwa navigasi telah selesai. - Pastikan kode Anda menetapkan variabel
gotoBlueFragment
ke nilai yang memicu navigasi setiap kali aplikasi perlu beralih dariRedFragment
keBlueFragment
. - Pastikan kode Anda menentukan pengendali
onClick
untukView
yang diklik pengguna untuk membukaBlueFragment
, tempat pengendalionClick
mengamati 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
myNumber
memiliki nilai lebih besar dari 5. - Tombol tidak diaktifkan jika
myNumber
sama 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:enabled
dariupdate_number_button button
keNumberViewModel.enableUpdateNumbersButton
.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
- Di
Fragment
yang menggunakan classNumbersViewModel
, tambahkan observer ke atributenabled
tombol.
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:enabled
dariupdate_number_button button
ke"Observable"
.
Mulai pelajaran berikutnya:
Untuk link ke codelab lain dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Android Kotlin.