Codelab ini adalah bagian dari kursus Dasar-Dasar Kotlin Android. Anda akan mendapatkan manfaat maksimal dari kursus ini jika Anda mengerjakan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Codelab ini meringkas cara menggunakan ViewModel
dan fragmen secara bersamaan untuk mengimplementasikan navigasi. Ingat bahwa tujuannya adalah untuk menempatkan logika when untuk menavigasi ke ViewModel
, tetapi tentukan jalur di fragmen dan file navigasi. Untuk mencapai tujuan ini, gunakan model tampilan, fragmen, LiveData
, dan observer.
Codelab ini diakhiri dengan menampilkan cara pintar untuk melacak status tombol dengan kode minimal, sehingga setiap tombol hanya bisa diklik dan diklik saat pengguna perlu mengetuk tombol tersebut.
Yang harus sudah Anda ketahui
Anda harus memahami:
- Membuat antarmuka pengguna (UI) dasar menggunakan aktivitas, fragmen, dan tampilan.
- Menavigasi antar-fragmen dan menggunakan
safeArgs
untuk meneruskan data antar-fragmen. - Lihat model, lihat pabrik 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 jangka panjang 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 peristiwa.
Yang akan Anda lakukan
- Perluas aplikasi TrackMySleepQuality untuk mengumpulkan rating kualitas, menambahkan rating ke database, dan menampilkan hasilnya.
- Gunakan
LiveData
untuk memicu tampilan snackbar. - Gunakan
LiveData
untuk mengaktifkan dan menonaktifkan tombol.
Dalam codelab ini, Anda akan membuat rekaman kualitas tidur dan UI final aplikasi TrackMySleepQuality.
Aplikasi memiliki dua layar, yang direpresentasikan oleh fragmen, seperti yang ditunjukkan pada gambar di bawah ini.
Layar pertama, yang ditampilkan di sebelah kiri, memiliki tombol untuk memulai dan menghentikan pelacakan. Layar menampilkan semua data tidur pengguna. Tombol Hapus secara permanen menghapus semua data yang telah dikumpulkan oleh aplikasi untuk pengguna.
Layar kedua, yang ditampilkan di sebelah kanan, adalah untuk memilih rating kualitas tidur. Di aplikasi, rating direpresentasikan secara numerik. Untuk tujuan pengembangan, aplikasi menampilkan ikon wajah dan ikon numeriknya.
Alur penggunaannya adalah sebagai berikut:
- Pengguna akan membuka aplikasi dan melihat layar pelacakan tidur.
- Pengguna mengetuk tombol Start. Ini akan merekam waktu mulai dan menampilkannya. Tombol Start dinonaktifkan, dan tombol Stop diaktifkan.
- Pengguna mengetuk tombol Stop. Tindakan ini akan mencatat waktu berakhir dan membuka layar kualitas tidur.
- Pengguna memilih ikon kualitas tidur. Layar akan ditutup, dan layar pelacakan menampilkan waktu tidur dan kualitas tidur. Tombol Stop dinonaktifkan dan tombol Start diaktifkan. Aplikasi siap untuk malam lainnya.
- Tombol Hapus diaktifkan setiap kali ada data dalam database. Saat pengguna mengetuk tombol Hapus, semua data mereka akan dihapus tanpa bantuan—tidak ada pesan "Apakah Anda yakin?".
Aplikasi ini menggunakan arsitektur yang disederhanakan, seperti yang ditampilkan di bawah ini dalam konteks arsitektur lengkap. Aplikasi hanya menggunakan komponen berikut:
- Pengontrol UI
- Lihat model dan
LiveData
- Database Room
Codelab ini mengasumsikan bahwa Anda mengetahui cara menerapkan navigasi menggunakan fragmen dan file navigasi. Agar Anda dapat menyimpan pekerjaan, banyak tersedia kode ini.
Langkah 1: Periksa kode
- Untuk memulai, lanjutkan dengan kode Anda sendiri dari bagian akhir codelab terakhir, atau download kode awal.
- Dalam kode awal Anda, periksa
SleepQualityFragment
. Class ini akan memperluas tata letak, mendapatkan aplikasi, dan menampilkanbinding.root
. - Buka navigation.xml di editor desain. Anda melihat bahwa ada jalur navigasi dari
SleepTrackerFragment
keSleepQualityFragment
, dan kembali dariSleepQualityFragment
keSleepTrackerFragment
. - Periksa kode untuk navigation.xml. Secara khusus, cari
<argument>
yang bernamasleepNightKey
.
Saat pengguna beralih dariSleepTrackerFragment
keSleepQualityFragment,
, aplikasi akan meneruskansleepNightKey
keSleepQualityFragment
untuk malam yang perlu diupdate.
Langkah 2: Tambahkan navigasi untuk pelacakan kualitas tidur
Grafik navigasi sudah menyertakan jalur dari SleepTrackerFragment
ke SleepQualityFragment
dan kembali lagi. Namun, pengendali klik yang menerapkan navigasi dari satu fragmen ke fragmen berikutnya belum dikodekan. Sekarang Anda akan menambahkan kode tersebut di ViewModel
.
Pada pengendali klik, Anda menetapkan LiveData
yang berubah saat Anda ingin aplikasi menavigasi ke tujuan yang berbeda. Fragmen mengamati LiveData
ini. Saat data berubah, fragmen akan menavigasi ke tujuan dan memberi tahu model tampilan bahwa yang dilakukannya telah selesai, yang 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 membukaSleepQualityFragment
. Gunakan enkapsulasi untuk hanya mengekspos versiLiveData
yang dapat diperoleh keViewModel
.
Anda bisa menempatkan kode ini di mana saja pada bagian atas isi class.
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 dalam bloklaunch{}
. Perhatikan bahwa variabel ini ditetapkan kenight
. Jika variabel ini memiliki nilai, aplikasi akan membukaSleepQualityFragment
, yang diteruskan sepanjang malam.
_navigateToSleepQuality.value = oldNight
SleepTrackerFragment
harus diamati _navigateToSleepQuality
agar aplikasi tahu kapan harus menavigasi. PadaSleepTrackerFragment
, 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, pilih dan teruskan ID malam saat ini, lalu panggil
doneNavigating()
. Jika impor Anda ambigu, imporandroidx.navigation.fragment.findNavController
.
night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
sleepTrackerViewModel.doneNavigating()
}
- Buat dan jalankan aplikasi Anda. Ketuk Mulai, lalu ketuk Hentikan yang akan mengarahkan Anda ke layar
SleepQualityFragment
. Untuk kembali, gunakan tombol Kembali sistem.
Dalam tugas ini, Anda mencatat kualitas tidur dan kembali ke fragmen pelacak tidur. Layar akan diupdate secara otomatis untuk menampilkan nilai yang diperbarui kepada pengguna. Anda harus membuat ViewModel
dan ViewModelFactory
, serta mengupdate SleepQualityFragment
.
Langkah 1: Buat ViewModel dan ViewModelFactory
- Dalam 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 factory. Anda juga perlu 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
. ImplementasikannavigateToSleepTracker
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 pada codelab sebelumnya:
- Luncurkan coroutine di
uiScope
, dan beralihlah ke dispatcher I/O. - Dapatkan
tonight
menggunakansleepNightKey
. - Menyetel kualitas tidur.
- Mengupdate database.
- Memicu navigasi.
Perhatikan bahwa contoh kode di bawah melakukan semua tugas di pengendali klik, bukan memfaktorkan 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
}
}
- Pada paket
sleepquality
, buat atau bukaSleepQualityViewModelFactory.kt
dan tambahkan classSleepQualityViewModelFactory
, seperti yang ditunjukkan di bawah. Class ini menggunakan versi kode boilerplate yang sama 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 harus mendapatkanarguments
yang disertakan dengan navigasi. Argumen ini ada dalamSleepQualityFragmentArgs
. Anda harus mengekstraknya dari paket.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
- Berikutnya, 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 untuk saat ini.)
binding.sleepQualityViewModel = sleepQualityViewModel
- Tambahkan observer. Jika 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 masing-masing dari enam gambar kualitas tidur, tambahkan pengendali klik seperti di bawah ini. Sesuaikan rating kualitas dengan gambar.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
- Bersihkan dan bangun kembali project Anda. Tindakan ini akan memperbaiki error pada objek binding. Jika tidak, hapus cache (File > Invalidate Caches / Restart) dan buat ulang aplikasi Anda.
Selamat! Anda baru saja membuat aplikasi database Room
lengkap menggunakan coroutine.
Kini aplikasi Anda berfungsi dengan baik. Pengguna dapat mengetuk Mulai dan Berhenti sebanyak yang mereka inginkan. Saat pengguna mengetuk Hentikan, mereka dapat memasukkan kualitas tidur. Saat pengguna mengetuk Hapus, semua data akan dihapus di latar belakang. Namun, semua tombol selalu diaktifkan dan dapat diklik, yang tidak merusak aplikasi, tetapi memungkinkan pengguna membuat tidur malam 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 sesuai setelah semua data dihapus.
Langkah 1: Perbarui status tombol
Idenya adalah untuk menyetel status tombol sehingga di awal, hanya tombol Start yang diaktifkan, yang berarti tombol ini dapat diklik.
Setelah pengguna mengetuk Mulai, tombol Hentikan akan diaktifkan dan Mulai tidak aktif. Tombol Hapus hanya diaktifkan saat ada data di 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 diaktifkan dapat diketuk; tombol yang dinonaktifkan tidak dapat diaktifkan.) Beri properti nilai variabel status yang akan Anda tentukan dalam beberapa saat.
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 ke setiap variabel yang akan mengujinya.
- Tombol Start harus diaktifkan ketika
tonight
adalahnull
. - Tombol Stop harus diaktifkan saat
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 lakukan eksperimen dengan tombol.
Langkah 2: Gunakan snackbar untuk memberi tahu pengguna
Setelah pengguna menghapus database, tampilkan konfirmasi kepada pengguna menggunakan widget Snackbar
. Snackbar memberikan masukan singkat tentang operasi melalui pesan di bagian bawah layar. Snackbar menghilang setelah waktu tunggu, setelah interaksi pengguna di tempat lain pada layar, atau setelah pengguna menggeser snackbar keluar dari layar.
Menampilkan snackbar adalah tugas UI, dan harus dilakukan di fragmen. Penentuan 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 peristiwa yang dienkapsulasi.
private var _showSnackbarEvent = MutableLiveData<Boolean>()
val showSnackBarEvent: LiveData<Boolean>
get() = _showSnackbarEvent
- Kemudian, terapkan
doneShowingSnackbar()
.
fun doneShowingSnackbar() {
_showSnackbarEvent.value = false
}
- Pada
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
dalam bloklaunch
:
_showSnackbarEvent.value = true
- Build dan jalankan aplikasi Anda.
Project Android Studio: TrackMySleepQualityFinal
Menerapkan pelacakan kualitas tidur di aplikasi ini seperti memutar potongan musik yang sudah dikenal di kunci baru. Meskipun detailnya berubah, pola yang mendasari tindakan yang Anda lakukan di codelab sebelumnya dalam pelajaran ini tetap sama. Menyadari pola ini akan membuat coding jauh lebih cepat, karena Anda dapat menggunakan kembali kode dari aplikasi yang sudah ada. Berikut adalah beberapa pola yang digunakan dalam kursus ini sejauh ini:
- Buat
ViewModel
danViewModelFactory
, lalu siapkan sumber data. - Memicu navigasi. Untuk memisahkan masalah, letakkan pengendali klik dalam model tampilan dan navigasi di fragmen.
- Gunakan enkapsulasi dengan
LiveData
untuk melacak dan merespons perubahan status. - Gunakan transformasi dengan
LiveData
. - Buat database singleton.
- Menyiapkan coroutine untuk operasi database.
Memicu navigasi
Anda dapat menentukan kemungkinan jalur navigasi antar-fragmen dalam file navigasi. Ada beberapa cara berbeda untuk memicu navigasi dari satu fragmen ke fragmen berikutnya. Fitur tersebut meliputi:
- Tentukan pengendali
onClick
untuk memicu navigasi ke fragmen tujuan. - Atau, untuk mengaktifkan navigasi dari satu fragmen ke fragmen berikutnya:
- Tentukan nilai
LiveData
untuk mencatat apakah navigasi harus terjadi. - Lampirkan observer ke nilai
LiveData
tersebut. - Kode Anda kemudian mengubah nilai tersebut setiap kali navigasi perlu dipicu atau selesai.
Menyetel 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 subclass. Misalnya,EditText
yang tidak diaktifkan mencegah pengguna mengedit teks yang dimuat, danButton
yang tidak aktif 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 digunakan 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. Terserah instruktur untuk melakukan hal berikut:
- Tugaskan pekerjaan rumah jika diperlukan.
- Berkomunikasi dengan siswa cara mengirimkan tugas pekerjaan rumah.
- Beri nilai tugas pekerjaan rumah.
Instruktur dapat menggunakan saran ini sesedikit atau sebanyak yang mereka inginkan, dan harus bebas memberikan pekerjaan rumah lain yang dirasa sesuai.
Jika Anda mengerjakan codelab ini sendiri, silakan gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Jawab pertanyaan berikut
Pertanyaan 1
Salah satu cara untuk memungkinkan 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 harus 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 cara memastikan bahwa aplikasi Anda mengubah tombol UpdateNumber
sehingga:
- Tombol akan diaktifkan jika
myNumber
memiliki nilai yang lebih besar dari 5. - Tombol tidak diaktifkan jika
myNumber
sama dengan atau kurang dari 5.
Anggaplah tata letak yang berisi tombol UpdateNumber
menyertakan variabel <data>
untuk NumbersViewModel
seperti yang ditampilkan 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 mewakili angka. Tentukan juga variabel yang nilainya ditetapkan dengan memanggilTransform.map()
pada variabelmyNumber
, yang menampilkan boolean yang menunjukkan apakah angka tersebut lebih besar atau lebih besar dari 5.
Secara khusus, diViewModel
, tambahkan kode berikut:
val myNumber: LiveData<Int>
val enableUpdateNumberButton = Transformations.map(myNumber) {
myNumber > 5
}
- Pada tata letak XML, tetapkan atribut
android:enabled
dariupdate_number_button button
keNumberViewModel.enableUpdateNumbersButton
.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
- Di
Fragment
yang menggunakan classNumbersViewModel
, tambahkan pengamat ke atributenabled
tombol.
Secara khusus, diFragment
, tambahkan kode berikut:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
myNumber > 5
})
- Di file tata letak, tetapkan atribut
android:enabled
dariupdate_number_button button
ke"Observable"
.
Mulai ke tutorial berikutnya:
Untuk link ke codelab lainnya dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Kotlin Android.