Dasar-Dasar Android Kotlin 06.3: Menggunakan LiveData untuk mengontrol status tombol

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

  1. Untuk memulai, lanjutkan dengan kode Anda sendiri dari akhir codelab terakhir, atau download kode awal.
  2. Dalam kode awal Anda, periksa SleepQualityFragment. Class ini meng-inflate tata letak, mendapatkan aplikasi, dan menampilkan binding.root.
  3. Buka navigation.xml di editor desain. Anda melihat bahwa ada jalur navigasi dari SleepTrackerFragment ke SleepQualityFragment, dan kembali lagi dari SleepQualityFragment ke SleepTrackerFragment.



  4. Periksa kode untuk navigation.xml. Secara khusus, cari <argument> bernama sleepNightKey.

    Saat pengguna beralih dari SleepTrackerFragment ke SleepQualityFragment,, aplikasi akan meneruskan sleepNightKey ke SleepQualityFragment 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.

  1. Buka SleepTrackerViewModel. Anda perlu menambahkan navigasi sehingga saat pengguna mengetuk tombol Stop, aplikasi akan membuka SleepQualityFragment untuk mengumpulkan rating kualitas.
  2. Di SleepTrackerViewModel, buat LiveData yang berubah saat Anda ingin aplikasi menavigasi ke SleepQualityFragment. Gunakan enkapsulasi untuk hanya mengekspos versi LiveData yang dapat diambil ke ViewModel.

    Anda dapat menempatkan kode ini di mana saja di tingkat teratas isi kelas.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()

val navigateToSleepQuality: LiveData<SleepNight>
   get() = _navigateToSleepQuality
  1. Tambahkan fungsi doneNavigating() yang mereset variabel yang memicu navigasi.
fun doneNavigating() {
   _navigateToSleepQuality.value = null
}
  1. Di pengendali klik untuk tombol Stop, onStopTracking(), picu navigasi ke SleepQualityFragment. Tetapkan variabel _navigateToSleepQuality di akhir fungsi sebagai hal terakhir di dalam blok launch{}. Perhatikan bahwa variabel ini ditetapkan ke night. Saat variabel ini memiliki nilai, aplikasi akan membuka SleepQualityFragment, sambil meneruskan malam.
_navigateToSleepQuality.value = oldNight
  1. SleepTrackerFragment perlu mengamati _navigateToSleepQuality agar aplikasi mengetahui kapan harus melakukan navigasi. Di SleepTrackerFragment, di onCreateView(), tambahkan observer untuk navigateToSleepQuality(). Perhatikan bahwa impor untuk ini ambigu dan Anda perlu mengimpor androidx.lifecycle.Observer.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})

  1. Di dalam blok observer, buka dan teruskan ID malam ini, lalu panggil doneNavigating(). Jika impor Anda ambigu, impor androidx.navigation.fragment.findNavController.
night ->
night?.let {
   this.findNavController().navigate(
           SleepTrackerFragmentDirections
                   .actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
   sleepTrackerViewModel.doneNavigating()
}
  1. 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

  1. Di paket sleepquality, buat atau buka SleepQualityViewModel.kt.
  2. Buat class SleepQualityViewModel yang menggunakan sleepNightKey dan database sebagai argumen. Sama seperti yang Anda lakukan untuk SleepTrackerViewModel, Anda harus meneruskan database dari pabrik. Anda juga harus meneruskan sleepNightKey dari navigasi.
class SleepQualityViewModel(
       private val sleepNightKey: Long = 0L,
       val database: SleepDatabaseDao) : ViewModel() {
}
  1. Di dalam class SleepQualityViewModel, tentukan Job dan uiScope, lalu ganti onCleared().
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}
  1. Untuk kembali ke SleepTrackerFragment menggunakan pola yang sama seperti di atas, deklarasikan _navigateToSleepTracker. Terapkan navigateToSleepTracker dan doneNavigating().
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()

val navigateToSleepTracker: LiveData<Boolean?>
   get() = _navigateToSleepTracker

fun doneNavigating() {
   _navigateToSleepTracker.value = null
}
  1. 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 menggunakan sleepNightKey.
  • 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
        }
    }
  1. Di paket sleepquality, buat atau buka SleepQualityViewModelFactory.kt dan tambahkan class SleepQualityViewModelFactory, 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

  1. Buka SleepQualityFragment.kt.
  2. Di onCreateView(), setelah mendapatkan application, Anda perlu mendapatkan arguments yang disertakan dengan navigasi. Argumen ini ada di SleepQualityFragmentArgs. Anda harus mengekstraknya dari paket.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
  1. Selanjutnya, dapatkan dataSource.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
  1. Buat factory, dengan meneruskan dataSource dan sleepNightKey.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
  1. Dapatkan referensi ViewModel.
val sleepQualityViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepQualityViewModel::class.java)
  1. Tambahkan ViewModel ke objek binding. (Jika Anda melihat error pada objek binding, abaikan saja untuk saat ini.)
binding.sleepQualityViewModel = sleepQualityViewModel
  1. 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

  1. Buka file tata letak fragment_sleep_quality.xml. Di blok <data>, tambahkan variabel untuk SleepQualityViewModel.
 <data>
       <variable
           name="sleepQualityViewModel"
           type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
   </data>
  1. Untuk setiap enam gambar kualitas tidur, tambahkan pengendali klik seperti di bawah. Cocokkan rating kualitas dengan gambar.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
  1. 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.

  1. Buka file tata letak fragment_sleep_tracker.xml.
  2. Tambahkan properti android:enabled ke setiap tombol. Properti android: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}"
  1. Buka SleepTrackerViewModel dan buat tiga variabel yang sesuai. Tetapkan transformasi yang mengujinya ke setiap variabel.
  • Tombol Start harus diaktifkan saat tonight adalah null.
  • Tombol Berhenti harus diaktifkan jika tonight bukan null.
  • 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()
}
  1. 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.

  1. Di SleepTrackerViewModel, buat acara yang dienkapsulasi.
private var _showSnackbarEvent = MutableLiveData<Boolean>()

val showSnackBarEvent: LiveData<Boolean>
   get() = _showSnackbarEvent
  1. Kemudian, implementasikan doneShowingSnackbar().
fun doneShowingSnackbar() {
   _showSnackbarEvent.value = false
}
  1. Di SleepTrackerFragment, di onCreateView(), tambahkan observer:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })
  1. 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()
   }
  1. Di SleepTrackerViewModel, picu peristiwa dalam metode onClear(). Untuk melakukannya, tetapkan nilai peristiwa ke true di dalam blok launch:
_showSnackbarEvent.value = true
  1. 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 dan ViewModelFactory, 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 di TextView dan diwarisi oleh semua subclass, termasuk Button.
  • Atribut android:enabled menentukan apakah View diaktifkan atau tidak. Arti "diaktifkan" bervariasi menurut subkelas. Misalnya, EditText yang tidak diaktifkan mencegah pengguna mengedit teks yang ada di dalamnya, dan Button yang tidak diaktifkan mencegah pengguna mengetuk tombol.
  • Atribut enabled tidak sama dengan atribut visibility.
  • 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 nilai LiveData gotoBlueFragment.
  • Di RedFragment, amati nilai gotoBlueFragment. Terapkan kode observe{} untuk menavigasi ke BlueFragment jika sesuai, lalu reset nilai gotoBlueFragment untuk menunjukkan bahwa navigasi telah selesai.
  • Pastikan kode Anda menetapkan variabel gotoBlueFragment ke nilai yang memicu navigasi setiap kali aplikasi perlu beralih dari RedFragment ke BlueFragment.
  • Pastikan kode Anda menentukan pengendali onClick untuk View yang diklik pengguna untuk membuka BlueFragment, tempat pengendali onClick mengamati nilai goToBlueFragment.

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 variabel LiveData, myNumber, yang merepresentasikan angka. Tentukan juga variabel yang nilainya ditetapkan dengan memanggil Transform.map() pada variabel myNumber, yang menampilkan boolean yang menunjukkan apakah angka tersebut lebih besar dari 5 atau tidak.

    Secara khusus, di ViewModel, tambahkan kode berikut:
val myNumber: LiveData<Int>

val enableUpdateNumberButton = Transformations.map(myNumber) {
   myNumber > 5
}
  • Dalam tata letak XML, tetapkan atribut android:enabled dari update_number_button button ke NumberViewModel.enableUpdateNumbersButton.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
  • Di Fragment yang menggunakan class NumbersViewModel, tambahkan observer ke atribut enabled tombol.

    Secara khusus, di Fragment, 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 dari update_number_button button ke "Observable".

Mulai pelajaran berikutnya: 7.1 Dasar-dasar RecyclerView

Untuk link ke codelab lain dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Android Kotlin.