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
safeArgskullanma. - Modelleri, model fabrikalarını, dönüşümleri ve
LiveDataile gözlemcilerini görüntüleyin. Roomveritabanı 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
LiveDatanası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
LiveDatakı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
LiveDatagö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
- Başlamak için son codelab'in sonundaki kendi kodunuzla devam edin veya başlangıç kodunu indirin.
- Başlangıç kodunuzda
SleepQualityFragmentöğesini inceleyin. Bu sınıf, düzeni genişletir, uygulamayı alır vebinding.rootdeğerini döndürür. - Tasarım düzenleyicide navigation.xml dosyasını açın.
SleepTrackerFragment'danSleepQualityFragment'ye ve tekrarSleepQualityFragment'denSleepTrackerFragment'ya bir gezinme yolu olduğunu görürsünüz.
- navigation.xml dosyasının kodunu inceleyin. Özellikle
<argument>adlısleepNightKeyöğesini arayın.
KullanıcıSleepTrackerFragment'danSleepQualityFragment,'a geçtiğinde uygulama, güncellenmesi gereken gece içinsleepNightKey'yiSleepQualityFragment'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.
SleepTrackerViewModeladlı kişiyi aç. Kullanıcı Durdur düğmesine dokunduğunda uygulamanınSleepQualityFragmentsayfasına giderek kalite derecelendirmesi toplamasını sağlamak için gezinme işlevi eklemeniz gerekir.SleepTrackerViewModeliçinde, uygulamanınSleepQualityFragmentsayfasına gitmesini istediğinizde değişen birLiveDataoluşturun. Kapsülleme kullanarakLiveDataöğ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() = _navigateToSleepQualitydoneNavigating()işlevi ekleyin. Bu işlev, gezinmeyi tetikleyen değişkeni sıfırlar.
fun doneNavigating() {
_navigateToSleepQuality.value = null
}- Durdur düğmesinin tıklama işleyicisinde
onStopTracking(),SleepQualityFragment'e gitme işlemini tetikleyin. İşlevin sonundaki _navigateToSleepQualitydeğişkenini,launch{}bloğunun içindeki son şey olarak ayarlayın. Bu değişkeninnightolarak ayarlandığını unutmayın. Bu değişken bir değere sahip olduğunda uygulama, geceyi de ileterekSleepQualityFragmentkonumuna gider.
_navigateToSleepQuality.value = oldNight- Uygulamanın ne zaman gezinmesi gerektiğini bilmesi için
SleepTrackerFragment, _navigateToSleepQualitydeğerini gözlemlemelidir.SleepTrackerFragmentbölümündekionCreateView()alanınanavigateToSleepQuality()için bir gözlemci ekleyin. Bunun için içe aktarma işleminin belirsiz olduğunu veandroidx.lifecycle.Observeriçe aktarmanız gerektiğini unutmayın.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})
- 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 belirsizseandroidx.navigation.fragment.findNavControlleriçe aktarın.
night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
sleepTrackerViewModel.doneNavigating()
}- Uygulamanızı oluşturup çalıştırın. Başlat'a ve ardından Durdur'a dokunun. Bu işlem sizi
SleepQualityFragmentekranı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
sleepqualitypaketinde SleepQualityViewModel.kt dosyasını oluşturun veya açın.SleepQualityViewModelve veritabanını bağımsız değişken olarak alan birsleepNightKeysınıfı oluşturun.SleepTrackerViewModeliçin yaptığınız gibi, fabrikadandatabasedeğerini iletmeniz gerekir. Ayrıca gezinme işlemindensleepNightKeydeğerini de iletmeniz gerekir.
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}SleepQualityViewModelsınıfındaJobveuiScopetanımlayın veonCleared()'yi geçersiz kılın.
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}- Yukarıdakiyle aynı kalıbı kullanarak
SleepTrackerFragment'ya geri dönmek için_navigateToSleepTracker'ı bildirin.navigateToSleepTrackervedoneNavigating()işaretlemelerini uygulayın.
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()
val navigateToSleepTracker: LiveData<Boolean?>
get() = _navigateToSleepTracker
fun doneNavigating() {
_navigateToSleepTracker.value = null
}- 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:
uiScopeiçinde bir coroutine başlatın ve I/O dispatcher'a geçin.sleepNightKeykullanaraktonightelde 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
}
}sleepqualitypaketindeSleepQualityViewModelFactory.ktoluşturun veya açın ve aşağıdaki resimde gösterildiği gibiSleepQualityViewModelFactorysı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
SleepQualityFragment.ktadlı kişiyi aç.onCreateView()'daapplicationaldıktan sonra navigasyonla birlikte gelenarguments'yi almanız gerekir. Bu bağımsız değişkenlerSleepQualityFragmentArgsiçinde yer alır. Bu dosyaları paketten çıkarmanız gerekir.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)- Ardından
dataSourcehattına binin.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDaodataSourcevesleepNightKeydeğerlerini ileterek bir fabrika oluşturun.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)ViewModelreferansı alın.
val sleepQualityViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepQualityViewModel::class.java)- 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- Gözlemciyi ekleyin. İstendiğinde
androidx.lifecycle.Observerdosyası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
fragment_sleep_quality.xmldüzen dosyasını açın.<data>bloğuna,SleepQualityViewModeliçin bir değişken ekleyin.
<data>
<variable
name="sleepQualityViewModel"
type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
</data>- 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)}"- 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.
fragment_sleep_tracker.xmldüzen dosyasını açın.- 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}"SleepTrackerViewModeluygulamasını açın ve üç ilgili değişken oluşturun. Her değişkene, onu test eden bir dönüşüm atayın.
tonight,nullolduğunda Başlat düğmesi etkinleştirilmelidir.tonight,nullolmadığında Durdur düğmesi etkinleştirilmelidir.- Temizle düğmesi yalnızca
nightsve 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()
}- 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.
SleepTrackerViewModeliçinde kapsüllenmiş etkinliği oluşturun.
private var _showSnackbarEvent = MutableLiveData<Boolean>()
val showSnackBarEvent: LiveData<Boolean>
get() = _showSnackbarEvent- Ardından
doneShowingSnackbar()'yı uygulayın.
fun doneShowingSnackbar() {
_showSnackbarEvent.value = false
}SleepTrackerFragmentbölümündekionCreateView()alanına bir gözlemci ekleyin:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })- 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()
}SleepTrackerViewModeliçinde, etkinliğionClear()yöntemiyle tetikleyin. Bunu yapmak içinlaunchbloğunda etkinlik değerinitrueolarak ayarlayın:
_showSnackbarEvent.value = true- 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:
ViewModelveViewModelFactoryoluş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
LiveDataile kapsülleme kullanın. - Dönüşümleri
LiveDataile 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
onClickiş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
LiveDatadeğeri tanımlayın. - Bu
LiveDatadeğ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ğiTextViewiçinde tanımlanır veButtondahil 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 birEditText, kullanıcının içerdiği metni düzenlemesini engeller ve etkinleştirilmeyen birButton, 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
Snackbarkullanabilirsiniz.
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:
ViewModelbölümündeLiveDatadeğerinigotoBlueFragmentolarak tanımlayın.RedFragmentbölümündegotoBlueFragmentdeğerini inceleyin. Uygun olduğundaobserve{}kodunu uygulayarakBlueFragmentkonumuna gidin, ardından gezinme işleminin tamamlandığını belirtmek içingotoBlueFragmentdeğerini sıfırlayın.- Kodunuzun, uygulama
gotoBlueFragmentkonumundanRedFragmentkonumuna gitmesi gerektiğinde gezinmeyi tetikleyen değereBlueFragmentdeğişkenini ayarladığından emin olun. - Kodunuzun, kullanıcının
BlueFragment'ye gitmek için tıkladığıViewiçin bironClickişleyicisi tanımladığından emin olun. BuradaonClickişleyicisi,goToBlueFragmentdeğ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:
myNumberdeğeri 5'ten büyükse düğme etkinleştirilir.myNumberdeğ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.
NumbersViewModelsınıfında, sayıyı temsil eden birLiveDatadeğişkeni,myNumbertanımlayın. Ayrıca, değeriTransform.map()değişkenindemyNumberç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.
ÖzellikleViewModelbö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öğesininandroid:enabledözelliğiniNumberViewModel.enableUpdateNumbersButtonolarak ayarlayın.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"NumbersViewModelsınıfını kullananFragmentiçinde, düğmeninenabledözelliğine bir gözlemci ekleyin.
ÖzellikleFragmentbö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öğesininandroid:enabledözelliğini"Observable"olarak ayarlayın.
Bir sonraki derse geçin:
Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.