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
- 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.root
değ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.
SleepTrackerViewModel
adlı kişiyi aç. Kullanıcı Durdur düğmesine dokunduğunda uygulamanınSleepQualityFragment
sayfasına giderek kalite derecelendirmesi toplamasını sağlamak için gezinme işlevi eklemeniz gerekir.SleepTrackerViewModel
içinde, uygulamanınSleepQualityFragment
sayfasına gitmesini istediğinizde değişen birLiveData
oluş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() = _navigateToSleepQuality
doneNavigating()
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 _navigateToSleepQuality
değişkenini,launch{}
bloğunun içindeki son şey olarak ayarlayın. Bu değişkeninnight
olarak ayarlandığını unutmayın. Bu değişken bir değere sahip olduğunda uygulama, geceyi de ileterekSleepQualityFragment
konumuna gider.
_navigateToSleepQuality.value = oldNight
- Uygulamanın ne zaman gezinmesi gerektiğini bilmesi için
SleepTrackerFragment
, _navigateToSleepQuality
değerini gözlemlemelidir.SleepTrackerFragment
bölümündekionCreateView()
alanınanavigateToSleepQuality()
için bir gözlemci ekleyin. Bunun için içe aktarma işleminin belirsiz olduğunu veandroidx.lifecycle.Observer
iç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.findNavController
iç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
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
sleepquality
paketinde SleepQualityViewModel.kt dosyasını oluşturun veya açın.SleepQualityViewModel
ve veritabanını bağımsız değişken olarak alan birsleepNightKey
sınıfı oluşturun.SleepTrackerViewModel
için yaptığınız gibi, fabrikadandatabase
değerini iletmeniz gerekir. Ayrıca gezinme işlemindensleepNightKey
değerini de iletmeniz gerekir.
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}
SleepQualityViewModel
sınıfındaJob
veuiScope
tanı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.navigateToSleepTracker
vedoneNavigating()
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:
uiScope
içinde bir coroutine başlatın ve I/O dispatcher'a geçin.sleepNightKey
kullanaraktonight
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
}
}
sleepquality
paketindeSleepQualityViewModelFactory.kt
oluşturun veya açın ve aşağıdaki resimde gösterildiği gibiSleepQualityViewModelFactory
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
SleepQualityFragment.kt
adlı kişiyi aç.onCreateView()
'daapplication
aldıktan sonra navigasyonla birlikte gelenarguments
'yi almanız gerekir. Bu bağımsız değişkenlerSleepQualityFragmentArgs
içinde yer alır. Bu dosyaları paketten çıkarmanız gerekir.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
- Ardından
dataSource
hattına binin.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
dataSource
vesleepNightKey
değerlerini ileterek bir fabrika oluşturun.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
ViewModel
referansı 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.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
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>
- 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.xml
dü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}"
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()
}
- 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.
SleepTrackerViewModel
iç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
}
SleepTrackerFragment
bö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()
}
SleepTrackerViewModel
içinde, etkinliğionClear()
yöntemiyle tetikleyin. Bunu yapmak içinlaunch
bloğunda etkinlik değerinitrue
olarak 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:
ViewModel
veViewModelFactory
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ğiTextView
içinde tanımlanır veButton
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 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
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ündeLiveData
değerinigotoBlueFragment
olarak tanımlayın.RedFragment
bölümündegotoBlueFragment
değerini inceleyin. Uygun olduğundaobserve{}
kodunu uygulayarakBlueFragment
konumuna gidin, ardından gezinme işleminin tamamlandığını belirtmek içingotoBlueFragment
değerini sıfırlayın.- Kodunuzun, uygulama
gotoBlueFragment
konumundanRedFragment
konumuna gitmesi gerektiğinde gezinmeyi tetikleyen değereBlueFragment
değişkenini ayarladığından emin olun. - Kodunuzun, kullanıcının
BlueFragment
'ye gitmek için tıkladığıView
için bironClick
işleyicisi tanımladığından emin olun. BuradaonClick
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 birLiveData
değişkeni,myNumber
tanı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.
ÖzellikleViewModel
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
öğesininandroid:enabled
özelliğiniNumberViewModel.enableUpdateNumbersButton
olarak ayarlayın.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
NumbersViewModel
sınıfını kullananFragment
içinde, düğmeninenabled
özelliğine bir gözlemci ekleyin.
ÖzellikleFragment
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
öğ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.