Bu codelab, Android Kotlin Temelleri kursuna dahildir. Codelab'ler üzerinden sırayla çalışıyorsanız bu kurstan en iyi şekilde yararlanabilirsiniz. Tüm kurs codelab'leri Android Kotlin Fundamentals codelabs açılış sayfasında listelenmektedir.
Giriş
Önceki codelab'de, GuessTheWord uygulamasında uygulama yapılandırmasının değişikliklerden kurtulması için bir ViewModel
kullanıyordunuz. Bu codelab'de, LiveData
ürününü ViewModel
sınıflarındaki verilerle nasıl entegre edeceğinizi öğreneceksiniz. Android Architecture Components'tan biri olan LiveData
, temel veritabanı değiştiğinde değişiklikleri bildiren veri nesneleri oluşturmanıza olanak tanır.
LiveData
sınıfını kullanmak için uygulama verilerindeki değişiklikleri gözlemleyen "observers" (örneğin, etkinlikler veya parçalar) oluşturursunuz. LiveData
yaşam döngüsüne duyarlıdır. Bu nedenle, yalnızca etkin yaşam döngüsü durumundaki uygulama bileşeni gözlemcilerini günceller.
Bilmeniz gerekenler
- Kotlin'de temel Android uygulamaları oluşturma.
- Uygulamanızın hedefleri arasında gezinme
- Aktivite ve parça yaşam döngüsü.
- Uygulamanızda
ViewModel
nesneleri nasıl kullanılır? ViewModelProvider.Factory
arayüzü kullanılarakViewModel
nesneleri oluşturma.
Neler öğreneceksiniz?
LiveData
nesnesini yararlı kılan unsurlar.ViewModel
öğesinde depolanan verilereLiveData
nasıl eklenir?MutableLiveData
ne zaman ve nasıl kullanılır?LiveData.
üzerindeki değişiklikleri gözlemlemek için gözlemci yöntemlerini ekleme- Bir destek özelliği kullanarak
LiveData
kapsülleme. - Kullanıcı arayüzü denetleyicisi ile karşılık gelen
ViewModel
arasında iletişim kurma.
Yapacaklarınız
- Kelime ve GuessTheWord uygulamasında puan için
LiveData
kullanın. - Kelime veya puan değiştiğinde dikkat eden gözlemciler ekleyin.
- Değiştirilen değerleri gösteren metin görünümlerini güncelleyin.
- Oyunun tamamlandığı bir etkinlik eklemek için
LiveData
adlı gözlemcinin desenini kullanın. - Tekrar Oyna düğmesini uygulayın.
5. Ders codelab'lerinde ise GuessTheWord uygulamasını, başlangıç koduyla başlayabilirsiniz. GuessTheWord, oyuncuların mümkün olan en yüksek skoru elde etmek için işbirliği yaptığı iki kişilik karalar tarzı bir oyun.
İlk oyuncu uygulamadaki kelimelere bakar ve her birini sırayla uygulamaya koyar, kelimeyi ikinci oyuncuya göstermemeye dikkat eder. İkinci oyuncu kelimeyi tahmin etmeye çalışır.
İlk oyuncu, oyunu oynamak için cihazda uygulamayı açar ve aşağıdaki ekran görüntüsünde bulunan "gitar" gibi bir kelime görür.
İlk oyuncu, kelimeyi bilerek hareket etmemeye dikkat eder.
- İkinci oyuncu kelimeyi doğru tahmin ettiğinde ilk oyuncu Anladım düğmesine basar ve sayıları bir artırır, ardından da gelen kelimeyi gösterir.
- İkinci oyuncu kelimeyi tahmin edemezse ilk oyuncu Atla düğmesine basar, bu şekilde sayı bir azalır ve sonraki kelimeye atlanır.
- Oyunu sonlandırmak için Oyunu Sonlandır düğmesine basın. (Bu işlev, serideki ilk codelab'in başlangıç kodunda yoktur.)
Bu codelab'de, kullanıcı uygulamadaki tüm kelimeleri çevirdiğinde oyunu sonlandırmak için GuessTheWord uygulamasını iyileştirdiniz. Ayrıca, puan parçasına Tekrar Oyna düğmesini ekleyerek kullanıcının oyunu tekrar oynayabilmesini sağlarsınız.
Başlık ekranı |
Oyun ekranı |
Skor ekranı |
Bu görevde bu codelab için başlangıç kodunuzu bulup çalıştırırsınız. Başlangıç kodu olarak önceki codelab'de oluşturduğunuz GuessTheWord uygulamasını kullanabilir veya bir başlangıç uygulaması indirebilirsiniz.
- (İsteğe bağlı) Önceki codelab'den aldığınız kodu kullanmıyorsanız bu codelab için başlangıç kodunu indirin. Kodu arşivden çıkarıp projeyi Android Studio'da açın.
- Uygulamayı çalıştırıp oyunu oynayın.
- Atla düğmesinin sonraki kelimeyi gösterdiğini ve puanı bir oranında azalttığını ve Anladım düğmesinin sonraki kelimeyi gösterdiğini ve puanı bir birim artırdığını unutmayın. Oyunu Sonlandır düğmesi oyunu bitirir.
LiveData
, yaşam döngüsüne duyarlı, gözlemlenebilir bir veri sahibi sınıfıdır. Örneğin, LiveData
ifadesini GuessTheWord uygulamasında geçerli puanın etrafına sarabilirsiniz. Bu codelab'de LiveData
özelliğinin çeşitli özellikleri hakkında bilgi edinirsiniz:
LiveData
gözlemlenebilirdir. Diğer bir deyişle,LiveData
nesnesinin barındırdığı veriler değiştiğinde bir gözlemciye bilgi verilir.LiveData
verileri saklar;LiveData
tüm verilerle kullanılabilen bir sarmalayıcıdırLiveData
yaşam döngüsüne duyarlıdır. Yani yalnızcaSTARTED
veyaRESUMED
gibi etkin bir yaşam döngüsü durumunda olan gözlemcileri günceller.
Bu görevde GameViewModel
öğesindeki mevcut puanı ve geçerli kelime verilerini LiveData
biçimine dönüştürerek herhangi bir veri türünü LiveData
nesnelerine nasıl sarmalayacağınızı öğrenebilirsiniz. Daha sonraki bir görevde, bu LiveData
nesnesine bir gözlemci ekler ve LiveData
öğesinin nasıl gözlemleneceğini öğrenirsiniz.
1. Adım: LiveData'yı kullanmak için skoru ve kelimeyi değiştirin
screens/game
paketinin altındaGameViewModel
dosyasını açın.score
veword
değişkenlerinin türünüMutableLiveData
olarak değiştirin.MutableLiveData
, değeri değiştirilebilir birLiveData
.MutableLiveData
genel bir sınıftır. Bu nedenle, barındırdığı veri türünü belirtmeniz gerekir.
// The current word
val word = MutableLiveData<String>()
// The current score
val score = MutableLiveData<Int>()
GameViewModel
içinde,init
bloğunun içindescore
veword
öğesini başlatın. BirLiveData
değişkeninin değerini değiştirmek için değişkendekisetValue()
yöntemini kullanırsınız. Kotlin'devalue
özelliğini kullanaraksetValue()
numaralı telefonu arayabilirsiniz.
init {
word.value = ""
score.value = 0
...
}
2. Adım: LiveData nesne referansını güncelleyin
score
ve word
değişkenleri artık LiveData
türünde. Bu adımda, value
özelliğini kullanarak bu değişkenlere yapılan referansları değiştirirsiniz.
GameViewModel
ürünündeonSkip()
yönteminde,score
değeriniscore.value
olarak değiştirin.score
ürünününnull
olma olasılığı hakkındaki hataya dikkat edin. Daha sonra bu hatayı düzeltirsiniz.- Hatayı düzeltmek için
onSkip()
konumundakiscore.value
adresinenull
kontrolü ekleyin. Sonra,score
üzerindeminus()
işlevini çağırın. Bu işlev,null
güvenliğiyle çıkarma işlemini gerçekleştirir.
fun onSkip() {
if (!wordList.isEmpty()) {
score.value = (score.value)?.minus(1)
}
nextWord()
}
onCorrect()
yöntemini aynı şekilde güncelleyin:score
değişkenine birnull
kontrolü ekleyin veplus()
işlevini kullanın.
fun onCorrect() {
if (!wordList.isEmpty()) {
score.value = (score.value)?.plus(1)
}
nextWord()
}
GameViewModel
içinde,nextWord()
yönteminin içindekiword
referansınıword
.
value
olarak değiştirin.
private fun nextWord() {
if (!wordList.isEmpty()) {
//Select and remove a word from the list
word.value = wordList.removeAt(0)
}
}
GameFragment
içinde,updateWordText()
yönteminin içindeki referansıviewModel
.word
olarakviewModel
.
word
.
value.
olarak değiştirin
/** Methods for updating the UI **/
private fun updateWordText() {
binding.wordText.text = viewModel.word.value
}
GameFragment
içinde,updateScoreText()
yönteminin içindekiviewModel
.score
referansınıviewModel
.
score
.
value.
olarak değiştirin
private fun updateScoreText() {
binding.scoreText.text = viewModel.score.value.toString()
}
GameFragment
içinde,gameFinished()
yönteminin içindeki referansıviewModel
.score
olarakviewModel
.
score
.
value
olarak değiştirin. Gereklinull
güvenlik kontrolünü ekleyin.
private fun gameFinished() {
Toast.makeText(activity, "Game has just finished", Toast.LENGTH_SHORT).show()
val action = GameFragmentDirections.actionGameToScore()
action.score = viewModel.score.value?:0
NavHostFragment.findNavController(this).navigate(action)
}
- Kodunuzda hata olmadığından emin olun. Uygulamanızı derleyip çalıştırın. Uygulamanın işlevselliği öncekiyle aynı olmalıdır.
Bu görev, puan ve kelime verilerini LiveData
nesnelerine dönüştürdüğünüz önceki görevle yakından ilgilidir. Bu görevde bu LiveData
nesnelerine Observer
nesneleri eklersiniz.
onCreateView()
yöntemindekiGameFragment,
içinde, mevcut puan (viewModel.score
) içinLiveData
nesnesine birObserver
nesnesi ekleyin.observe()
yöntemini kullanın ve kodu,viewModel
ilk kullanıma hazırlandıktan sonra yerleştirin. Kodu basitleştirmek için bir lambda ifadesi kullanın. (lambda ifadesi, bildirilmemiş anonim bir işlevdir, ancak hemen bir ifade olarak aktarılır.)
viewModel.score.observe(this, Observer { newScore ->
})
Observer
referansını çözün. Bunu yapmak için Observer
simgesini tıklayın, Alt+Enter
(Mac'te Option+Enter
) tuşuna basın ve androidx.lifecycle.Observer
içe aktarın.
- Yeni oluşturduğunuz gözlemci, gözlemlenen
LiveData
nesnesinin barındırdığı veriler değiştiğinde bir etkinlik alır. Gözlemcinin içinde,TextView
skorunu yeni puanla güncelleyin.
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- Mevcut kelime
LiveData
nesnesine birObserver
nesnesi ekleyin. Geçerli puanaObserver
nesnesi ekler gibi yapın.
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
score
veya word
değeri değiştiğinde, ekranda görüntülenen score
veya word
artık otomatik olarak güncellenir.
GameFragment
ürünündeupdateWordText()
veupdateScoreText()
yöntemlerini ve bunlara tüm referansları silin. Metin görünümleriLiveData
gözlemci yöntemleri tarafından güncellendiğinden artık buna ihtiyacınız yoktur.- Uygulamanızı çalıştırın. Oyun uygulamanız daha önce olduğu gibi çalışmalıdır ancak artık
LiveData
veLiveData
gözlemcilerini kullanıyor.
Kapsülleme, bazı nesne alanlarına doğrudan erişimi kısıtlamanın bir yoludur. Bir nesneyi kapsüllediğinizde, gizli dahili alanları değiştiren bir dizi herkese açık yöntem görürsünüz. Kapsüllemeyi kullanarak diğer sınıfların bu dahili alanları nasıl işleyeceğini kontrol edebilirsiniz.
Mevcut kodunuzdaki herhangi bir harici sınıf, score
özelliğini (örneğin, viewModel.score.value
kullanarak) değiştirebilir. Bu codelab'de geliştirmekte olduğunuz uygulamada önemli olmayabilir, ancak üretim uygulamasında ViewModel
nesnelerindeki verilerin kontrolüne sahip olmak istersiniz.
Uygulamanızdaki verileri yalnızca ViewModel
düzenlemelidir. Ancak kullanıcı arayüzü denetleyicilerinin verileri okuması gerekir. Böylece veri alanları tamamen gizli olamaz. Uygulamanızın verilerini kapsüllemek için hem MutableLiveData
hem de LiveData
nesnelerini kullanırsınız.
MutableLiveData
- LiveData
:
MutableLiveData
nesnesindeki veriler, adın ima edildiği şekilde değiştirilebilir.ViewModel
içinde, verilerinMutableLiveData
olması için düzenlenebilir olması gerekir.LiveData
nesnesindeki veriler okunabilir, ancak değiştirilemez.ViewModel
dışından veriler okunabilir ancak düzenlenemez olmalıdır. Bu nedenle verilerLiveData
olarak gösterilmelidir.
Bu stratejiyi uygulamak için Kotlin yedek mülkü kullanırsınız. Destek özelliği, tam nesne dışında bir alıcıdan sonuç döndürmenizi sağlar. Bu görevde, GuessTheWord uygulamasında score
ve word
nesneleri için bir yedekleme özelliği uyguluyorsunuz.
Puan ve kelime için bir destek özelliği ekleyin
GameViewModel
içinde, geçerliscore
nesnesiniprivate
yapın.- Yedekleme özelliklerinde kullanılan adlandırma kuralını uygulamak için
score
politikasını_score
olarak değiştirin._score
özelliği artık oyun puanının değiştirilebilir versiyonudur ve dahili olarak kullanılabilecektir. LiveData
türününscore
adlı herkese açık bir sürümünü oluşturun.
// The current score
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
- Başlatma hatası görüntüleniyor. Bu hata,
GameFragment
içindescore
birLiveData
referansı olduğu vescore
artık kendi seter'ına erişemediği için oluşur. Kotlin'deki alıcı ve ayarlar hakkında daha fazla bilgi edinmek için Alıcı ve Ayarlayıcılar bölümüne bakın.
Hatayı çözmek içinGameViewModel
ürünündescore
nesnesininget()
yöntemini geçersiz kılın ve destek özelliği_score
'yı döndürün.
val score: LiveData<Int>
get() = _score
GameViewModel
içinde,score
referansını dahili dahili_score
sürümü olarak değiştirin.
init {
...
_score.value = 0
...
}
...
fun onSkip() {
if (!wordList.isEmpty()) {
_score.value = (score.value)?.minus(1)
}
...
}
fun onCorrect() {
if (!wordList.isEmpty()) {
_score.value = (score.value)?.plus(1)
}
...
}
word
nesnesini_word
nesnesi olarak yeniden adlandırın ve onun için bir destek özelliği ekleyin (score
nesnesinde yaptığınız gibi).
// The current word
private val _word = MutableLiveData<String>()
val word: LiveData<String>
get() = _word
...
init {
_word.value = ""
...
}
...
private fun nextWord() {
if (!wordList.isEmpty()) {
//Select and remove a word from the list
_word.value = wordList.removeAt(0)
}
}
Tebrikler. word
ve score
LiveData
nesnesini kapsüllediniz.
Kullanıcı Oyunu Sonlandır düğmesine dokunduğunda, geçerli uygulamanız puan ekranına gider. Ayrıca, oyuncular tüm kelimeleri çevirdiğinde uygulamanın puan ekranına gitmesini de istersiniz. Oyuncular son kelimeyi kullanarak bitirdikten sonra, kullanıcının düğmeye dokunmasına gerek kalmadan oyunun otomatik olarak sona ermesini istersiniz.
Bu işlevi uygulamak için tüm kelimeler gösterildiğinde bir etkinliğin tetiklenmesi ve ViewModel
bölümünden parçaya iletilmesi gerekir. Bunu yapmak için LiveData
gözlemleyici kalıbını kullanarak oyunda tamamlanan bir etkinliği modellemelisiniz.
Gözlemci kalıbı
Observer deseni bir yazılım tasarımı kalıbıdır. Nesneler arasındaki iletişimi belirtir: gözlemlenebilir ("gözlem &konusu") ve gözlemler. Gözlemlenebilir bir durum, gözlemleyicileri durumlarındaki değişiklikler hakkında bilgilendirir.
Bu uygulamada LiveData
örneğinde, gözlemlenebilir (konu) LiveData
nesnesidir ve gözlemleyiciler de kullanıcı arayüzü denetleyicilerindeki parçalar gibi yöntemlerdir. LiveData
içinde sarmalanan veriler her değiştiğinde durum değişikliği gerçekleşir. LiveData
sınıfları, ViewModel
ile parça arasında iletişim kurma açısından çok önemlidir.
1. Adım: Oyun bitmiş etkinliği algılamak için LiveData'yı kullanma
Bu görevde oyunun tamamlandığı bir etkinliği modellemek için LiveData
gözlemleyici desenini kullanırsınız.
GameViewModel
ürününde_eventGameFinish
adlı birBoolean
MutableLiveData
nesnesi oluşturun. Bu nesne, oyun sona eren etkinliği bekleyecektir._eventGameFinish
nesnesini başlattıktan sonraeventGameFinish
adlı bir yedekleme özelliği başlatın ve başlatın.
// Event which triggers the end of the game
private val _eventGameFinish = MutableLiveData<Boolean>()
val eventGameFinish: LiveData<Boolean>
get() = _eventGameFinish
GameViewModel
içinde bironGameFinish()
yöntemi ekleyin. Bu yöntemde, oyun bitmişeventGameFinish
etkinliğinitrue
olarak ayarlayın.
/** Method for the game completed event **/
fun onGameFinish() {
_eventGameFinish.value = true
}
GameViewModel
listesinde, kelime yönteminin boş olduğu durumlardanextWord()
yönteminde oyunu sonlandırın.
private fun nextWord() {
if (wordList.isEmpty()) {
onGameFinish()
} else {
//Select and remove a _word from the list
_word.value = wordList.removeAt(0)
}
}
GameFragment
içinde,onCreateView()
içinde,viewModel
başlatıldıktan sonraeventGameFinish
için bir gözlemleyici ekleyin.observe()
yöntemini kullanın. Lambda işlevinin içindegameFinished()
yöntemini çağırın.
// Observer for the Game finished event
viewModel.eventGameFinish.observe(this, Observer<Boolean> { hasFinished ->
if (hasFinished) gameFinished()
})
- Uygulamanızı çalıştırın, oyunu oynayın ve tüm kelimeleri gözden geçirin. Siz Oyunu Sonlandır'a dokunana kadar uygulama, oyun parçasında kalmak yerine otomatik olarak puan ekranına gider.
Kelime listesi boş olduktan sonraeventGameFinish
ayarlanır, oyun parçasındaki ilişkili gözlemci yöntemi çağrılır ve uygulama, ekran parçasına gider. - Eklediğiniz kodda yaşam döngüsü sorunu oluştu. Sorunu anlamak için
GameFragment
sınıfındakigameFinished()
kodunda gezinme kodunu yorumlayın.Toast
mesajını yöntemde sakladığınızdan emin olun.
private fun gameFinished() {
Toast.makeText(activity, "Game has just finished", Toast.LENGTH_SHORT).show()
// val action = GameFragmentDirections.actionGameToScore()
// action.score = viewModel.score.value?:0
// NavHostFragment.findNavController(this).navigate(action)
}
- Uygulamanızı çalıştırın, oyunu oynayın ve tüm kelimeleri gözden geçirin. Oyun ekranının alt kısmında kısa süreliğine "Oyun bitti" yazan bir kısa mesaj görünür. Bu, beklenen davranıştır.
Şimdi cihazı veya emülatörü döndürün. Kadeh tekrar görüntülenir! Cihazı birkaç kez daha döndürün, muhtemelen her seferinde kademesi görürsünüz. Bu bir hatadır çünkü kısa oyun oyun sona erdiğinde yalnızca bir kez gösterilir. Ekmek, parça her yeniden oluşturulduğunda görüntülenmemelidir. Bu sorunu bir sonraki görevde çözeceksiniz.
2. Adım: Oyun bitmiş etkinliği sıfırlayın
LiveData
, gözlemcilere genellikle yalnızca veri değiştiğinde güncelleme gönderir. Bu davranışın istisnası, gözlemlenen kullanıcının etkin olmama durumu yerine etkin duruma geçmesiyle ilgili güncellemeler alır.
Bu nedenle, oyunda tamamlanan kadeh kaldırma işlemi uygulamanızda tekrar tekrar tetiklenir. Oyun parçası, ekran döndürmeden sonra yeniden oluşturulduğunda etkin değil durumundan etkin durumuna geçer. Parçadaki gözlemci, mevcut ViewModel
öğesine yeniden bağlanır ve geçerli verileri alır. gameFinished()
yöntemi yeniden tetiklenir ve kısa ileti gösterilir.
Bu görevde bu sorunu düzeltip kadehin yalnızca bir kez gösterilmesi için GameViewModel
içindeki eventGameFinish
işaretini sıfırlayın.
GameViewModel
oyununda_eventGameFinish
adlı oyunun bitmiş etkinliğini sıfırlamak için bironGameFinishComplete()
yöntemi ekleyin.
/** Method for the game completed event **/
fun onGameFinishComplete() {
_eventGameFinish.value = false
}
GameFragment
içinde,gameFinished()
öğesinin sonunda,viewModel
nesnesindeonGameFinishComplete()
çağrısı yapın. (gameFinished()
içindeki gezinme kodunu şimdilik yorum olarak bırakın.)
private fun gameFinished() {
...
viewModel.onGameFinishComplete()
}
- Uygulamayı çalıştırıp oyunu oynayın. Tüm kelimeleri gözden geçirip cihazın ekran yönünü değiştirin. Durum mesajı yalnızca bir kez görüntülenir.
GameFragment
içinde,gameFinished()
yönteminin içindeki gezinme kodunun açıklamasını kaldırın.
Android Studio'da yorumunu kaldırmak için yorum yapılan satırları seçin veControl+/
tuşuna (Mac'teCommand+/
) basın.
private fun gameFinished() {
Toast.makeText(activity, "Game has just finished", Toast.LENGTH_SHORT).show()
val action = GameFragmentDirections.actionGameToScore()
action.score = viewModel.score.value?:0
findNavController(this).navigate(action)
viewModel.onGameFinishComplete()
}
Android Studio tarafından istenirse androidx.navigation.fragment.NavHostFragment.findNavController
içe aktarın.
- Uygulamayı çalıştırıp oyunu oynayın. Tüm kelimeleri inceledikten sonra, uygulamanın nihai puan ekranına otomatik olarak gittiğinden emin olun.
Mükemmel! Uygulamanız, kelime listesinin boş olduğunu GameViewModel
bölümünden oyun parçasına bildirmek amacıyla oyun bitmiş bir etkinliği tetiklemek için LiveData
özelliğini kullanır. Daha sonra, oyun parçası puan parçasına gider.
Bu görevde puanı ScoreViewModel
içinde bir LiveData
nesnesi olarak değiştirir ve nesneye gözlemci eklersiniz. Bu görev, GameViewModel
klasörüne LiveData
eklediğinizde yaptığınız işleme benzer.
Bu değişiklikleri eksiksiz olması için ScoreViewModel
üzerinde yapıyorsunuz. Böylece uygulamanızdaki tüm veriler LiveData
özelliğini kullanır.
ScoreViewModel
içindescore
değişken türünüMutableLiveData
olarak değiştirin. Bunu, kural olarak_score
olarak yeniden adlandırıp bir destek özelliği ekleyin.
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _score
ScoreViewModel
içinde,init
bloğunun içinde_score
simgesini başlatın.init
blokundaki günlüğü istediğiniz gibi kaldırabilir veya bırakabilirsiniz.
init {
_score.value = finalScore
}
ScoreFragment
içinde,onCreateView()
içinde,viewModel
öğesini başlattıktan sonraLiveData
puanı için bir gözlemci ekleyin. Lambda ifadesinin içinde, puan değerini puan metni görünümüne ayarlayın. Puan değeriyle metin görünümünü doğrudan atayan koduViewModel
öğesinden kaldırın.
Eklenecek kod:
// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
Kaldırılacak kod:
binding.scoreText.text = viewModel.score.toString()
Android Studio tarafından istendiğinde androidx.lifecycle.Observer
içe aktarın.
- Uygulamanızı çalıştırıp oynayın. Uygulama daha önce olduğu gibi çalışıyor ancak şimdi skoru güncellemek için
LiveData
ve bir gözlemci kullanıyor.
Bu görevde puan ekranına Tekrar Oynat düğmesi ekler ve LiveData
etkinliği kullanarak tıklama işleyicisini uygularsınız. Düğme, puan ekranından oyun ekranına gitmek için bir etkinliği tetikler.
Uygulamanın başlangıç kodu Tekrar Oyna düğmesini içerir, ancak düğme gizlidir.
res/layout/score_fragment.xml
ürünündeplay_again_button
düğmesi içinvisibility
özelliğinin değerinivisible
olarak değiştirin.
<Button
android:id="@+id/play_again_button"
...
android:visibility="visible"
/>
ScoreViewModel
içinde,_eventPlayAgain
adlı birBoolean
tutmak için birLiveData
nesnesi ekleyin. Bu nesne, puan ekranından oyun ekranına gitmek içinLiveData
etkinliğini kaydetmek için kullanılır.
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgain
ScoreViewModel
ürününde_eventPlayAgain
etkinliğini ayarlama ve sıfırlama yöntemlerini tanımlayın.
fun onPlayAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}
ScoreFragment
içineventPlayAgain
için bir gözlemci ekleyin. Kodu,onCreateView()
ifadesinden sonra,return
ifadesinin önüne koyun. Lambda ifadesinde oyun ekranına geri dönüpeventPlayAgain
öğesini sıfırlayın.
// Navigates back to game when button is pressed
viewModel.eventPlayAgain.observe(this, Observer { playAgain ->
if (playAgain) {
findNavController().navigate(ScoreFragmentDirections.actionRestart())
viewModel.onPlayAgainComplete()
}
})
Android Studio tarafından istendiğinde androidx.navigation.fragment.findNavController
içe aktarın.
ScoreFragment
içinde,onCreateView()
içinde, PlayAgain düğmesine bir tıklama dinleyici ekleyin veviewModel
.onPlayAgain()
işlevini arayın.
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }
- Uygulamanızı çalıştırıp oynayın. Oyun sona erdiğinde, puan ekranında son puanı ve Tekrar Oyna düğmesini görürsünüz. PlayAgain düğmesine dokunduktan sonra uygulama tekrar oynayabilmek için oyun ekranına gider.
Harika! Uygulamanızın mimarisini LiveData
ViewModel
içindeki nesneleri kullanacak şekilde değiştirdiniz ve gözlemcileri LiveData
nesnelerine eklediniz. LiveData
LiveData
tarafından tutulan değer değiştiğinde, gözlemleyici nesnelerini bilgilendirir.
Android Studio projesi: GuessTheWord
LiveData
LiveData
, Android Mimari Bileşenleri'nden biri olan ve yaşam döngüsüne duyarlı bir gözlemlenebilir veri sahibi sınıfıdır.- Veriler güncellendiğinde kullanıcı arayüzünün otomatik olarak güncellenmesini sağlamak için
LiveData
kullanabilirsiniz. LiveData
gözlemlenebilirdir. Bu,LiveData
nesnesinin barındırdığı veriler değiştiğinde bir etkinlik veya parça gibi bir gözlemcinin bilgilendirilebileceği anlamına gelir.LiveData
verileri saklar. Tüm verilerle kullanılabilen bir sarmalayıcıdır.LiveData
yaşam döngüsüne duyarlıdır. Yani yalnızcaSTARTED
veyaRESUMED
gibi etkin bir yaşam döngüsü durumunda olan gözlemcileri günceller.
LiveData eklemek için
ViewModel
içindeki veri değişkenlerinin türünüLiveData
veyaMutableLiveData
olarak değiştirin.
MutableLiveData
, değeri değiştirilebilen bir LiveData
nesnesidir. MutableLiveData
genel bir sınıftır. Bu nedenle, barındırdığı veri türünü belirtmeniz gerekir.
LiveData
tarafından tutulan verilerin değerini değiştirmek içinLiveData
değişkenindesetValue()
yöntemini kullanın.
LiveData'yı kapsama
ViewModel
içindekiLiveData
düzenlenebilir olmalıdır.ViewModel
dışındaLiveData
okunaklı olmalıdır. Bu durum bir Kotlin yedek mülkü kullanılarak uygulanabilir.- Kotlin yedekleme özelliği, alıcıdan tam nesne dışındaki bir şeyi döndürmenizi sağlar.
LiveData
öğesini kapsüllemek içinViewModel
içindeprivate
MutableLiveData
kullanın veViewModel
dışında birLiveData
destek mülkü döndürün.
Gözlemlenebilir Canlı Veriler
LiveData
bir gözlemleyici kalıbını izler. "Gözlemlenebilir"LiveData
nesnesidir ve gözlemciler, kullanıcı arayüzü denetleyicilerindeki parçalar gibi yöntemlerdir.LiveData
içinde sarmalanan veriler her değiştiğinde kullanıcı arayüzü denetleyicilerindeki gözlemci yöntemleri bilgilendirilir.LiveData
öğesini gözlemlenebilir hale getirmek içinobserve()
yöntemini kullanarak gözlemcilerdekiLiveData
referansına (etkinlikler ve parçalar gibi) bir gözlemleyici nesnesi ekleyin.- Bu
LiveData
gözlemleyici deseni,ViewModel
aracılığıyla kullanıcı arayüzü denetleyicilerine iletişim kurmak için kullanılabilir.
Udacity kursu:
Android geliştirici dokümanları:
Diğer:
- Kotlin'de mülk
Bu bölümde, bir eğitmen tarafından sunulan kurs kapsamında bu codelab üzerinden çalışan öğrenciler için olası ev ödevi ödevleri listelenmektedir. Öğretmenin şunları yapması gerekir:
- Gerekirse ev ödevini atayın.
- Öğrencilere ev ödevlerinin nasıl gönderileceğini bildirin.
- Ev ödevlerine not verin.
Öğretmenler bu önerileri istedikleri kadar kullanabilir veya uygun görebilir ve uygun olan diğer ev ödevlerini atayabilirler.
Bu codelab'de kendiniz çalışıyorsanız, bilginizi test etmek için bu ödevlerden yararlanabilirsiniz.
Bu soruları yanıtlayın
1. Soru
Harici nesnelerin verileri güncelleyemeden okuyabilmesi için bir ViewModel
içinde depolanan LiveData
öğesini nasıl kapsül edersiniz?
ViewModel
nesnesinin içinde verilerin veri türünüprivate
LiveData
olarak değiştirin.MutableLiveData
türündeki salt okunur verileri göstermek için bir yedekleme özelliği kullanın.ViewModel
nesnesinin içinde verilerin veri türünüprivate
MutableLiveData
olarak değiştirin.LiveData
türündeki salt okunur verileri göstermek için bir yedekleme özelliği kullanın.- Kullanıcı arayüzü denetleyicisinde, verilerin veri türünü
private
MutableLiveData
olarak değiştirin.LiveData
türündeki salt okunur verileri göstermek için bir yedekleme özelliği kullanın. ViewModel
nesnesinin içinde verilerin veri türünüLiveData
olarak değiştirin.LiveData
türündeki salt okunur verileri göstermek için bir yedekleme özelliği kullanın.
2. Soru
Kullanıcı arayüzü denetleyicisi aşağıdaki durumlardan hangisindeyse LiveData
bir kullanıcı arayüzü denetleyicisini (bir parça gibi) günceller?
- Devam ettirdi
- Arka planda
- Duraklatıldı
- Durduruldu
3. Soru
LiveData
gözlemleyici deseninde gözlemlenebilir öğe nedir (gözlemlenen)?
- Gözlemci yöntemi
LiveData
nesnesindeki veriler- Kullanıcı arayüzü denetleyicisi
ViewModel
nesnesi
Sonraki dersi başlatma:
Bu kurstaki diğer codelab'lerin bağlantılarına ulaşmak için Android Kotlin Fundamentals codelabs açılış sayfasına göz atın.