Android Kotlin 基礎課程 05.2:LiveData 和 LiveData 檢視器

本程式碼研究室是 Android Kotlin 基礎課程的一部分。使用程式碼研究室逐步完成程式碼課程後,您將能充分發揮本課程的潛能。所有課程程式碼研究室清單均列於 Android Kotlin 基礎程式碼研究室到達網頁

引言

在先前的程式碼研究室中,您使用了 GuessTheWord 應用程式中的 ViewModel,允許該應用程式的資料在裝置設定變更後繼續有效。在這個程式碼研究室中,您將瞭解如何整合 LiveDataViewModel 類別中的資料。LiveDataAndroid 架構元件之一,可讓您建立資料物件,以便在基礎資料庫變更時通知視圖。

如要使用 LiveData 類別,您必須設定「觀察伺服器」(例如活動或片段),以便觀察應用程式資料的變更。LiveData 可辨識生命週期,因此只會更新處於有效生命週期狀態的應用程式元件觀察器。

須知事項

  • 如何在 Kotlin 中建立基本 Android 應用程式。
  • 如何瀏覽您應用程式的目的地。
  • 活動和片段生命週期。
  • 如何在您的應用程式中使用 ViewModel 物件。
  • 如何使用 ViewModelProvider.Factory 介面建立 ViewModel 物件。

課程內容

  • LiveData 物件的實用之處。
  • 如何將 LiveData 新增至儲存在 ViewModel 中的資料。
  • 使用 MutableLiveData 的時機和方式。
  • 如何新增觀察器方法以觀察 LiveData. 中的變化。
  • 如何使用備用屬性來封裝 LiveData
  • 如何在使用者介面控制器與對應的 ViewModel 之間進行通訊。

執行步驟

  • 使用 LiveData 做為 GuessTheWord 應用程式的字詞和分數。
  • 新增觀察器,以便在出現特定字詞或分數變化時通知他們。
  • 更新顯示變更值的文字檢視模式。
  • 使用 LiveData 觀測器模式新增完成遊戲完成的事件。
  • 實作 [再次播放] 按鈕。

在第 5 課的程式碼研究室中,您開發了 GuessTheWord 應用程式,從入門程式碼開始著手。GuessTheWord 是一款雙人「角色」風格的遊戲,玩家透過協作的方式取得最高分。

第一位玩家會查看應用程式中的字詞,並逐一執行每個動作,這樣使用者就不會看到這個單字。第二位玩家會嘗試猜測字詞。

如要玩遊戲,第一位玩家會在裝置上開啟應用程式,然後看到「吉他」這個字詞,如下方的螢幕截圖所示。

第一個玩家會說出字詞,請小心不要實際說出這個字。

  • 當第二位玩家正確猜出字時,第一位玩家按下 [我知道了] 按鈕,這會增加一個數字,並顯示下一個字詞。
  • 如果第二名玩家猜到字詞,第一個玩家按下 [略過] 按鈕可將音量減少 1,直接跳到下一個字詞。
  • 如要結束遊戲,請按下 [結束遊戲] 按鈕。(該系列中第一個程式碼研究室的範例程式碼並未加入這項功能)。

在這個程式碼研究室中,您可以新增事件,以便在使用者循環播放應用程式中的所有字詞時結束遊戲,同時改善 GuessTheWord 應用程式。您也可以在分數片段中加入 [再玩一次] 按鈕,讓使用者可以再玩一次遊戲。

標題畫面

遊戲畫面

分數畫面

在這項工作中,您會找到並執行這個程式碼研究室的範例程式碼。您可以使用在舊版程式碼研究室中建立的 GuessTheWord 應用程式做為範例程式碼,也可以下載入門應用程式。

  1. (選用) 如果您並未使用前一個程式碼研究室提供的程式碼,請下載這個程式碼研究室的範例程式碼。將程式碼解壓縮,然後在 Android Studio 中開啟專案。
  2. 執行應用程式並玩遊戲。
  3. 請注意,[略過] 按鈕可顯示下一個字詞並減少 1 個分數;「我知道了」按鈕則顯示下一個字詞並增加 1 個分數。[結束遊戲] 按鈕可結束遊戲。

LiveData 是一個可觀測的資料持有者級別,可感知生命週期。例如,您可以在 GuessTheWord 應用程式中將目前分數圍繞 LiveData。在這個程式碼研究室中,您將會瞭解 LiveData 的多項特性:

  • LiveData 可觀察,這表示當 LiveData 物件保存的資料變更時,觀察器會接收通知。
  • LiveData 可保存資料;LiveData 包裝函式可與任何資料搭配使用
  • LiveData 具有生命週期偵測功能,也就是說,系統只會更新處於有效生命週期狀態的觀測器,例如 STARTEDRESUMED

在這項工作中,您會瞭解如何將 GameViewModel 中目前的分數與目前字詞資料轉換為 LiveData,藉此將任何資料類型納入 LiveData 物件中。在後續工作中,您將觀察器新增至這些 LiveData 物件,並學習如何觀察 LiveData

步驟 1:變更分數和字詞以使用 LiveData

  1. 開啟 screens/game 套件下方的 GameViewModel 檔案。
  2. 將變數 scoreword 的類型變更為 MutableLiveData

    MutableLiveDataLiveData,可以變更其值。MutableLiveData 是一般類別,因此您必須指定其所屬的資料類型。
// The current word
val word = MutableLiveData<String>()
// The current score
val score = MutableLiveData<Int>()
  1. GameViewModel 中的 init 區塊中,初始化 scoreword。如要變更 LiveData 變數的值,您可以在變數中使用 setValue() 方法。在 Kotlin 中,您可以使用 value 屬性呼叫 setValue()
init {

   word.value = ""
   score.value = 0
  ...
}

步驟 2:更新 LiveData 物件參考資料

scoreword 變數現在屬於 LiveData 類型。在這個步驟中,您將使用 value 屬性來變更這些變數的參照。

  1. GameViewModelonSkip() 方法中,將 score 變更為 score.value。請注意,score 可能是 null 的錯誤。接下來,請修正這項錯誤。
  2. 如要解決這項錯誤,請在onSkip()score.value 中新增 null 檢查。接著,請在 score 上呼叫 minus() 函式。這個函式可執行 null-safety 進行減去。
fun onSkip() {
   if (!wordList.isEmpty()) {
       score.value = (score.value)?.minus(1)
   }
   nextWord()
}
  1. 以相同方式更新 onCorrect() 方法:在 score 變數中加入 null 檢查,並使用 plus() 函式。
fun onCorrect() {
   if (!wordList.isEmpty()) {
       score.value = (score.value)?.plus(1)
   }
   nextWord()
}
  1. GameViewModel 中,在 nextWord() 方法中,將 word 參照變更為 word.value
private fun nextWord() {
   if (!wordList.isEmpty()) {
       //Select and remove a word from the list
       word.value = wordList.removeAt(0)
   }
}
  1. GameFragment 中,在 updateWordText() 方法中,將參照變更為 viewModel.word 變更為 viewModel.word.value.
/** Methods for updating the UI **/
private fun updateWordText() {
   binding.wordText.text = viewModel.word.value
}
  1. GameFragment 中,在 updateScoreText() 方法中,將參照變更為 viewModel.score 變更為 viewModel.score.value.
private fun updateScoreText() {
   binding.scoreText.text = viewModel.score.value.toString()
}
  1. 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)
}
  1. 確認程式碼中沒有錯誤。編譯並執行您的應用程式。應用程式功能應與之前相同。

這項工作與前一項工作密切相關,其中您將分數和文字資料轉換為 LiveData 物件。在這項工作中,您會將 Observer 物件附加到這些 LiveData 物件。

  1. onCreateView() 方法的 GameFragment, 中,將 Observer 物件附加至目前分數 viewModel.scoreLiveData 物件。使用 observe() 方法,並在 viewModel 初始化後放置程式碼。使用 lambda 運算式來簡化程式碼。(lambda 運算式是未宣告的匿名函式,會立即傳遞為運算式)。
viewModel.score.observe(this, Observer { newScore ->
})

將參照解析為「Observer」。方法是按一下 Observer,然後按 Alt+Enter (在 Mac 上為 Option+Enter),然後匯入 androidx.lifecycle.Observer

  1. 當觀察到的 LiveData 物件包含的資料有所變更時,您剛剛建立的觀察器就會收到一個事件。在觀察工具中,將分數更新為 TextView,以新的分數更新。
/** Setting up LiveData observation relationship **/
viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Observer 物件附加至目前字詞 LiveData 物件。方法與將 Observer 物件附加到目前的分數的方式相同。
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})

scoreword 的值發生變化時,螢幕上顯示的 scoreword 會自動更新。

  1. GameFragment 中,刪除 updateWordText()updateScoreText() 方法及其所有參照。由於文字檢視是由 LiveData 觀察器方法進行更新,因此不再需要這些標記。
  2. 執行您的應用程式。您的遊戲應用程式應能照常運作,但現在使用的是 LiveDataLiveData 觀測器。

封裝是一種限制部分物件欄位存取權的一種方式。封裝物件時,你將透過一組公開方法修改私人內部欄位。透過封裝,你可以控制其他類別操控這些內部欄位的方式。

在您目前的程式碼中,任何外部類別都可以使用 value 屬性修改 scoreword 變數,例如使用 viewModel.score.value。在這個程式碼研究室中開發出的應用程式可能並沒有影響,但在實際工作環境應用程式中,您會想要控制 ViewModel 物件中的資料。

只有 ViewModel 會編輯您應用程式中的資料。不過 UI 控制器必須讀取資料,因此資料欄位不能完全設為私人狀態。如要封裝應用程式資料,請使用 MutableLiveDataLiveData 物件。

MutableLiveDataLiveData的比較:

  • MutableLiveData」物件中的資料可以與名稱相同,因此可以變更。在 ViewModel 中,資料應該可供編輯,因此使用的是 MutableLiveData
  • 可讀取 LiveData 物件中的資料,但無法加以變更。ViewModel 以外的資料應可供讀取,但無法編輯,因此資料應公開為 LiveData

如要執行這項策略,請使用 Kotlin 的 backback 屬性。備份屬性可讓您從確切物件傳回 getter 以外的項目。在這項工作中,您將為 GuessTheWord 應用程式中的 scoreword 物件導入備用屬性。

新增一個補充屬性即可為分數和字詞評分

  1. GameViewModel 中,將目前的 score 物件設為 private
  2. 如要遵循在屬性中使用的名稱命名慣例,請將 score 變更為 _score_score 屬性現在是可變動的版遊戲分數,可在內部使用。
  3. 建立 LiveData 類型的公開版本,名為 score
// The current score
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
  1. 您看見初始化錯誤。這項錯誤發生在 GameFragment 內,scoreLiveData 參照,score 無法再存取其 setter。如要進一步瞭解 Kotlin 中的 getter 和 setter,請參閱Getter 和 setter 一文。

    如要解決這項錯誤,請覆寫 GameViewModelscore 物件的 get() 方法,然後傳回系統支援的屬性 _score
val score: LiveData<Int>
   get() = _score
  1. 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)
   }
   ...
}
  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 物件封裝了 wordscore

使用者輕觸 [結束遊戲] 按鈕時,您目前使用的應用程式會導向分數畫面。此外,您還可以讓應用程式在玩家循環瀏覽所有字詞時,瀏覽至分數畫面。在玩家完成最後一句話後,您想要自動結束遊戲,因此使用者不必輕觸按鈕。

如要導入這項功能,您必須先顯示所有文字,系統就必須觸發事件,並與 ViewModel 的片段進行通訊。如要這麼做,請使用 LiveData 觀測器模式來模擬遊戲完成事件。

觀察器模式

observer 模式是一種軟體設計模式,它可指定物件之間的通訊:observable (觀察項目的「主體」) 與 observers。可觀察項目是一種物件,會通知觀察人員其狀態變化。

在這個應用程式中,LiveData 可觀測 (主體) 是 LiveData 物件,而觀察器是 UI 控制器中的方法,例如片段。只要 LiveData 中包裝的資料發生變更,狀態就會改變。LiveData 類別對於從 ViewModel 與片段通訊而言至關重要。

步驟 1:使用 LiveData 偵測遊戲完成事件

在這項工作中,您會使用 LiveData 觀測器模式來模擬遊戲完成事件。

  1. GameViewModel 中,建立一個Boolean MutableLiveData 物件,名為 _eventGameFinish。這個物件將保存完成的遊戲。
  2. 初始化 _eventGameFinish 物件後,請建立並初始化名為 eventGameFinish 的支援屬性。
// Event which triggers the end of the game
private val _eventGameFinish = MutableLiveData<Boolean>()
val eventGameFinish: LiveData<Boolean>
   get() = _eventGameFinish
  1. GameViewModel 中,新增 onGameFinish() 方法。在方法中,將完成遊戲的 eventGameFinish 事件設為 true
/** Method for the game completed event **/
fun onGameFinish() {
   _eventGameFinish.value = true
}
  1. GameViewModel 中,在 nextWord() 方法中,如果字詞清單空白,即可結束遊戲。
private fun nextWord() {
   if (wordList.isEmpty()) {
       onGameFinish()
   } else {
       //Select and remove a _word from the list
       _word.value = wordList.removeAt(0)
   }
}
  1. GameFragment 中的 onCreateView() 初始化 viewModel 之後,將觀察器附加至 eventGameFinish。請使用 observe() 方法。在 lambda 函式內,呼叫 gameFinished() 方法。
// Observer for the Game finished event
viewModel.eventGameFinish.observe(this, Observer<Boolean> { hasFinished ->
   if (hasFinished) gameFinished()
})
  1. 執行應用程式、玩遊戲,然後逐字逐一瀏覽。應用程式會自動將您導向分數畫面,而不是停留在遊戲片段中,直到您輕觸 [結束遊戲] 為止。

    文字清單空白後,系統會設定 eventGameFinish,呼叫遊戲片段中的觀察器方法,然後應用程式導向螢幕片段。
  2. 您新增的程式碼出現生命週期問題。要瞭解此問題,在 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)
   }
  1. 執行應用程式、玩遊戲,然後逐字逐一瀏覽。遊戲訊息底部出現「遊戲剛結束」的預告訊息,這是正常的行為。

現在,請旋轉裝置或模擬器。吐司再次重返!旋轉裝置數次,每次都會看到吐司。這是個錯誤,因為遊戲會在遊戲結束時只顯示一次。每次重新建立片段時,都不應該顯示吐司。您已在下一項工作中解決這個問題。

步驟 2:重設完成遊戲的活動

一般來說,LiveData 只會在資料變更時對觀測器提供更新。這項例外情況除外,因為在觀察者從非使用中狀態變更為有效狀態時,觀測器也會收到更新。

這就是為什麼應用程式中會重複觸發遊戲過程。 片段中的觀察器已重新連線至現有的 ViewModel,並接收目前資料。gameFinished() 方法會重新觸發,而且顯示吐司。

在這項工作中,您會重設 GameViewModel 中的 eventGameFinish 旗標,以修正這項問題,並且只顯示浮動訊息一次。

  1. GameViewModel 中,新增 onGameFinishComplete() 方法來重設遊戲結束的活動 _eventGameFinish
/** Method for the game completed event **/

fun onGameFinishComplete() {
   _eventGameFinish.value = false
}
  1. GameFragmentgameFinished() 結尾,針對 viewModel 物件呼叫 onGameFinishComplete()。(暫時保留 gameFinished() 中的導覽程式碼)。
private fun gameFinished() {
   ...
   viewModel.onGameFinishComplete()
}
  1. 執行應用程式並玩遊戲。請逐字瀏覽,然後變更裝置的螢幕方向。顯示對象僅會顯示一次。
  2. 請在 GameFragmentgameFinished() 方法中,為導覽程式碼取消註解。

    如要在 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

  1. 執行應用程式並玩遊戲。瀏覽所有字詞後,請確定應用程式會自動瀏覽至最終分數畫面。

太棒了!您的應用程式使用 LiveData 觸發遊戲完成事件,從 GameViewModel 傳送到遊戲片段,指出字詞清單空白。接著,遊戲片段就會瀏覽至分數片段。

在這項工作中,您可以將分數變更為 ScoreViewModel 中的 LiveData 物件,然後附加觀察器。這項工作與將 LiveData 新增至GameViewModel後的做法類似。

為完成此程序,您必須對 ScoreViewModel 做出變更,讓應用程式中的所有資料都使用 LiveData

  1. ScoreViewModel 中,將 score 變數類型變更為 MutableLiveData。按照慣例為 _score 重新命名,並新增一個備用屬性。
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
   get() = _score
  1. ScoreViewModel 中的 init 區塊中,初始化 _score。您可以視需要移除或離開 init 區塊中的紀錄。
init {
   _score.value = finalScore
}
  1. 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

  1. 執行應用程式並玩遊戲。應用程式應能照常運作,但現在使用的是 LiveData 和觀察器來更新分數。

在這項工作中,您會將「再玩一次」按鈕新增至分數畫面,並使用 LiveData 事件導入其點擊監聽器。這個按鈕會觸發事件,從分數畫面前往遊戲畫面。

應用程式的範例程式碼包含 [再玩一次] 按鈕,但按鈕會處於隱藏狀態。

  1. play_again_button 按鈕中,將 visibility 屬性的值變更為 visible
<Button
   android:id="@+id/play_again_button"
...
   android:visibility="visible"
 />
  1. ScoreViewModel 中,新增 LiveData 物件以保存名為 _eventPlayAgainBoolean。這個物件是用來儲存 LiveData 事件,以便從分數畫面瀏覽到遊戲畫面。
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
   get() = _eventPlayAgain
  1. ScoreViewModel 中定義定義及重設事件的方法:_eventPlayAgain
fun onPlayAgain() {
   _eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
   _eventPlayAgain.value = false
}
  1. 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

  1. ScoreFragmentonCreateView() 中,按一下 [PlayAgain] 按鈕加入點擊接聽器並呼叫 viewModel.onPlayAgain()
binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. 執行應用程式並玩遊戲。遊戲結束後,分數畫面會顯示最終分數和 [再玩一次] 按鈕。輕觸 [PlayAgain] 按鈕,應用程式隨即會瀏覽至遊戲畫面,讓你再次暢玩遊戲。

好極了!您已變更應用程式架構,在 ViewModel 中使用 LiveData 物件,並將觀察器附加至 LiveData 物件。當 LiveData 保留的值變更時,LiveData 會通知觀測器物件。

Android Studio 專案:GuessTheWord

LiveData

  • LiveData 是一個可觀測的資料持有者類別,其所屬類別為「Android 架構元件」之一。
  • 您可以使用 LiveData,讓 UI 在資料更新時自動自動更新。
  • LiveData 可觀測,這表示當 LiveData 物件保留的資料變更時,可通知活動 (例如活動或片段)。
  • LiveData 包含資料,是可與任何資料搭配使用的包裝函式。
  • LiveData 具有生命週期偵測功能,也就是說,系統只會更新處於有效生命週期狀態的觀測器,例如 STARTEDRESUMED

如何新增 LiveData

  • ViewModel 中的資料變數類型變更為 LiveDataMutableLiveData

MutableLiveData 是一個 LiveData 物件,其值可以變更。MutableLiveData 是一般類別,因此您必須指定其所屬的資料類型。

  • 如要變更 LiveData 保存的資料值,請在 LiveData 變數中使用 setValue() 方法。

封裝 LiveData

  • 您必須編輯 ViewModel 中的 LiveDataViewModel 以外的是應該要讀取的 LiveData。您可以使用 Kotlin 的 backback 屬性進行實作。
  • Kotlin 支援屬性可讓您取得與物件完全相同的 getter 項目。
  • 如要封裝 LiveData,請使用 ViewModel 中的 private MutableLiveData,並傳回 ViewModel 以外的 LiveData 背景屬性。

可觀察的 LiveData

  • LiveData 遵循觀察器模式。「可觀察」是指 LiveData 物件,而觀察器是使用者介面控制器中的方法,例如片段。每次在 LiveData 中包裝的資料改變時,系統會通知 UI 控制器中的觀測器方法。
  • 如要讓 LiveData 可觀測,請使用 observe() 方法,將觀察器物件附加至觀察器 (例如活動和片段) 中的 LiveData 參照。
  • 這個 LiveData 觀察器模式可用於從 ViewModel 與 UI 控制器進行通訊。

Udacity 課程:

Android 開發人員說明文件:

其他:

這個部分會列出在代碼研究室中,受老師主導的課程作業的可能學生作業。由老師自行決定要執行下列動作:

  • 視需要指派家庭作業。
  • 告知學生如何提交家庭作業。
  • 批改家庭作業。

老師可視需要使用這些建議,並視情況指派其他合適的家庭作業。

如果您是自行操作本程式碼研究室,歡迎透過這些家庭作業來測試自己的知識。

回答這些問題

第 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 物件

開始下一堂課:5.3:使用 DataModel 和 LiveData 進行資料繫結

如要瞭解本課程中其他程式碼研究室的連結,請參閱 Android Kotlin 基礎程式碼程式碼到達網頁