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ş
Önceki codelab'de, GuessTheWord uygulamasının verilerinin cihaz yapılandırması değişikliklerinden etkilenmemesi için uygulamada ViewModel kullandınız. Bu codelab'de LiveData ile ViewModel sınıflarındaki verileri nasıl entegre edeceğinizi öğreneceksiniz. Android Mimari Bileşenleri'nden biri olan LiveData, temel veritabanı değiştiğinde görünümleri bilgilendiren veri nesneleri oluşturmanıza olanak tanır.
LiveData sınıfını kullanmak için uygulamanın verilerindeki değişiklikleri gözlemleyen "gözlemciler" (ör. etkinlikler veya parçalar) oluşturursunuz. LiveData yaşam döngüsünün farkındadı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
- Etkinlik ve parça yaşam döngüsü.
- Uygulamanızda
ViewModelnesnelerini kullanma ViewModelProvider.Factoryarayüzünü kullanarakViewModelnesneleri oluşturma
Neler öğreneceksiniz?
LiveDatanesneleri faydalı kılan özellikler.LiveDataöğesiniViewModeliçinde depolanan verilere eklemeMutableLiveDatane zaman ve nasıl kullanılır?LiveData.içindeki değişiklikleri gözlemlemek için gözlemci yöntemleri ekleme- Destekleyici özellik kullanarak
LiveDatanasıl kapsüllenir? - Bir kullanıcı arayüzü denetleyicisi ile karşılık gelen
ViewModelarasında nasıl iletişim kurulur?
Yapacaklarınız
- GuessTheWord uygulamasında kelime ve puan için
LiveDatakullanın. - Kelime veya puan değiştiğinde bunu fark eden gözlemciler ekleyin.
- Değişen değerleri gösteren metin görünümlerini güncelleyin.
- Oyunun bitmesi etkinliği eklemek için
LiveDatagözlemci kalıbını kullanın. - Tekrar Oynat düğmesini uygulayın.
5. dersteki codelab'lerde, başlangıç koduyla başlayarak GuessTheWord uygulamasını geliştirirsiniz. GuessTheWord, iki oyuncunun mümkün olan en yüksek puanı elde etmek için işbirliği yaptığı, sessiz sinema tarzı bir oyundur.
Birinci oyuncu, uygulamadaki kelimelere bakar ve her birini sırayla canlandırır. Kelimeyi ikinci oyuncuya göstermemeye dikkat eder. İkinci oyuncu kelimeyi tahmin etmeye çalışır.
Oyunu oynamak için ilk oyuncu cihazda uygulamayı açar ve aşağıdaki ekran görüntüsünde gösterildiği gibi bir kelime (ör. "gitar") görür.
İlk oyuncu, kelimeyi söylememeye dikkat ederek kelimeyi canlandırır.
- İkinci oyuncu kelimeyi doğru tahmin ettiğinde birinci oyuncu Bildim düğmesine basar. Bu işlem, sayıyı bir artırır ve sonraki kelimeyi gösterir.
- İkinci oyuncu kelimeyi tahmin edemezse birinci oyuncu Atla düğmesine basar. Bu durumda sayı bir azalır ve bir sonraki kelimeye geçilir.
- Oyunu sonlandırmak için End Game (Oyunu Sonlandır) düğmesine basın. (Bu işlev, serideki ilk codelab'in başlangıç kodunda yer almaz.)
Bu codelab'de, kullanıcı uygulamadaki tüm kelimeleri tamamladığında oyunu bitirecek bir etkinlik ekleyerek GuessTheWord uygulamasını geliştiriyorsunuz. Ayrıca, kullanıcıların oyunu tekrar oynayabilmesi için puan fragment'ına Tekrar Oyna düğmesi ekliyorsunuz.
Başlık ekranı |
Oyun ekranı |
Puan ekranı |
Bu görevde, bu codelab için başlangıç kodunuzu bulup çalıştıracaksı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'deki kodunuzu kullanmıyorsanız bu codelab'in başlangıç kodunu indirin. Kodu açın ve projeyi Android Studio'da açın.
- Uygulamayı çalıştırın ve oyunu oynayın.
- Atla düğmesinin sonraki kelimeyi gösterdiğini ve puanı bir azalttığını, Anladım düğmesinin ise sonraki kelimeyi gösterdiğini ve puanı bir artırdığını unutmayın. Oyunu Bitir düğmesi oyunu sonlandırır.
LiveData, yaşam döngüsünün farkında olan, gözlemlenebilir bir veri tutucu sınıfıdır. Örneğin, KelimeyiTahminEt uygulamasında mevcut puanın etrafına LiveData sarmalayabilirsiniz. Bu codelab'de LiveData ile ilgili çeşitli özellikleri öğreneceksiniz:
LiveDatagözlemlenebilir. Bu,LiveDatanesnesi tarafından tutulan veriler değiştiğinde bir gözlemciye bildirim gönderildiği anlamına gelir.LiveDataverileri tutar;LiveData, herhangi bir veriyle kullanılabilen bir sarmalayıcıdır.LiveData, yaşam döngüsünün farkındadır. Yani yalnızcaSTARTEDveyaRESUMEDgibi etkin bir yaşam döngüsü durumundaki gözlemcileri günceller.
Bu görevde, LiveData içindeki mevcut puan ve mevcut kelime verilerini GameViewModel öğesine dönüştürerek herhangi bir veri türünü LiveData içine nasıl sarmalayacağınızı öğreneceksiniz. Daha sonraki bir görevde, bu LiveData nesnelerine bir gözlemci ekleyecek ve LiveData nasıl gözlemleyeceğinizi öğreneceksiniz.
1. adım: LiveData'yı kullanmak için puanı ve kelimeyi değiştirin
screens/gamepaketi altındaGameViewModeldosyasını açın.scoreveworddeğişkenlerinin türünüMutableLiveDataolarak değiştirin.MutableLiveData, değeri değiştirilebilen birLiveData'dir.MutableLiveDatagenel bir sınıftır. Bu nedenle, tuttuğu veri türünü belirtmeniz gerekir.
// The current word
val word = MutableLiveData<String>()
// The current score
val score = MutableLiveData<Int>()GameViewModeliçinde,initbloğundascoreveworddeğerlerini başlatın.LiveDatadeğişkeninin değerini değiştirmek için değişkendesetValue()yöntemini kullanırsınız. Kotlin'desetValue()özelliğini kullanarakvalueişlevini çağırabilirsiniz.
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ündedir. Bu adımda, value özelliğini kullanarak bu değişkenlere yapılan referansları değiştirirsiniz.
GameViewModeliçinde,onSkip()yöntemindescoredeğeriniscore.valueolarak değiştirin.scoreöğesininnullolabileceğiyle ilgili hataya dikkat edin. Bu hatayı düzeltmeniz gerekir.- Hatayı düzeltmek için
onSkip()içindescore.value'yenullişareti ekleyin. Ardından,scoreüzerindeminus()işlevini çağırın. Bu işlev,null-güvenliği ile çı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:scoredeğişkenine birnullkontrolü ekleyin veplus()işlevini kullanın.
fun onCorrect() {
if (!wordList.isEmpty()) {
score.value = (score.value)?.plus(1)
}
nextWord()
}GameViewModeliçinde,nextWord()yöntemindewordreferansınıword.valueolarak değiştirin.
private fun nextWord() {
if (!wordList.isEmpty()) {
//Select and remove a word from the list
word.value = wordList.removeAt(0)
}
}GameFragmentiçinde,updateWordText()yöntemindeviewModel.wordreferansınıviewModel.word.value.olarak değiştirin.
/** Methods for updating the UI **/
private fun updateWordText() {
binding.wordText.text = viewModel.word.value
}GameFragmentiçinde,updateScoreText()yönteminde,viewModel.scorereferansınıviewModel.score.value.olarak değiştirin.
private fun updateScoreText() {
binding.scoreText.text = viewModel.score.value.toString()
}GameFragmentiçinde,gameFinished()yöntemindeviewModel.scorereferansınıviewModel.score.valueolarak değiştirin. Gereklinullgü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ı derleyin ve ç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 ilişkilidir. Bu görevde, Observer nesnelerini LiveData nesnelerine ekleyeceksiniz.
GameFragment,içinde,onCreateView()yönteminde, geçerli skor içinObservernesnesiniLiveDatanesnesine ekleyin,viewModel.score.observe()yöntemini kullanın ve koduviewModelbaşlatıldıktan sonra yerleştirin. Kodu basitleştirmek için lambda ifadesi kullanın. (Lambda ifadesi, bildirilmemiş ancak hemen ifade olarak iletilen anonim bir işlevdir.)
viewModel.score.observe(this, Observer { newScore ->
})Observer referansını çözün. Bunu yapmak için Observer simgesini tıklayın, Alt+Enter tuşuna basın (Mac'te Option+Enter) ve androidx.lifecycle.Observer simgesini içe aktarın.
- Yeni oluşturduğunuz gözlemci, gözlemlenen
LiveDatanesnesinin tuttuğu veriler değiştiğinde bir etkinlik alır. Gözlemcinin içinde, puanıTextViewyeni puanla güncelleyin.
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})Observernesnesini geçerliLiveDatanesnesine ekleyin.Observernesnesini geçerli puana eklediğiniz şekilde ekleyin.
/** 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österilen score veya word değeri artık otomatik olarak güncellenir.
GameFragmentiçindeupdateWordText()veupdateScoreText()yöntemlerini ve bunlara yapılan tüm referansları silin. Metin görünümleriLiveDatagözlemci yöntemleriyle güncellendiğinden artık bunlara ihtiyacınız yok.- Uygulamanızı çalıştırın. Oyun uygulamanız eskisi gibi çalışmaya devam eder ancak artık
LiveDataveLiveDatagözlemcilerini kullanır.
Kapsülleme, bir nesnenin bazı alanlarına doğrudan erişimi kısıtlamanın bir yoludur. Bir nesneyi kapsüllediğinizde, özel dahili alanları değiştiren bir dizi herkese açık yöntem kullanıma sunulur. Kapsülleme sayesinde, diğer sınıfların bu dahili alanları nasıl işleyeceğini kontrol edebilirsiniz.
Mevcut kodunuzda, herhangi bir harici sınıf score ve word değişkenlerini value özelliğini kullanarak (ör. viewModel.score.value kullanarak) değiştirebilir. Bu kod laboratuvarında geliştirdiğiniz uygulamada bu durum önemli olmayabilir ancak bir üretim uygulamasında ViewModel nesnelerindeki veriler üzerinde kontrol sahibi olmak istersiniz.
Uygulamanızdaki verileri yalnızca ViewModel düzenlemelidir. Ancak kullanıcı arayüzü denetleyicilerinin verileri okuması gerektiğinden veri alanları tamamen özel olamaz. Uygulamanızın verilerini kapsüllemek için hem MutableLiveData hem de LiveData nesnelerini kullanırsınız.
MutableLiveData - LiveData:
MutableLiveDatanesnesindeki veriler, adından da anlaşılacağı gibi değiştirilebilir.ViewModeliçinde veriler düzenlenebilir olmalıdır. Bu nedenleMutableLiveDatakullanılır.LiveDatanesnesindeki veriler okunabilir ancak değiştirilemez.ViewModeldışından gelen veriler okunabilir ancak düzenlenemez olmalıdır. Bu nedenle, verilerLiveDataolarak sunulmalıdır.
Bu stratejiyi uygulamak için Kotlin backing property'sini kullanırsınız. Destekleyici özellik, tam nesne dışında bir alıcıdan bir şey döndürmenize olanak tanır. Bu görevde, GuessTheWord uygulamasındaki score ve word nesneleri için bir destekleyici özellik uygulayacaksınız.
Puan ve kelimeye destekleyici özellik ekleme
GameViewModeliçinde, mevcutscorenesnesiniprivateyapın.- Destekleyici özelliklerde kullanılan adlandırma kuralına uymak için
scoresimgesini_scoreolarak değiştirin._scoreözelliği artık dahili olarak kullanılacak, değiştirilebilir oyun puanı sürümüdür. LiveDatatürününscoreadlı herkese açık bir sürümünü oluşturun.
// The current score
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>- İlk kullanıma hazırlama hatası görüyorsanız. Bu hatanın nedeni,
GameFragmentiçindescoreöğesininLiveDatareferansı olması vescoreöğesinin artık ayarlayıcısına erişememesidir. Kotlin'deki getter ve setter'lar hakkında daha fazla bilgi edinmek için Getter'lar ve Setter'lar başlıklı makaleyi inceleyin.
Hatayı düzeltmek içinGameViewModeliçindekiscorenesnesininget()yöntemini geçersiz kılın ve destekleyici özelliği (_score) döndürün.
val score: LiveData<Int>
get() = _scoreGameViewModeliçinde,scorereferanslarını dahili değiştirilebilir sürümü olan_scoreile 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)
}
...
}wordnesnesini_wordolarak yeniden adlandırın vescorenesnesinde yaptığınız gibi bu nesne için bir destekleyici özellik ekleyin.
// 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, LiveData nesnelerini word ve score kapsüllediniz.
Mevcut uygulamanızda kullanıcı Oyunu Bitir düğmesine dokunduğunda skor ekranına gidiliyor. Ayrıca, oyuncular tüm kelimeleri tamamladığında uygulamanın puan ekranına gitmesini istiyorsunuz. Oyuncular son kelimeyi tamamladıktan sonra oyunun otomatik olarak sona ermesini istiyorsunuz. Böylece kullanıcının düğmeye dokunması gerekmez.
Bu işlevselliği uygulamak için tüm kelimeler gösterildiğinde ViewModel tarafından tetiklenen ve parçaya iletilen bir etkinlik gerekir. Bunu yapmak için LiveData observer kalıbını kullanarak oyunun bitmesi etkinliğini modellendirirsiniz.
Gözlemci modeli
Gözlemci kalıbı, bir yazılım tasarım kalıbıdır. Nesneler arasındaki iletişimi belirtir: gözlemlenebilir (gözlemin "öznesi") ve gözlemciler. Gözlemlenebilir, durumundaki değişiklikler hakkında gözlemcileri bilgilendiren bir nesnedir.

Bu uygulamadaki LiveData örneğinde, gözlemlenebilir (özne) LiveData nesnesidir ve gözlemciler, kullanıcı arayüzü denetleyicilerindeki (ör. parçalar) yöntemlerdir. LiveData içinde sarmalanmış veriler her değiştiğinde durum değişikliği gerçekleşir. LiveData sınıfları, ViewModel ile fragment arasında iletişim kurmak için çok önemlidir.
1. adım: Maçın bitmesi etkinliğini algılamak için LiveData'yı kullanın
Bu görevde, oyunun bitmesi etkinliğini modellemek için LiveData gözlemci kalıbını kullanıyorsunuz.
GameViewModeliçinde_eventGameFinishadlı birBooleanMutableLiveDatanesnesi oluşturun. Bu nesne, biten maç etkinliğini barındırır._eventGameFinishnesnesini başlattıktan sonraeventGameFinishadlı bir destekleyici özellik oluşturup başlatın.
// Event which triggers the end of the game
private val _eventGameFinish = MutableLiveData<Boolean>()
val eventGameFinish: LiveData<Boolean>
get() = _eventGameFinishGameViewModelbölümünde bironGameFinish()yöntemi ekleyin. Yöntemde, oyunun bitiş etkinliği olaneventGameFinish'yitrueolarak ayarlayın.
/** Method for the game completed event **/
fun onGameFinish() {
_eventGameFinish.value = true
}GameViewModeliçinde,nextWord()yönteminde kelime listesi boşsa 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)
}
}GameFragmentiçinde,onCreateView()içinde,viewModelbaşlatıldıktan sonraeventGameFinish'ye bir gözlemci 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 inceleyin. Uygulama, Oyunu Bitir'e dokunana kadar oyun parçasında kalmak yerine otomatik olarak skor ekranına gider.
Kelime listesi boşaldıktan sonraeventGameFinishayarlanır, oyun parçasındaki ilişkili gözlemci yöntemi çağrılır ve uygulama ekran parçasına gider. - Eklediğiniz kod, yaşam döngüsü sorunu oluşturuyor. Sorunu anlamak için
GameFragmentsınıfında,gameFinished()yöntemindeki gezinme kodunu yorum satırı yapın.Toastmesajını yöntemde tuttuğunuzdan 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 inceleyin. Oyun ekranının alt kısmında kısa süreliğine "Oyun yeni bitti" yazan bir kısa mesaj bildirimi gösterilir. Bu, beklenen bir davranıştır.
Şimdi cihazı veya emülatörü döndürün. Bildirim tekrar gösterilir. Cihazı birkaç kez daha döndürdüğünüzde, bildirim büyük olasılıkla her seferinde gösterilir. Bu bir hatadır. Çünkü pop-up, yalnızca oyun bittiğinde bir kez gösterilmelidir. Toast, parça her yeniden oluşturulduğunda gösterilmemelidir. Bu sorunu bir sonraki görevde çözeceksiniz.
|
|
2. adım: Tamamlanan oyun etkinliğini sıfırlayın
LiveData, genellikle yalnızca veriler değiştiğinde gözlemcilere güncellemeler gönderir. Bu davranışın istisnası, gözlemcinin etkin olmayan durumdan etkin duruma geçmesi durumunda gözlemcilerin de güncellemeleri almasıdır.
Bu nedenle, uygulamanızda oyunun tamamlandığına dair bildirim tekrar tekrar tetikleniyor. Oyun parçası, ekran döndürüldükten sonra yeniden oluşturulduğunda etkin olmayan durumdan etkin duruma geçiyor. Parçadaki gözlemci, mevcut ViewModel öğesine yeniden bağlanır ve mevcut verileri alır. gameFinished() yöntemi yeniden tetiklenir ve kısa mesaj gösterilir.
Bu görevde, GameViewModel içinde eventGameFinish işaretini sıfırlayarak bu sorunu düzeltip pop-up'ı yalnızca bir kez gösteriyorsunuz.
GameViewModeliçinde, oyunun bitiş etkinliğini sıfırlamak içinonGameFinishComplete()yöntemi ekleyin_eventGameFinish.
/** Method for the game completed event **/
fun onGameFinishComplete() {
_eventGameFinish.value = false
}GameFragmentiçinde,gameFinished()sonundaviewModelnesnesindeonGameFinishComplete()işlevini çağırın. (Şimdilik gezinme kodunugameFinished()yorum satırı olarak bırakın.)
private fun gameFinished() {
...
viewModel.onGameFinishComplete()
}- Uygulamayı çalıştırın ve oyunu oynayın. Tüm kelimeleri okuyun, ardından cihazın ekran yönünü değiştirin. Bildirim yalnızca bir kez gösterilir.
GameFragmentiçinde,gameFinished()yönteminde gezinme kodunun yorumunu kaldırın.
Android Studio'da yorumu kaldırmak için yorum satırlarını seçipControl+/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ın ve oyunu oynayın. Tüm kelimeleri tamamladıktan sonra uygulamanın otomatik olarak nihai puan ekranına yönlendirdiğinden emin olun.
|
|
Mükemmel! Uygulamanız, kelime listesinin boş olduğunu GameViewModel'den oyun parçasına iletmek için LiveData kullanarak oyunun bittiği etkinliğini tetikliyor. Oyun parçası daha sonra puan parçasına gider.
Bu görevde, ScoreViewModel içinde puanı LiveData nesnesine değiştirip gözlemci ekleyeceksiniz. Bu görev, LiveData öğesini GameViewModel öğesine eklerken yaptığınız işleme benzer.
Bu değişiklikleri, uygulamanızdaki tüm verilerin LiveData kullanması için ScoreViewModel'da eksiksiz olarak yaparsınız.
ScoreViewModelbölümünde,scoredeğişken türünüMutableLiveDataolarak değiştirin._scoreolarak yeniden adlandırın ve destekleyici bir özellik ekleyin.
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _scoreScoreViewModeliçinde,initbloğunda_scoreöğesini başlatın. İstediğiniz zamaninitbloğundaki girişi kaldırabilir veya girişten çıkabilirsiniz.
init {
_score.value = finalScore
}ScoreFragmentiçinde,onCreateView()içinde,viewModelbaşlatıldıktan sonraLiveDatapuan nesnesi için bir gözlemci ekleyin. Lambda ifadesinin içinde puan değerini puan metni görünümüne ayarlayın. Metin görünümünü doğrudan puan değeriyle 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 dosyasını içe aktarın.
- Uygulamanızı çalıştırın ve oyunu oynayın. Uygulama eskisi gibi çalışmaya devam eder ancak artık puanı güncellemek için
LiveDatave bir gözlemci kullanır.
Bu görevde, skor ekranına bir Tekrar Oyna düğmesi ekleyip LiveData etkinliğini kullanarak tıklama işleyicisini uygulayacaksınız. Düğme, puan ekranından oyun ekranına gitmek için bir etkinliği tetikler.
Uygulamanın başlangıç kodunda Tekrar Oyna düğmesi bulunur ancak bu düğme gizlidir.
res/layout/score_fragment.xmlbölümündekiplay_again_buttondüğmesi içinvisibilityözelliğinin değerinivisibleolarak değiştirin.
<Button
android:id="@+id/play_again_button"
...
android:visibility="visible"
/>ScoreViewModeliçinde,_eventPlayAgainadlı birBooleantutacakLiveDatanesnesi ekleyin. Bu nesne, skor ekranından oyun ekranına gitmek içinLiveDataetkinliğini kaydetmek üzere kullanılır.
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgainScoreViewModeliçinde, etkinliği ayarlama ve sıfırlama yöntemlerini tanımlayın (_eventPlayAgain).
fun onPlayAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}ScoreFragmentiçindeeventPlayAgainiçin bir gözlemci ekleyin. KoduonCreateView()ifadesinin sonuna,returnifadesinden önce yerleştirin. Lambda ifadesinin içinde oyun ekranına geri dönün veeventPlayAgaindeğerini 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.
ScoreFragmentiçinde,onCreateView()içinde PlayAgain düğmesine bir tıklama dinleyicisi ekleyin veviewModel.onPlayAgain()işlevini çağırın.
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }- Uygulamanızı çalıştırın ve oyunu oynayın. Oyun bittiğinde skor ekranında son skor ve Tekrar Oyna düğmesi gösterilir. PlayAgain düğmesine dokunduğunuzda uygulama, oyunu tekrar oynayabilmeniz için oyun ekranına yönlendirir.

Tebrikler! Uygulamanızın mimarisini LiveData nesnelerini ViewModel içinde kullanacak şekilde değiştirdiniz ve LiveData nesnelerine gözlemciler eklediniz. LiveData, LiveData tarafından tutulan değer değiştiğinde gözlemci nesneleri bilgilendirir.
Android Studio projesi: GuessTheWord
LiveData
LiveData, yaşam döngüsünün farkında olan, gözlemlenebilir bir veri tutucu sınıfıdır ve Android Architecture Components'ın bir parçasıdır.- Veriler güncellendiğinde kullanıcı arayüzünüzün otomatik olarak güncellenmesini sağlamak için
LiveDatakullanabilirsiniz. LiveDatagözlemlenebilir. Bu, etkinlik veya parça gibi bir gözlemcinin,LiveDatanesnesi tarafından tutulan veriler değiştiğinde bilgilendirilebileceği anlamına gelir.LiveData, verileri tutar ve herhangi bir veriyle kullanılabilen bir sarmalayıcıdır.LiveData, yaşam döngüsünün farkındadır. Yani yalnızcaSTARTEDveyaRESUMEDgibi etkin bir yaşam döngüsü durumundaki gözlemcileri günceller.
LiveData eklemek için
ViewModeliçindeki veri değişkenlerinin türünüLiveDataveyaMutableLiveDataolarak değiştirin.
MutableLiveData, değeri değiştirilebilen bir LiveData nesnesidir. MutableLiveData genel bir sınıftır. Bu nedenle, tuttuğu veri türünü belirtmeniz gerekir.
LiveDatatarafından tutulan verilerin değerini değiştirmek içinLiveDatadeğişkenindesetValue()yöntemini kullanın.
LiveData'yı kapsüllemek için
ViewModeliçindekiLiveDatadüzenlenebilir olmalıdır.ViewModeldışındaLiveDataokunabilir olmalıdır. Bu, Kotlin backing property kullanılarak uygulanabilir.- Kotlin destekleyici özelliği, getter'dan tam nesne dışında bir şey döndürmenize olanak tanır.
LiveDataöğesini kapsüllemek içinViewModeliçindeprivateMutableLiveDataöğesini kullanın veViewModeldışında birLiveDatadestek özelliği döndürün.
Observable LiveData
LiveData, gözlemci kalıbını izler. "Gözlemlenebilir" olanLiveDatanesnesidir ve gözlemciler, kullanıcı arayüzü denetleyicilerindeki (ör. parçalar) yöntemlerdir.LiveDataiçine yerleştirilmiş 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özlemcilerdeki (etkinlikler ve parçalar gibi)LiveDatareferansına bir gözlemci nesnesi ekleyin.- Bu
LiveDatagözlemci deseni,ViewModelile kullanıcı arayüzü denetleyicileri arasında iletişim kurmak için kullanılabilir.
Udacity kursu:
Android geliştirici belgeleri:
Diğer:
- Kotlin'de backing property
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
LiveData verilerini ViewModel içinde nasıl kapsarsınız? Böylece harici nesneler, verileri güncelleyemeden okuyabilir.
ViewModelnesnesinde, verilerin veri türünüprivateLiveDataolarak değiştirin.MutableLiveDatatüründeki salt okunur verileri göstermek için bir destekleyici özellik kullanın.ViewModelnesnesinde, verilerin veri türünüprivateMutableLiveDataolarak değiştirin.LiveDatatüründeki salt okunur verileri göstermek için bir destekleyici özellik kullanın.- Kullanıcı arayüzü denetleyicisinde verilerin veri türünü
privateMutableLiveDataolarak değiştirin.LiveDatatüründeki salt okunur verileri göstermek için bir destekleyici özellik kullanın. ViewModelnesnesinin içinde, verilerin veri türünüLiveDataolarak değiştirin.LiveDatatüründeki salt okunur verileri göstermek için bir destekleyici özellik kullanın.
2. Soru
LiveData, kullanıcı arayüzü denetleyicisi aşağıdaki durumlardan hangisindeyse kullanıcı arayüzü denetleyicisini (ör. bir parça) günceller?
- Devam ettirildi
- Arka planda
- Duraklatıldı
- Durduruldu
3. Soru
LiveData gözlemci kalıbında, gözlemlenebilir öğe (gözlemlenen öğe) nedir?
- Gözlemci yöntemi
LiveDatanesnesindeki veriler- Kullanıcı arayüzü denetleyicisi
ViewModelnesnesi
Bir sonraki derse başlayın:
Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.




