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
ViewModel
nesnelerini kullanma ViewModelProvider.Factory
arayüzünü kullanarakViewModel
nesneleri oluşturma
Neler öğreneceksiniz?
LiveData
nesneleri faydalı kılan özellikler.LiveData
öğesiniViewModel
içinde depolanan verilere eklemeMutableLiveData
ne 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
LiveData
nasıl kapsüllenir? - Bir kullanıcı arayüzü denetleyicisi ile karşılık gelen
ViewModel
arasında nasıl iletişim kurulur?
Yapacaklarınız
- GuessTheWord uygulamasında kelime ve puan için
LiveData
kullanı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
LiveData
gö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:
LiveData
gözlemlenebilir. Bu,LiveData
nesnesi tarafından tutulan veriler değiştiğinde bir gözlemciye bildirim gönderildiği anlamına gelir.LiveData
verileri 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ızcaSTARTED
veyaRESUMED
gibi 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/game
paketi altındaGameViewModel
dosyasını açın.score
veword
değişkenlerinin türünüMutableLiveData
olarak değiştirin.MutableLiveData
, değeri değiştirilebilen birLiveData
'dir.MutableLiveData
genel 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>()
GameViewModel
içinde,init
bloğundascore
veword
değerlerini başlatın.LiveData
değişkeninin değerini değiştirmek için değişkendesetValue()
yöntemini kullanırsınız. Kotlin'desetValue()
özelliğini kullanarakvalue
iş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.
GameViewModel
içinde,onSkip()
yöntemindescore
değeriniscore.value
olarak değiştirin.score
öğesininnull
olabileceğiyle ilgili hataya dikkat edin. Bu hatayı düzeltmeniz gerekir.- Hatayı düzeltmek için
onSkip()
içindescore.value
'yenull
iş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: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öntemindeword
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öntemindeviewModel
.word
referansınıviewModel
.
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önteminde,viewModel
.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öntemindeviewModel
.score
referansınıviewModel
.
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ı 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çinObserver
nesnesiniLiveData
nesnesine ekleyin,viewModel.score
.observe()
yöntemini kullanın ve koduviewModel
baş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
LiveData
nesnesinin tuttuğu veriler değiştiğinde bir etkinlik alır. Gözlemcinin içinde, puanıTextView
yeni puanla güncelleyin.
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
Observer
nesnesini geçerliLiveData
nesnesine ekleyin.Observer
nesnesini 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.
GameFragment
içindeupdateWordText()
veupdateScoreText()
yöntemlerini ve bunlara yapılan tüm referansları silin. Metin görünümleriLiveData
gö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
LiveData
veLiveData
gö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
:
MutableLiveData
nesnesindeki veriler, adından da anlaşılacağı gibi değiştirilebilir.ViewModel
içinde veriler düzenlenebilir olmalıdır. Bu nedenleMutableLiveData
kullanılır.LiveData
nesnesindeki veriler okunabilir ancak değiştirilemez.ViewModel
dışından gelen veriler okunabilir ancak düzenlenemez olmalıdır. Bu nedenle, verilerLiveData
olarak 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
GameViewModel
içinde, mevcutscore
nesnesiniprivate
yapın.- Destekleyici özelliklerde kullanılan adlandırma kuralına uymak için
score
simgesini_score
olarak değiştirin._score
özelliği artık dahili olarak kullanılacak, değiştirilebilir oyun puanı sürümüdür. 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>
- İlk kullanıma hazırlama hatası görüyorsanız. Bu hatanın nedeni,
GameFragment
içindescore
öğesininLiveData
referansı 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çinGameViewModel
içindekiscore
nesnesininget()
yöntemini geçersiz kılın ve destekleyici özelliği (_score
) döndürün.
val score: LiveData<Int>
get() = _score
GameViewModel
içinde,score
referanslarını dahili değiştirilebilir sürümü olan_score
ile 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
olarak yeniden adlandırın vescore
nesnesinde 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.
GameViewModel
içinde_eventGameFinish
adlı birBoolean
MutableLiveData
nesnesi oluşturun. Bu nesne, biten maç etkinliğini barındırır._eventGameFinish
nesnesini başlattıktan sonraeventGameFinish
adlı 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() = _eventGameFinish
GameViewModel
bölümünde bironGameFinish()
yöntemi ekleyin. Yöntemde, oyunun bitiş etkinliği olaneventGameFinish
'yitrue
olarak ayarlayın.
/** Method for the game completed event **/
fun onGameFinish() {
_eventGameFinish.value = true
}
GameViewModel
iç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)
}
}
GameFragment
içinde,onCreateView()
içinde,viewModel
baş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 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 kod, yaşam döngüsü sorunu oluşturuyor. Sorunu anlamak için
GameFragment
sınıfında,gameFinished()
yöntemindeki gezinme kodunu yorum satırı yapın.Toast
mesajı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.
GameViewModel
iç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
}
GameFragment
içinde,gameFinished()
sonundaviewModel
nesnesindeonGameFinishComplete()
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.
GameFragment
iç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.
ScoreViewModel
bölümünde,score
değişken türünüMutableLiveData
olarak değiştirin._score
olarak yeniden adlandırın ve destekleyici bir özellik ekleyin.
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _score
ScoreViewModel
içinde,init
bloğunda_score
öğesini başlatın. İstediğiniz zamaninit
bloğundaki girişi kaldırabilir veya girişten çıkabilirsiniz.
init {
_score.value = finalScore
}
ScoreFragment
içinde,onCreateView()
içinde,viewModel
başlatıldıktan sonraLiveData
puan 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
LiveData
ve 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.xml
bölümündekiplay_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
tutacakLiveData
nesnesi ekleyin. Bu nesne, skor ekranından oyun ekranına gitmek içinLiveData
etkinliğini kaydetmek üzere kullanılır.
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgain
ScoreViewModel
içinde, etkinliği ayarlama ve sıfırlama yöntemlerini tanımlayın (_eventPlayAgain
).
fun onPlayAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}
ScoreFragment
içindeeventPlayAgain
için bir gözlemci ekleyin. KoduonCreateView()
ifadesinin sonuna,return
ifadesinden önce yerleştirin. Lambda ifadesinin içinde oyun ekranına geri dönün veeventPlayAgain
değ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.
ScoreFragment
iç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
LiveData
kullanabilirsiniz. LiveData
gözlemlenebilir. Bu, etkinlik veya parça gibi bir gözlemcinin,LiveData
nesnesi 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ızcaSTARTED
veyaRESUMED
gibi etkin bir yaşam döngüsü durumundaki 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, tuttuğu 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ı kapsüllemek için
ViewModel
içindekiLiveData
düzenlenebilir olmalıdır.ViewModel
dışındaLiveData
okunabilir 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çinViewModel
içindeprivate
MutableLiveData
öğesini kullanın veViewModel
dışında birLiveData
destek özelliği döndürün.
Observable LiveData
LiveData
, gözlemci kalıbını izler. "Gözlemlenebilir" olanLiveData
nesnesidir ve gözlemciler, kullanıcı arayüzü denetleyicilerindeki (ör. parçalar) yöntemlerdir.LiveData
iç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)LiveData
referansına bir gözlemci nesnesi ekleyin.- Bu
LiveData
gözlemci deseni,ViewModel
ile 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.
ViewModel
nesnesinde, verilerin veri türünüprivate
LiveData
olarak değiştirin.MutableLiveData
türündeki salt okunur verileri göstermek için bir destekleyici özellik kullanın.ViewModel
nesnesinde, verilerin veri türünüprivate
MutableLiveData
olarak değiştirin.LiveData
türündeki salt okunur verileri göstermek için bir destekleyici özellik 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 destekleyici özellik 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 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
LiveData
nesnesindeki veriler- Kullanıcı arayüzü denetleyicisi
ViewModel
nesnesi
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.