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

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

  1. Untuk memulai, lanjutkan dengan kode Anda sendiri dari bagian akhir codelab terakhir, atau download kode awal.
  2. Dalam kode awal Anda, periksa SleepQualityFragment. Class ini akan memperluas 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 dari SleepQualityFragment ke SleepTrackerFragment.



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

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

  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 membuka SleepQualityFragment. Gunakan enkapsulasi untuk hanya mengekspos versi LiveData yang dapat diperoleh ke ViewModel.

    Anda bisa menempatkan kode ini di mana saja pada bagian atas isi class.
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 dalam blok launch{}. Perhatikan bahwa variabel ini ditetapkan ke night. Jika variabel ini memiliki nilai, aplikasi akan membuka SleepQualityFragment, yang diteruskan sepanjang malam.
_navigateToSleepQuality.value = oldNight
  1. SleepTrackerFragment harus diamati _navigateToSleepQuality agar aplikasi tahu kapan harus menavigasi. Pada 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, pilih dan teruskan ID malam saat 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. 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

  1. Dalam 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 factory. Anda juga perlu 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. Implementasikan 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 pada codelab sebelumnya:
  • Luncurkan coroutine di uiScope, dan beralihlah ke dispatcher I/O.
  • Dapatkan tonight menggunakan sleepNightKey.
  • 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
        }
    }
  1. Pada paket sleepquality, buat atau buka SleepQualityViewModelFactory.kt dan tambahkan class SleepQualityViewModelFactory, 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

  1. Buka SleepQualityFragment.kt.
  2. Di onCreateView(), setelah mendapatkan application, Anda harus mendapatkan arguments yang disertakan dengan navigasi. Argumen ini ada dalam SleepQualityFragmentArgs. Anda harus mengekstraknya dari paket.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
  1. Berikutnya, 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 untuk saat ini.)
binding.sleepQualityViewModel = sleepQualityViewModel
  1. 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

  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 masing-masing dari enam gambar kualitas tidur, tambahkan pengendali klik seperti di bawah ini. Sesuaikan rating kualitas dengan gambar.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
  1. 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.

  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 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}"
  1. Buka SleepTrackerViewModel dan buat tiga variabel yang sesuai. Tetapkan transformasi ke setiap variabel yang akan mengujinya.
  • Tombol Start harus diaktifkan ketika tonight adalah null.
  • Tombol Stop harus diaktifkan saat 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 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.

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

val showSnackBarEvent: LiveData<Boolean>
   get() = _showSnackbarEvent
  1. Kemudian, terapkan doneShowingSnackbar().
fun doneShowingSnackbar() {
   _showSnackbarEvent.value = false
}
  1. Pada 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 dalam blok launch:
_showSnackbarEvent.value = true
  1. 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 dan ViewModelFactory, 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 di TextView dan diwarisi oleh semua subclass, termasuk Button.
  • Atribut android:enabled menentukan apakah View diaktifkan atau tidak. Arti "diaktifkan" bervariasi menurut subclass. Misalnya, EditText yang tidak diaktifkan mencegah pengguna mengedit teks yang dimuat, dan Button yang tidak aktif 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 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 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 harus 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 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 variabel LiveData, myNumber, yang mewakili angka. Tentukan juga variabel yang nilainya ditetapkan dengan memanggil Transform.map() pada variabel myNumber, yang menampilkan boolean yang menunjukkan apakah angka tersebut lebih besar atau lebih besar dari 5.

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

val enableUpdateNumberButton = Transformations.map(myNumber) {
   myNumber > 5
}
  • Pada 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 pengamat 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
})
  • Di file tata letak, tetapkan atribut android:enabled dari update_number_button button ke "Observable".

Mulai ke tutorial berikutnya: 7.1 Dasar-dasar RecyclerView

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