Android Kotlin Hakkında Temel Bilgiler 06.3: Düğme durumlarını kontrol etmek için LiveData'yı kullanma

Bu codelab, Android Kotlin Hakkında Temel Bilgiler kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanızı öneririz. Kursla ilgili tüm codelab'ler Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında listelenir.

Giriş

Bu codelab'de, gezinmeyi uygulamak için ViewModel ve parçaların birlikte nasıl kullanılacağı özetlenmektedir. Amacın, ne zaman gezinileceğine dair mantığı ViewModel içine yerleştirmek, ancak yolları parçalarda ve gezinme dosyasında tanımlamak olduğunu unutmayın. Bu hedefe ulaşmak için görünüm modellerini, parçaları, LiveData ve gözlemcileri kullanırsınız.

Bu codelab, düğme durumlarını en az kodla izlemenin akıllı bir yolunu göstererek sona erer. Böylece her düğme yalnızca kullanıcının o düğmeye dokunması mantıklı olduğunda etkinleştirilir ve tıklanabilir.

Bilmeniz gerekenler

Aşağıdaki konular hakkında bilgi sahibi olmanız gerekir:

  • Etkinlik, parçalar ve görünümler kullanarak temel bir kullanıcı arayüzü (UI) oluşturma.
  • Parçalar arasında gezinme ve parçalar arasında veri aktarmak için safeArgs kullanma.
  • Modelleri, model fabrikalarını, dönüşümleri ve LiveData ile gözlemcilerini görüntüleyin.
  • Room veritabanı oluşturma, veri erişim nesnesi (DAO) oluşturma ve varlıkları tanımlama
  • Veritabanı etkileşimleri ve uzun süren diğer görevler için eş yordamları kullanma

Neler öğreneceksiniz?

  • Veritabanındaki mevcut bir uyku kalitesi kaydını güncelleme
  • Düğme durumlarını izlemek için LiveData nasıl kullanılır?
  • Etkinliğe yanıt olarak nasıl snackbar gösterileceği.

Yapacaklarınız

  • TrackMySleepQuality uygulamasını, kalite derecelendirmesi toplama, derecelendirmeyi veritabanına ekleme ve sonucu gösterme işlevlerini içerecek şekilde genişletin.
  • Bir snackbar'ın gösterilmesini tetiklemek için LiveData öğesini kullanın.
  • Düğmeleri etkinleştirmek ve devre dışı bırakmak için LiveData kısayolunu kullanın.

Bu codelab'de TrackMySleepQuality uygulamasının uyku kalitesi kaydını ve son kullanıcı arayüzünü oluşturacaksınız.

Uygulama, aşağıdaki şekilde gösterildiği gibi parçalarla temsil edilen iki ekrana sahiptir.

Solda gösterilen ilk ekranda izlemeyi başlatma ve durdurma düğmeleri bulunur. Ekranda kullanıcının tüm uyku verileri gösterilir. Temizle düğmesi, uygulamanın kullanıcı için topladığı tüm verileri kalıcı olarak siler.

Sağda gösterilen ikinci ekranda uyku kalitesi derecesi seçilir. Uygulamada puan sayısal olarak gösterilir. Uygulama, geliştirme amacıyla hem yüz simgelerini hem de bunların sayısal karşılıklarını gösterir.

Kullanıcının akışı şu şekildedir:

  • Kullanıcı uygulamayı açar ve uyku takibi ekranı gösterilir.
  • Kullanıcı, Başlat düğmesine dokunur. Bu işlev, başlangıç zamanını kaydeder ve görüntüler. Başlat düğmesi devre dışı, Durdur düğmesi ise etkin olur.
  • Kullanıcı, Durdur düğmesine dokunur. Bu işlem, bitiş zamanını kaydeder ve uyku kalitesi ekranını açar.
  • Kullanıcı, uyku kalitesi simgesi seçer. Ekran kapanır ve takip ekranında uyku bitiş saati ile uyku kalitesi gösterilir. Durdur düğmesi devre dışı, Başlat düğmesi ise etkin olur. Uygulama başka bir geceye hazır.
  • Veritabanında veri olduğunda Temizle düğmesi etkinleştirilir. Kullanıcı Temizle düğmesine dokunduğunda tüm verileri geri dönüşü olmayacak şekilde silinir. "Emin misiniz?" mesajı gösterilmez.

Bu uygulama, tam mimari bağlamında aşağıda gösterildiği gibi basitleştirilmiş bir mimari kullanır. Uygulama yalnızca aşağıdaki bileşenleri kullanır:

  • Kullanıcı arayüzü denetleyicisi
  • Modeli ve LiveData görüntüleme
  • Room veritabanı

Bu codelab'de, parçaları ve gezinme dosyasını kullanarak gezinmeyi nasıl uygulayacağınızı bildiğiniz varsayılır. Çalışmanızı kaydetmek için bu kodun büyük bir kısmı sağlanır.

1. adım: Kodu inceleyin

  1. Başlamak için son codelab'in sonundaki kendi kodunuzla devam edin veya başlangıç kodunu indirin.
  2. Başlangıç kodunuzda SleepQualityFragment öğesini inceleyin. Bu sınıf, düzeni genişletir, uygulamayı alır ve binding.root değerini döndürür.
  3. Tasarım düzenleyicide navigation.xml dosyasını açın. SleepTrackerFragment'dan SleepQualityFragment'ye ve tekrar SleepQualityFragment'den SleepTrackerFragment'ya bir gezinme yolu olduğunu görürsünüz.



  4. navigation.xml dosyasının kodunu inceleyin. Özellikle <argument> adlı sleepNightKeyöğesini arayın.

    Kullanıcı SleepTrackerFragment'dan SleepQualityFragment,'a geçtiğinde uygulama, güncellenmesi gereken gece için sleepNightKey'yi SleepQualityFragment'a iletir.

2. adım: Uyku kalitesi izleme için gezinme ekleyin

Gezinme grafiği, SleepTrackerFragment konumundan SleepQualityFragment konumuna ve tekrar geri dönüş yollarını zaten içeriyor. Ancak, bir parçadan diğerine gezinmeyi uygulayan tıklama işleyicileri henüz kodlanmamıştır. Bu kodu şimdi ViewModel bölümüne ekleyin.

Tıklama işleyicisinde, uygulamanın farklı bir hedefe gitmesini istediğinizde değişen bir LiveData ayarlarsınız. Parça, bu LiveData değerini gözlemler. Veriler değiştiğinde parça, hedefe gider ve görünüm modeline işlemin tamamlandığını bildirir. Bu işlem, durum değişkenini sıfırlar.

  1. SleepTrackerViewModel adlı kişiyi aç. Kullanıcı Durdur düğmesine dokunduğunda uygulamanın SleepQualityFragment sayfasına giderek kalite derecelendirmesi toplamasını sağlamak için gezinme işlevi eklemeniz gerekir.
  2. SleepTrackerViewModel içinde, uygulamanın SleepQualityFragment sayfasına gitmesini istediğinizde değişen bir LiveData oluşturun. Kapsülleme kullanarak LiveData öğesinin yalnızca alınabilir bir sürümünü ViewModel öğesine sunun.

    Bu kodu sınıf gövdesinin üst düzeyinde herhangi bir yere yerleştirebilirsiniz.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()

val navigateToSleepQuality: LiveData<SleepNight>
   get() = _navigateToSleepQuality
  1. doneNavigating() işlevi ekleyin. Bu işlev, gezinmeyi tetikleyen değişkeni sıfırlar.
fun doneNavigating() {
   _navigateToSleepQuality.value = null
}
  1. Durdur düğmesinin tıklama işleyicisinde onStopTracking(), SleepQualityFragment'e gitme işlemini tetikleyin. İşlevin sonundaki _navigateToSleepQuality değişkenini, launch{} bloğunun içindeki son şey olarak ayarlayın. Bu değişkenin night olarak ayarlandığını unutmayın. Bu değişken bir değere sahip olduğunda uygulama, geceyi de ileterek SleepQualityFragment konumuna gider.
_navigateToSleepQuality.value = oldNight
  1. Uygulamanın ne zaman gezinmesi gerektiğini bilmesi için SleepTrackerFragment, _navigateToSleepQuality değerini gözlemlemelidir. SleepTrackerFragment bölümündeki onCreateView() alanına navigateToSleepQuality() için bir gözlemci ekleyin. Bunun için içe aktarma işleminin belirsiz olduğunu ve androidx.lifecycle.Observer içe aktarmanız gerektiğini unutmayın.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})

  1. Gözlemci bloğunun içinde, mevcut gecenin kimliğine gidip bu kimliği iletin ve ardından doneNavigating() işlevini çağırın. İçe aktarma işleminiz belirsizse androidx.navigation.fragment.findNavController içe aktarın.
night ->
night?.let {
   this.findNavController().navigate(
           SleepTrackerFragmentDirections
                   .actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
   sleepTrackerViewModel.doneNavigating()
}
  1. Uygulamanızı oluşturup çalıştırın. Başlat'a ve ardından Durdur'a dokunun. Bu işlem sizi SleepQualityFragment ekranına yönlendirir. Geri dönmek için sistemin geri düğmesini kullanın.

Bu görevde uyku kalitesini kaydedip uyku izleyici parçasına geri dönersiniz. Gösterge, güncellenen değeri kullanıcıya göstermek için otomatik olarak güncellenmelidir. ViewModel ve ViewModelFactory oluşturmanız, SleepQualityFragment öğesini güncellemeniz gerekir.

1. adım: ViewModel ve ViewModelFactory oluşturun

  1. sleepquality paketinde SleepQualityViewModel.kt dosyasını oluşturun veya açın.
  2. SleepQualityViewModel ve veritabanını bağımsız değişken olarak alan bir sleepNightKey sınıfı oluşturun. SleepTrackerViewModel için yaptığınız gibi, fabrikadan database değerini iletmeniz gerekir. Ayrıca gezinme işleminden sleepNightKey değerini de iletmeniz gerekir.
class SleepQualityViewModel(
       private val sleepNightKey: Long = 0L,
       val database: SleepDatabaseDao) : ViewModel() {
}
  1. SleepQualityViewModel sınıfında Job ve uiScope tanımlayın ve onCleared()'yi geçersiz kılın.
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}
  1. Yukarıdakiyle aynı kalıbı kullanarak SleepTrackerFragment'ya geri dönmek için _navigateToSleepTracker'ı bildirin. navigateToSleepTracker ve doneNavigating() işaretlemelerini uygulayın.
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()

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

fun doneNavigating() {
   _navigateToSleepTracker.value = null
}
  1. Kullanılacak tüm uyku kalitesi resimleri için tek bir tıklama işleyici (onSetSleepQuality()) oluşturun.

    Önceki codelab'dekiyle aynı coroutine kalıbını kullanın:
  • uiScope içinde bir coroutine başlatın ve I/O dispatcher'a geçin.
  • sleepNightKey kullanarak tonight elde edin.
  • Uyku kalitesini ayarlayın.
  • Veritabanını güncelleyin.
  • Gezinmeyi tetikleyin.

Aşağıdaki kod örneğinde, veritabanı işlemi farklı bağlamda ayrıştırılmak yerine tüm işlemlerin tıklama işleyicide yapıldığına dikkat edin.

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. sleepquality paketinde SleepQualityViewModelFactory.kt oluşturun veya açın ve aşağıdaki resimde gösterildiği gibi SleepQualityViewModelFactory sınıfını ekleyin. Bu sınıfta, daha önce gördüğünüz aynı standart kodun bir sürümü kullanılıyor. Devam etmeden önce kodu inceleyin.
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")
   }
}

2. adım: SleepQualityFragment'ı güncelleyin

  1. SleepQualityFragment.kt adlı kişiyi aç.
  2. onCreateView()'da application aldıktan sonra navigasyonla birlikte gelen arguments'yi almanız gerekir. Bu bağımsız değişkenler SleepQualityFragmentArgs içinde yer alır. Bu dosyaları paketten çıkarmanız gerekir.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
  1. Ardından dataSource hattına binin.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
  1. dataSource ve sleepNightKey değerlerini ileterek bir fabrika oluşturun.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
  1. ViewModel referansı alın.
val sleepQualityViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepQualityViewModel::class.java)
  1. Bağlama nesnesine ViewModel özelliğini ekleyin. (Bağlama nesnesiyle ilgili bir hata görürseniz şimdilik bunu göz ardı edin.)
binding.sleepQualityViewModel = sleepQualityViewModel
  1. Gözlemciyi ekleyin. İstendiğinde androidx.lifecycle.Observer dosyasını içe aktarın.
sleepQualityViewModel.navigateToSleepTracker.observe(this, Observer {
   if (it == true) { // Observed state is true.
       this.findNavController().navigate(
               SleepQualityFragmentDirections.actionSleepQualityFragmentToSleepTrackerFragment())
       sleepQualityViewModel.doneNavigating()
   }
})

3. adım: Düzen dosyasını güncelleyin ve uygulamayı çalıştırın

  1. fragment_sleep_quality.xml düzen dosyasını açın. <data> bloğuna, SleepQualityViewModel için bir değişken ekleyin.
 <data>
       <variable
           name="sleepQualityViewModel"
           type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
   </data>
  1. Uyku kalitesiyle ilgili altı resmin her biri için aşağıdaki gibi bir tıklama işleyici ekleyin. Kalite derecelendirmesini resimle eşleştirin.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
  1. Projenizi temizleyip yeniden oluşturun. Bu işlem, bağlama nesnesiyle ilgili tüm hataları düzeltir. Aksi takdirde, önbelleği temizleyin (File > Invalidate Caches / Restart) ve uygulamanızı yeniden oluşturun.

Tebrikler! Eş yordamları kullanarak eksiksiz bir Room veritabanı uygulaması oluşturdunuz.

Uygulamanız artık sorunsuz çalışıyor. Kullanıcı, Başlat ve Durdur'a istediği kadar dokunabilir. Kullanıcı Durdur'a dokunduğunda uyku kalitesini girebilir. Kullanıcı Temizle'ye dokunduğunda tüm veriler arka planda sessizce temizlenir. Ancak tüm düğmeler her zaman etkin ve tıklanabilir durumda olduğundan uygulama bozulmuyor ancak kullanıcıların eksik uyku geceleri oluşturmasına izin veriliyor.

Bu son görevde, kullanıcıların yalnızca doğru seçimi yapabilmesi için düğme görünürlüğünü yönetmek üzere dönüşüm haritalarını nasıl kullanacağınızı öğreneceksiniz. Tüm veriler temizlendikten sonra kullanıcı dostu bir mesaj göstermek için benzer bir yöntem kullanabilirsiniz.

1. adım: Düğme durumlarını güncelleyin

Buradaki amaç, düğme durumunu başlangıçta yalnızca Başlat düğmesi etkin olacak şekilde ayarlamaktır. Bu durumda, düğme tıklanabilir olur.

Kullanıcı Başlat'a dokunduktan sonra Durdur düğmesi etkinleşir ve Başlat düğmesi etkinleşmez. Temizle düğmesi yalnızca veritabanında veri olduğunda etkinleştirilir.

  1. fragment_sleep_tracker.xml düzen dosyasını açın.
  2. Her düğmeye android:enabled özelliğini ekleyin. android:enabled özelliği, düğmenin etkin olup olmadığını belirten bir boole değeridir. (Etkin bir düğmeye dokunulabilir, devre dışı bir düğmeye dokunulamaz.) Özelliğe, birazdan tanımlayacağınız bir durum değişkeninin değerini verin.

start_button:

android:enabled="@{sleepTrackerViewModel.startButtonVisible}"

stop_button:

android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"

clear_button:

android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"
  1. SleepTrackerViewModel uygulamasını açın ve üç ilgili değişken oluşturun. Her değişkene, onu test eden bir dönüşüm atayın.
  • tonight, null olduğunda Başlat düğmesi etkinleştirilmelidir.
  • tonight, null olmadığında Durdur düğmesi etkinleştirilmelidir.
  • Temizle düğmesi yalnızca nights ve dolayısıyla veritabanı uyku geceleri içeriyorsa etkinleştirilmelidir.
val startButtonVisible = Transformations.map(tonight) {
   it == null
}
val stopButtonVisible = Transformations.map(tonight) {
   it != null
}
val clearButtonVisible = Transformations.map(nights) {
   it?.isNotEmpty()
}
  1. Uygulamanızı çalıştırın ve düğmelerle denemeler yapın.

2. adım: Kullanıcıyı bilgilendirmek için snackbar kullanın

Kullanıcı veritabanını temizledikten sonra Snackbar widget'ını kullanarak kullanıcıya onay gösterin. Snackbar, ekranın alt kısmındaki bir mesaj aracılığıyla bir işlem hakkında kısa geri bildirim sağlar. Snackbar, zaman aşımından sonra, kullanıcı ekranın başka bir yerinde etkileşimde bulunduktan sonra veya kullanıcı snackbar'ı ekrandan kaydırdıktan sonra kaybolur.

Snackbar'ı göstermek bir kullanıcı arayüzü görevidir ve parçada gerçekleşmelidir. Snackbar'ın gösterilip gösterilmeyeceğine ViewModel içinde karar verilir. Veriler temizlendiğinde bir snackbar ayarlamak ve tetiklemek için gezinmeyi tetiklemeyle aynı tekniği kullanabilirsiniz.

  1. SleepTrackerViewModel içinde kapsüllenmiş etkinliği oluşturun.
private var _showSnackbarEvent = MutableLiveData<Boolean>()

val showSnackBarEvent: LiveData<Boolean>
   get() = _showSnackbarEvent
  1. Ardından doneShowingSnackbar()'yı uygulayın.
fun doneShowingSnackbar() {
   _showSnackbarEvent.value = false
}
  1. SleepTrackerFragment bölümündeki onCreateView() alanına bir gözlemci ekleyin:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })
  1. Gözlemci bloğunun içinde, snackbar'ı gösterin ve etkinliği hemen sıfırlayın.
   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. SleepTrackerViewModel içinde, etkinliği onClear() yöntemiyle tetikleyin. Bunu yapmak için launch bloğunda etkinlik değerini true olarak ayarlayın:
_showSnackbarEvent.value = true
  1. Uygulamanızı oluşturup çalıştırın.

Android Studio projesi: TrackMySleepQualityFinal

Bu uygulamada uyku kalitesi takibini uygulamak, yeni bir tuşta tanıdık bir müzik parçası çalmaya benzer. Ayrıntılar değişse de bu dersteki önceki codelab'lerde yaptığınız işlemlerin temel kalıbı aynı kalır. Bu kalıpların farkında olmak, mevcut uygulamalardaki kodu yeniden kullanabileceğiniz için kodlamayı çok daha hızlı hale getirir. Bu kursta şu ana kadar kullanılan bazı kalıplar şunlardır:

  • ViewModel ve ViewModelFactory oluşturup veri kaynağı ayarlayın.
  • Gezinmeyi tetikleyin. İlgi alanlarını ayırmak için tıklama işleyicisini görünüm modeline, gezinmeyi ise parçaya yerleştirin.
  • Durum değişikliklerini izlemek ve bunlara yanıt vermek için LiveData ile kapsülleme kullanın.
  • Dönüşümleri LiveData ile kullanma
  • Tekil veritabanı oluşturun.
  • Veritabanı işlemleri için eş yordamlar oluşturun.

Gezinmeyi tetikleme

Parçalar arasındaki olası gezinme yollarını bir gezinme dosyasında tanımlarsınız. Bir parçadan diğerine gezinmeyi tetiklemenin birkaç farklı yolu vardır. Bunlardan bazıları:

  • Bir hedef parçaya navigasyonu tetiklemek için onClick işleyicilerini tanımlayın.
  • Alternatif olarak, bir parçadan diğerine gezinmeyi etkinleştirmek için:
  • Gezinmenin gerçekleşip gerçekleşmeyeceğini kaydetmek için bir LiveData değeri tanımlayın.
  • Bu LiveData değerine bir gözlemci ekleyin.
  • Kodunuz daha sonra gezinmenin tetiklenmesi gerektiğinde veya tamamlandığında bu değeri değiştirir.

android:enabled özelliğini ayarlama

  • android:enabled özelliği TextView içinde tanımlanır ve Button dahil olmak üzere tüm alt sınıflar tarafından devralınır.
  • android:enabled özelliği, View özelliğinin etkin olup olmadığını belirler. "Etkin" ifadesinin anlamı alt sınıfa göre değişir. Örneğin, etkinleştirilmeyen bir EditText, kullanıcının içerdiği metni düzenlemesini engeller ve etkinleştirilmeyen bir Button, kullanıcının düğmeye dokunmasını engeller.
  • enabled özelliği, visibility özelliğiyle aynı değil.
  • Dönüşüm haritalarını kullanarak düğmelerin enabled özelliğinin değerini başka bir nesnenin veya değişkenin durumuna göre ayarlayabilirsiniz.

Bu codelab'de ele alınan diğer noktalar:

  • Kullanıcıya bildirim göndermek için gezinmeyi tetiklemek üzere kullandığınız tekniği kullanabilirsiniz.
  • Kullanıcıyı bilgilendirmek için Snackbar kullanabilirsiniz.

Udacity kursu:

Android geliştirici belgeleri:

Bu bölümde, bir eğitmenin yönettiği kurs kapsamında bu codelab'i tamamlayan öğrenciler için olası ödevler listelenmektedir. Eğitmen, aşağıdakileri yapmalıdır:

  • Gerekirse ödev atayın.
  • Öğrencilere ev ödevi ödevlerini nasıl göndereceklerini bildirin.
  • Ödevlere not verin.

Eğitmenler bu önerileri istedikleri kadar kullanabilir ve uygun olduğunu düşündükleri diğer ödevleri verebilirler.

Bu codelab'i kendi başınıza tamamlıyorsanız bilginizi test etmek için bu ödevleri kullanabilirsiniz.

Bu soruları yanıtlayın

1. Soru

Uygulamanızın bir parçadan diğerine gezinmeyi tetiklemesini sağlamanın bir yolu, gezinmenin tetiklenip tetiklenmeyeceğini belirtmek için LiveData değeri kullanmaktır.

Kırmızı parçadan mavi parçaya gezinmeyi tetiklemek için LiveData değerini (gotoBlueFragment olarak adlandırılır) kullanma adımları nelerdir? Geçerli olan tüm seçenekleri işaretleyin:

  • ViewModel bölümünde LiveData değerini gotoBlueFragment olarak tanımlayın.
  • RedFragment bölümünde gotoBlueFragment değerini inceleyin. Uygun olduğunda observe{} kodunu uygulayarak BlueFragment konumuna gidin, ardından gezinme işleminin tamamlandığını belirtmek için gotoBlueFragment değerini sıfırlayın.
  • Kodunuzun, uygulama gotoBlueFragment konumundan RedFragment konumuna gitmesi gerektiğinde gezinmeyi tetikleyen değere BlueFragment değişkenini ayarladığından emin olun.
  • Kodunuzun, kullanıcının BlueFragment'ye gitmek için tıkladığı View için bir onClick işleyicisi tanımladığından emin olun. Burada onClick işleyicisi, goToBlueFragment değerini gözlemler.

Soru 2

LiveData kullanarak bir Button öğesinin etkin (tıklanabilir) olup olmadığını değiştirebilirsiniz. Uygulamanızın UpdateNumber düğmesini şu şekilde değiştirmesini nasıl sağlarsınız:

  • myNumber değeri 5'ten büyükse düğme etkinleştirilir.
  • myNumber değeri 5'e eşit veya 5'ten küçükse düğme etkinleştirilmez.

UpdateNumber düğmesini içeren düzenin, burada gösterildiği gibi NumbersViewModel için <data> değişkenini içerdiğini varsayalım:

<data>
   <variable
       name="NumbersViewModel"
       type="com.example.android.numbersapp.NumbersViewModel" />
</data>

Düzen dosyasındaki düğmenin kimliğinin şu olduğunu varsayalım:

android:id="@+id/update_number_button"

Başka ne yapmanız gerekiyor? Uygun olan tüm seçenekleri işaretleyin.

  • NumbersViewModel sınıfında, sayıyı temsil eden bir LiveData değişkeni, myNumber tanımlayın. Ayrıca, değeri Transform.map() değişkeninde myNumber çağrılarak ayarlanan bir değişken tanımlayın. Bu değişken, sayının 5'ten büyük olup olmadığını belirten bir Boole değeri döndürür.

    Özellikle ViewModel bölümüne aşağıdaki kodu ekleyin:
val myNumber: LiveData<Int>

val enableUpdateNumberButton = Transformations.map(myNumber) {
   myNumber > 5
}
  • XML düzeninde, update_number_button button öğesinin android:enabled özelliğini NumberViewModel.enableUpdateNumbersButton olarak ayarlayın.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
  • NumbersViewModel sınıfını kullanan Fragment içinde, düğmenin enabled özelliğine bir gözlemci ekleyin.

    Özellikle Fragment bölümüne aşağıdaki kodu ekleyin:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
   myNumber > 5
})
  • Düzen dosyasında, update_number_button button öğesinin android:enabled özelliğini "Observable" olarak ayarlayın.

Bir sonraki derse geçin: 7.1 RecyclerView'ın temelleri

Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.