本程式碼研究室是 Android Kotlin 基礎課程的一部分。使用程式碼研究室逐步完成程式碼課程後,您將能充分發揮本課程的潛能。所有課程程式碼研究室清單均列於 Android Kotlin 基礎程式碼研究室到達網頁。
引言
在先前的程式碼研究室中,您使用了 GuessTheWord 應用程式中的 ViewModel
,允許該應用程式的資料在裝置設定變更後繼續有效。在這個程式碼研究室中,您將瞭解如何整合 LiveData
與 ViewModel
類別中的資料。LiveData
是 Android 架構元件之一,可讓您建立資料物件,以便在基礎資料庫變更時通知視圖。
如要使用 LiveData
類別,您必須設定「觀察伺服器」(例如活動或片段),以便觀察應用程式資料的變更。LiveData
可辨識生命週期,因此只會更新處於有效生命週期狀態的應用程式元件觀察器。
須知事項
- 如何在 Kotlin 中建立基本 Android 應用程式。
- 如何瀏覽您應用程式的目的地。
- 活動和片段生命週期。
- 如何在您的應用程式中使用
ViewModel
物件。 - 如何使用
ViewModelProvider.Factory
介面建立ViewModel
物件。
課程內容
LiveData
物件的實用之處。- 如何將
LiveData
新增至儲存在ViewModel
中的資料。 - 使用
MutableLiveData
的時機和方式。 - 如何新增觀察器方法以觀察
LiveData.
中的變化。 - 如何使用備用屬性來封裝
LiveData
。 - 如何在使用者介面控制器與對應的
ViewModel
之間進行通訊。
執行步驟
- 使用
LiveData
做為 GuessTheWord 應用程式的字詞和分數。 - 新增觀察器,以便在出現特定字詞或分數變化時通知他們。
- 更新顯示變更值的文字檢視模式。
- 使用
LiveData
觀測器模式新增完成遊戲完成的事件。 - 實作 [再次播放] 按鈕。
在第 5 課的程式碼研究室中,您開發了 GuessTheWord 應用程式,從入門程式碼開始著手。GuessTheWord 是一款雙人「角色」風格的遊戲,玩家透過協作的方式取得最高分。
第一位玩家會查看應用程式中的字詞,並逐一執行每個動作,這樣使用者就不會看到這個單字。第二位玩家會嘗試猜測字詞。
如要玩遊戲,第一位玩家會在裝置上開啟應用程式,然後看到「吉他」這個字詞,如下方的螢幕截圖所示。
第一個玩家會說出字詞,請小心不要實際說出這個字。
- 當第二位玩家正確猜出字時,第一位玩家按下 [我知道了] 按鈕,這會增加一個數字,並顯示下一個字詞。
- 如果第二名玩家猜到字詞,第一個玩家按下 [略過] 按鈕可將音量減少 1,直接跳到下一個字詞。
- 如要結束遊戲,請按下 [結束遊戲] 按鈕。(該系列中第一個程式碼研究室的範例程式碼並未加入這項功能)。
在這個程式碼研究室中,您可以新增事件,以便在使用者循環播放應用程式中的所有字詞時結束遊戲,同時改善 GuessTheWord 應用程式。您也可以在分數片段中加入 [再玩一次] 按鈕,讓使用者可以再玩一次遊戲。
標題畫面 |
遊戲畫面 |
分數畫面 |
在這項工作中,您會找到並執行這個程式碼研究室的範例程式碼。您可以使用在舊版程式碼研究室中建立的 GuessTheWord 應用程式做為範例程式碼,也可以下載入門應用程式。
- (選用) 如果您並未使用前一個程式碼研究室提供的程式碼,請下載這個程式碼研究室的範例程式碼。將程式碼解壓縮,然後在 Android Studio 中開啟專案。
- 執行應用程式並玩遊戲。
- 請注意,[略過] 按鈕可顯示下一個字詞並減少 1 個分數;「我知道了」按鈕則顯示下一個字詞並增加 1 個分數。[結束遊戲] 按鈕可結束遊戲。
LiveData
是一個可觀測的資料持有者級別,可感知生命週期。例如,您可以在 GuessTheWord 應用程式中將目前分數圍繞 LiveData
。在這個程式碼研究室中,您將會瞭解 LiveData
的多項特性:
LiveData
可觀察,這表示當LiveData
物件保存的資料變更時,觀察器會接收通知。LiveData
可保存資料;LiveData
包裝函式可與任何資料搭配使用LiveData
具有生命週期偵測功能,也就是說,系統只會更新處於有效生命週期狀態的觀測器,例如STARTED
或RESUMED
。
在這項工作中,您會瞭解如何將 GameViewModel
中目前的分數與目前字詞資料轉換為 LiveData
,藉此將任何資料類型納入 LiveData
物件中。在後續工作中,您將觀察器新增至這些 LiveData
物件,並學習如何觀察 LiveData
。
步驟 1:變更分數和字詞以使用 LiveData
- 開啟
screens/game
套件下方的GameViewModel
檔案。 - 將變數
score
和word
的類型變更為MutableLiveData
。MutableLiveData
是LiveData
,可以變更其值。MutableLiveData
是一般類別,因此您必須指定其所屬的資料類型。
// The current word
val word = MutableLiveData<String>()
// The current score
val score = MutableLiveData<Int>()
- 在
GameViewModel
中的init
區塊中,初始化score
和word
。如要變更LiveData
變數的值,您可以在變數中使用setValue()
方法。在 Kotlin 中,您可以使用value
屬性呼叫setValue()
。
init {
word.value = ""
score.value = 0
...
}
步驟 2:更新 LiveData 物件參考資料
score
和 word
變數現在屬於 LiveData
類型。在這個步驟中,您將使用 value
屬性來變更這些變數的參照。
- 在
GameViewModel
的onSkip()
方法中,將score
變更為score.value
。請注意,score
可能是null
的錯誤。接下來,請修正這項錯誤。 - 如要解決這項錯誤,請在
onSkip()
的score.value
中新增null
檢查。接著,請在score
上呼叫minus()
函式。這個函式可執行null
-safety 進行減去。
fun onSkip() {
if (!wordList.isEmpty()) {
score.value = (score.value)?.minus(1)
}
nextWord()
}
- 以相同方式更新
onCorrect()
方法:在score
變數中加入null
檢查,並使用plus()
函式。
fun onCorrect() {
if (!wordList.isEmpty()) {
score.value = (score.value)?.plus(1)
}
nextWord()
}
- 在
GameViewModel
中,在nextWord()
方法中,將word
參照變更為word
.
value
。
private fun nextWord() {
if (!wordList.isEmpty()) {
//Select and remove a word from the list
word.value = wordList.removeAt(0)
}
}
- 在
GameFragment
中,在updateWordText()
方法中,將參照變更為viewModel
.word
變更為viewModel
.
word
.
value.
/** Methods for updating the UI **/
private fun updateWordText() {
binding.wordText.text = viewModel.word.value
}
- 在
GameFragment
中,在updateScoreText()
方法中,將參照變更為viewModel
.score
變更為viewModel
.
score
.
value.
private fun updateScoreText() {
binding.scoreText.text = viewModel.score.value.toString()
}
- 在
GameFragment
中,在gameFinished()
方法中,將參照變更為viewModel
.score
變更為viewModel
.
score
.
value
。新增必要的null
安全檢查。
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)
}
- 確認程式碼中沒有錯誤。編譯並執行您的應用程式。應用程式功能應與之前相同。
這項工作與前一項工作密切相關,其中您將分數和文字資料轉換為 LiveData
物件。在這項工作中,您會將 Observer
物件附加到這些 LiveData
物件。
- 在
onCreateView()
方法的GameFragment,
中,將Observer
物件附加至目前分數viewModel.score
的LiveData
物件。使用observe()
方法,並在viewModel
初始化後放置程式碼。使用 lambda 運算式來簡化程式碼。(lambda 運算式是未宣告的匿名函式,會立即傳遞為運算式)。
viewModel.score.observe(this, Observer { newScore ->
})
將參照解析為「Observer
」。方法是按一下 Observer
,然後按 Alt+Enter
(在 Mac 上為 Option+Enter
),然後匯入 androidx.lifecycle.Observer
。
- 當觀察到的
LiveData
物件包含的資料有所變更時,您剛剛建立的觀察器就會收到一個事件。在觀察工具中,將分數更新為TextView
,以新的分數更新。
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 將
Observer
物件附加至目前字詞LiveData
物件。方法與將Observer
物件附加到目前的分數的方式相同。
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
當 score
或 word
的值發生變化時,螢幕上顯示的 score
或 word
會自動更新。
- 在
GameFragment
中,刪除updateWordText()
和updateScoreText()
方法及其所有參照。由於文字檢視是由LiveData
觀察器方法進行更新,因此不再需要這些標記。 - 執行您的應用程式。您的遊戲應用程式應能照常運作,但現在使用的是
LiveData
和LiveData
觀測器。
封裝是一種限制部分物件欄位存取權的一種方式。封裝物件時,你將透過一組公開方法修改私人內部欄位。透過封裝,你可以控制其他類別操控這些內部欄位的方式。
在您目前的程式碼中,任何外部類別都可以使用 value
屬性修改 score
和 word
變數,例如使用 viewModel.score.value
。在這個程式碼研究室中開發出的應用程式可能並沒有影響,但在實際工作環境應用程式中,您會想要控制 ViewModel
物件中的資料。
只有 ViewModel
會編輯您應用程式中的資料。不過 UI 控制器必須讀取資料,因此資料欄位不能完全設為私人狀態。如要封裝應用程式資料,請使用 MutableLiveData
和 LiveData
物件。
MutableLiveData
與LiveData
的比較:
- 「
MutableLiveData
」物件中的資料可以與名稱相同,因此可以變更。在ViewModel
中,資料應該可供編輯,因此使用的是MutableLiveData
。 - 可讀取
LiveData
物件中的資料,但無法加以變更。ViewModel
以外的資料應可供讀取,但無法編輯,因此資料應公開為LiveData
。
如要執行這項策略,請使用 Kotlin 的 backback 屬性。備份屬性可讓您從確切物件傳回 getter 以外的項目。在這項工作中,您將為 GuessTheWord 應用程式中的 score
和 word
物件導入備用屬性。
新增一個補充屬性即可為分數和字詞評分
- 在
GameViewModel
中,將目前的score
物件設為private
。 - 如要遵循在屬性中使用的名稱命名慣例,請將
score
變更為_score
。_score
屬性現在是可變動的版遊戲分數,可在內部使用。 - 建立
LiveData
類型的公開版本,名為score
。
// The current score
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
- 您看見初始化錯誤。這項錯誤發生在
GameFragment
內,score
是LiveData
參照,score
無法再存取其 setter。如要進一步瞭解 Kotlin 中的 getter 和 setter,請參閱Getter 和 setter 一文。
如要解決這項錯誤,請覆寫GameViewModel
中score
物件的get()
方法,然後傳回系統支援的屬性_score
。
val score: LiveData<Int>
get() = _score
- 在
GameViewModel
中,將score
的參照變更為其內部可變動版本_score
。
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
物件重新命名為_word
,並為該物件新增備用屬性,就像score
物件一樣。
// 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)
}
}
做得好,您把 LiveData
物件封裝了 word
和 score
。
使用者輕觸 [結束遊戲] 按鈕時,您目前使用的應用程式會導向分數畫面。此外,您還可以讓應用程式在玩家循環瀏覽所有字詞時,瀏覽至分數畫面。在玩家完成最後一句話後,您想要自動結束遊戲,因此使用者不必輕觸按鈕。
如要導入這項功能,您必須先顯示所有文字,系統就必須觸發事件,並與 ViewModel
的片段進行通訊。如要這麼做,請使用 LiveData
觀測器模式來模擬遊戲完成事件。
觀察器模式
observer 模式是一種軟體設計模式,它可指定物件之間的通訊:observable (觀察項目的「主體」) 與 observers。可觀察項目是一種物件,會通知觀察人員其狀態變化。
在這個應用程式中,LiveData
可觀測 (主體) 是 LiveData
物件,而觀察器是 UI 控制器中的方法,例如片段。只要 LiveData
中包裝的資料發生變更,狀態就會改變。LiveData
類別對於從 ViewModel
與片段通訊而言至關重要。
步驟 1:使用 LiveData 偵測遊戲完成事件
在這項工作中,您會使用 LiveData
觀測器模式來模擬遊戲完成事件。
- 在
GameViewModel
中,建立一個Boolean
MutableLiveData
物件,名為_eventGameFinish
。這個物件將保存完成的遊戲。 - 初始化
_eventGameFinish
物件後,請建立並初始化名為eventGameFinish
的支援屬性。
// Event which triggers the end of the game
private val _eventGameFinish = MutableLiveData<Boolean>()
val eventGameFinish: LiveData<Boolean>
get() = _eventGameFinish
- 在
GameViewModel
中,新增onGameFinish()
方法。在方法中,將完成遊戲的eventGameFinish
事件設為true
。
/** Method for the game completed event **/
fun onGameFinish() {
_eventGameFinish.value = true
}
- 在
GameViewModel
中,在nextWord()
方法中,如果字詞清單空白,即可結束遊戲。
private fun nextWord() {
if (wordList.isEmpty()) {
onGameFinish()
} else {
//Select and remove a _word from the list
_word.value = wordList.removeAt(0)
}
}
- 在
GameFragment
中的onCreateView()
初始化viewModel
之後,將觀察器附加至eventGameFinish
。請使用observe()
方法。在 lambda 函式內,呼叫gameFinished()
方法。
// Observer for the Game finished event
viewModel.eventGameFinish.observe(this, Observer<Boolean> { hasFinished ->
if (hasFinished) gameFinished()
})
- 執行應用程式、玩遊戲,然後逐字逐一瀏覽。應用程式會自動將您導向分數畫面,而不是停留在遊戲片段中,直到您輕觸 [結束遊戲] 為止。
文字清單空白後,系統會設定eventGameFinish
,呼叫遊戲片段中的觀察器方法,然後應用程式導向螢幕片段。 - 您新增的程式碼出現生命週期問題。要瞭解此問題,在
GameFragment
課程中,請在gameFinished()
方法中註出航行代碼。請務必將Toast
訊息保留在方法中。
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)
}
- 執行應用程式、玩遊戲,然後逐字逐一瀏覽。遊戲訊息底部出現「遊戲剛結束」的預告訊息,這是正常的行為。
現在,請旋轉裝置或模擬器。吐司再次重返!旋轉裝置數次,每次都會看到吐司。這是個錯誤,因為遊戲會在遊戲結束時只顯示一次。每次重新建立片段時,都不應該顯示吐司。您已在下一項工作中解決這個問題。
步驟 2:重設完成遊戲的活動
一般來說,LiveData
只會在資料變更時對觀測器提供更新。這項例外情況除外,因為在觀察者從非使用中狀態變更為有效狀態時,觀測器也會收到更新。
這就是為什麼應用程式中會重複觸發遊戲過程。
片段中的觀察器已重新連線至現有的 ViewModel
,並接收目前資料。gameFinished()
方法會重新觸發,而且顯示吐司。
在這項工作中,您會重設 GameViewModel
中的 eventGameFinish
旗標,以修正這項問題,並且只顯示浮動訊息一次。
- 在
GameViewModel
中,新增onGameFinishComplete()
方法來重設遊戲結束的活動_eventGameFinish
。
/** Method for the game completed event **/
fun onGameFinishComplete() {
_eventGameFinish.value = false
}
- 在
GameFragment
的gameFinished()
結尾,針對viewModel
物件呼叫onGameFinishComplete()
。(暫時保留gameFinished()
中的導覽程式碼)。
private fun gameFinished() {
...
viewModel.onGameFinishComplete()
}
- 執行應用程式並玩遊戲。請逐字瀏覽,然後變更裝置的螢幕方向。顯示對象僅會顯示一次。
- 請在
GameFragment
的gameFinished()
方法中,為導覽程式碼取消註解。
如要在 Android Studio 中取消註解,請選取已加上註解的項目,然後按下Control+/
(在 Mac 上為Command+/
)。
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 的提示,請匯入 androidx.navigation.fragment.NavHostFragment.findNavController
。
- 執行應用程式並玩遊戲。瀏覽所有字詞後,請確定應用程式會自動瀏覽至最終分數畫面。
太棒了!您的應用程式使用 LiveData
觸發遊戲完成事件,從 GameViewModel
傳送到遊戲片段,指出字詞清單空白。接著,遊戲片段就會瀏覽至分數片段。
在這項工作中,您可以將分數變更為 ScoreViewModel
中的 LiveData
物件,然後附加觀察器。這項工作與將 LiveData
新增至GameViewModel
後的做法類似。
為完成此程序,您必須對 ScoreViewModel
做出變更,讓應用程式中的所有資料都使用 LiveData
。
- 在
ScoreViewModel
中,將score
變數類型變更為MutableLiveData
。按照慣例為_score
重新命名,並新增一個備用屬性。
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _score
- 在
ScoreViewModel
中的init
區塊中,初始化_score
。您可以視需要移除或離開init
區塊中的紀錄。
init {
_score.value = finalScore
}
- 在
ScoreFragment
中的onCreateView()
初始化viewModel
之後,為分數LiveData
物件附加一個觀測器。在 lambda 運算式中,將分數值設定為分數文字檢視。移除直接從ViewModel
中指派分數值的文字檢視程式碼。
要新增的程式碼:
// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
要移除的程式碼:
binding.scoreText.text = viewModel.score.toString()
在 Android Studio 顯示提示時,匯入 androidx.lifecycle.Observer
。
- 執行應用程式並玩遊戲。應用程式應能照常運作,但現在使用的是
LiveData
和觀察器來更新分數。
在這項工作中,您會將「再玩一次」按鈕新增至分數畫面,並使用 LiveData
事件導入其點擊監聽器。這個按鈕會觸發事件,從分數畫面前往遊戲畫面。
應用程式的範例程式碼包含 [再玩一次] 按鈕,但按鈕會處於隱藏狀態。
- 在
play_again_button
按鈕中,將visibility
屬性的值變更為visible
。
<Button
android:id="@+id/play_again_button"
...
android:visibility="visible"
/>
- 在
ScoreViewModel
中,新增LiveData
物件以保存名為_eventPlayAgain
的Boolean
。這個物件是用來儲存LiveData
事件,以便從分數畫面瀏覽到遊戲畫面。
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgain
- 在
ScoreViewModel
中定義定義及重設事件的方法:_eventPlayAgain
。
fun onPlayAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}
- 在
ScoreFragment
中,為eventPlayAgain
新增觀察器。請將這段程式碼放在onCreateView()
的結尾 (即return
陳述式之前)。在 lambda 運算式中,返回遊戲畫面並重設eventPlayAgain
。
// Navigates back to game when button is pressed
viewModel.eventPlayAgain.observe(this, Observer { playAgain ->
if (playAgain) {
findNavController().navigate(ScoreFragmentDirections.actionRestart())
viewModel.onPlayAgainComplete()
}
})
請在 Android Studio 出現提示時匯入 androidx.navigation.fragment.findNavController
。
- 在
ScoreFragment
的onCreateView()
中,按一下 [PlayAgain] 按鈕加入點擊接聽器並呼叫viewModel
.onPlayAgain()
。
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }
- 執行應用程式並玩遊戲。遊戲結束後,分數畫面會顯示最終分數和 [再玩一次] 按鈕。輕觸 [PlayAgain] 按鈕,應用程式隨即會瀏覽至遊戲畫面,讓你再次暢玩遊戲。
好極了!您已變更應用程式架構,在 ViewModel
中使用 LiveData
物件,並將觀察器附加至 LiveData
物件。當 LiveData
保留的值變更時,LiveData
會通知觀測器物件。
Android Studio 專案:GuessTheWord
LiveData
LiveData
是一個可觀測的資料持有者類別,其所屬類別為「Android 架構元件」之一。- 您可以使用
LiveData
,讓 UI 在資料更新時自動自動更新。 LiveData
可觀測,這表示當LiveData
物件保留的資料變更時,可通知活動 (例如活動或片段)。LiveData
包含資料,是可與任何資料搭配使用的包裝函式。LiveData
具有生命週期偵測功能,也就是說,系統只會更新處於有效生命週期狀態的觀測器,例如STARTED
或RESUMED
。
如何新增 LiveData
- 將
ViewModel
中的資料變數類型變更為LiveData
或MutableLiveData
。
MutableLiveData
是一個 LiveData
物件,其值可以變更。MutableLiveData
是一般類別,因此您必須指定其所屬的資料類型。
- 如要變更
LiveData
保存的資料值,請在LiveData
變數中使用setValue()
方法。
封裝 LiveData
- 您必須編輯
ViewModel
中的LiveData
。ViewModel
以外的是應該要讀取的LiveData
。您可以使用 Kotlin 的 backback 屬性進行實作。 - Kotlin 支援屬性可讓您取得與物件完全相同的 getter 項目。
- 如要封裝
LiveData
,請使用ViewModel
中的private
MutableLiveData
,並傳回ViewModel
以外的LiveData
背景屬性。
可觀察的 LiveData
LiveData
遵循觀察器模式。「可觀察」是指LiveData
物件,而觀察器是使用者介面控制器中的方法,例如片段。每次在LiveData
中包裝的資料改變時,系統會通知 UI 控制器中的觀測器方法。- 如要讓
LiveData
可觀測,請使用observe()
方法,將觀察器物件附加至觀察器 (例如活動和片段) 中的LiveData
參照。 - 這個
LiveData
觀察器模式可用於從ViewModel
與 UI 控制器進行通訊。
Udacity 課程:
Android 開發人員說明文件:
其他:
- Kotlin 中的支援屬性
這個部分會列出在代碼研究室中,受老師主導的課程作業的可能學生作業。由老師自行決定要執行下列動作:
- 視需要指派家庭作業。
- 告知學生如何提交家庭作業。
- 批改家庭作業。
老師可視需要使用這些建議,並視情況指派其他合適的家庭作業。
如果您是自行操作本程式碼研究室,歡迎透過這些家庭作業來測試自己的知識。
回答這些問題
第 1 題
如何封裝儲存在 ViewModel
中的 LiveData
,讓外部物件能夠讀取資料,但無法更新資料?
- 在
ViewModel
物件中,將資料類型變更為private
LiveData
。使用備用屬性來公開MutableLiveData
類型的唯讀資料。 - 在
ViewModel
物件中,將資料類型變更為private
MutableLiveData
。使用備用屬性來公開LiveData
類型的唯讀資料。 - 在 UI 控制器中,將資料類型變更為
private
MutableLiveData
。使用備用屬性來公開LiveData
類型的唯讀資料。 - 在
ViewModel
物件中,將資料類型變更為LiveData
。使用備用屬性來公開LiveData
類型的唯讀資料。
第 2 題
如果 UI 控制器處於下列狀態,LiveData
會更新 UI 控制器 (例如片段)?
- 已重新啟用
- 在背景中
- 已暫停
- 已停止
第 3 題
在 LiveData
觀測工具模式中,可觀察的項目 (觀察項目)?
- Observer 方法
LiveData
物件中的資料- UI 控制器
ViewModel
物件
開始下一堂課:
如要瞭解本課程中其他程式碼研究室的連結,請參閱 Android Kotlin 基礎程式碼程式碼到達網頁。