Android Kotlin Fundamentals 05.3: Liên kết dữ liệu bằng ViewModel và LiveData

Lớp học lập trình này nằm trong khóa học về Khái niệm cơ bản về Android Kotlin. Bạn sẽ nhận được nhiều giá trị nhất từ khóa học này nếu bạn làm việc qua các lớp học lập trình theo trình tự. Tất cả các lớp học lập trình trong khóa học đều có trên trang đích của các lớp học lập trình cơ bản về Android Kotlin.

Giới thiệu

Trong các lớp học lập trình trước đây trong bài học này, bạn đã cải thiện mã cho ứng dụng GuessTheWord. Ứng dụng này hiện sử dụng đối tượng ViewModel, vì vậy, dữ liệu ứng dụng vẫn có thể thay đổi cấu hình thiết bị, chẳng hạn như xoay màn hình và thay đổi khả năng sử dụng bàn phím. Bạn cũng đã thêm LiveData có thể quan sát được, vì vậy, chế độ xem sẽ tự động được thông báo khi dữ liệu ghi nhận được có sự thay đổi.

Trong lớp học lập trình này, bạn tiếp tục làm việc với ứng dụng GuessTheWord. Bạn liên kết các chế độ xem với các lớp ViewModel trong ứng dụng để các chế độ xem trong bố cục của bạn có thể giao tiếp trực tiếp với các đối tượng ViewModel. (Tính đến thời điểm hiện tại trong ứng dụng của bạn, các chế độ xem đã thông báo gián tiếp với ViewModel, thông qua các mảnh của ứng dụng). Sau khi tích hợp liên kết dữ liệu với các đối tượng ViewModel, bạn sẽ không cần các trình xử lý lượt nhấp trong các mảnh của ứng dụng nữa, do đó, bạn sẽ xóa các trình xử lý này.

Bạn cũng thay đổi ứng dụng GuessTheWord để sử dụng LiveData làm nguồn liên kết dữ liệu nhằm thông báo cho giao diện người dùng về những thay đổi trong dữ liệu mà không cần sử dụng phương thức quan sát LiveData.

Kiến thức bạn cần có

  • Cách tạo các ứng dụng Android cơ bản trong Kotlin.
  • Cách hoạt động của vòng đời của hoạt động và mảnh.
  • Cách sử dụng đối tượng ViewModel trong ứng dụng của bạn.
  • Cách lưu trữ dữ liệu bằng LiveData trong ViewModel.
  • Cách thêm phương thức quan sát để quan sát các thay đổi trong dữ liệu trên LiveData.

Kiến thức bạn sẽ học được

  • Cách sử dụng các thành phần của Thư viện liên kết dữ liệu.
  • Cách tích hợp ViewModel với liên kết dữ liệu.
  • Cách tích hợp LiveData với liên kết dữ liệu.
  • Cách sử dụng đường liên kết nghe nhạc để thay thế trình xử lý lượt nhấp trong một mảnh.
  • Cách thêm định dạng chuỗi vào biểu thức liên kết dữ liệu.

Bạn sẽ thực hiện

  • Các chế độ xem trong bố cục GuessTheWord giao tiếp gián tiếp với các đối tượng ViewModel, sử dụng bộ điều khiển giao diện người dùng (mảnh) để chuyển tiếp thông tin. Trong lớp học lập trình này, bạn liên kết các chế độ xem của ứng dụng với các đối tượng ViewModel để các chế độ xem đó giao tiếp trực tiếp với các đối tượng ViewModel.
  • Bạn thay đổi ứng dụng để sử dụng LiveData làm nguồn liên kết dữ liệu. Sau sự thay đổi này, các đối tượng LiveData sẽ thông báo cho giao diện người dùng về các thay đổi trong dữ liệu và phương thức quan sát LiveData không còn cần thiết nữa.

Trong các lớp học lập trình của Bài học 5, bạn phát triển ứng dụng GuessTheWord, bắt đầu bằng mã dành cho người mới bắt đầu. GuessTheWord là trò chơi theo phong cách charades Hai người chơi, trong đó người chơi cộng tác để đạt được điểm số cao nhất có thể.

Người chơi đầu tiên nhìn vào các từ trong ứng dụng và lần lượt thực hiện từng từ, đảm bảo không hiển thị từ đó cho người chơi thứ hai. Người chơi thứ hai cố gắng đoán từ.

Để chơi trò chơi, người chơi đầu tiên mở ứng dụng trên thiết bị và thấy một từ, ví dụ như "guitar," như minh họa trong ảnh chụp màn hình dưới đây.

Người chơi đầu tiên thực hiện từ này, cẩn thận để không thực sự nói từ đó.

  • Khi người chơi thứ hai đoán đúng từ, người chơi đầu tiên nhấn nút Tôi hiểu để tăng số lượng và tính từ tiếp theo.
  • Nếu người chơi thứ hai không thể đoán từ, người chơi đầu tiên sẽ nhấn nút Bỏ qua để giảm một từ và bỏ qua từ tiếp theo.
  • Để kết thúc trò chơi, hãy nhấn nút Kết thúc trò chơi. (Chức năng này không có trong mã bắt đầu cho lớp học lập trình đầu tiên trong chuỗi.)

Trong lớp học lập trình này, bạn cải thiện ứng dụng GuessTheWord bằng cách tích hợp liên kết dữ liệu với LiveData trong các đối tượng ViewModel. Việc này giúp tự động liên lạc giữa các chế độ xem trong bố cục và các đối tượng ViewModel, đồng thời giúp bạn đơn giản hóa mã của mình bằng cách sử dụng LiveData.

Màn hình tiêu đề

Màn hình trò chơi

Màn hình điểm

Trong nhiệm vụ này, bạn xác định vị trí và chạy mã khởi động cho lớp học lập trình này. Bạn có thể sử dụng ứng dụng GuessTheWord mà bạn đã tích hợp trong lớp học lập trình trước đó làm mã dành cho người mới bắt đầu hoặc bạn có thể tải ứng dụng dành cho người mới bắt đầu xuống.

  1. (Không bắt buộc) Nếu bạn không sử dụng mã trong lớp học lập trình trước đó, hãy tải mã dành cho người mới bắt đầu xuống trong lớp học lập trình này. Giải nén mã rồi mở dự án trong Android Studio.
  2. Chạy ứng dụng và chơi trò chơi.
  3. Lưu ý rằng nút Tôi hiểu sẽ hiển thị từ tiếp theo và tăng điểm số thêm một từ, trong khi nút Bỏ qua hiển thị từ tiếp theo và giảm điểm số một từ. Nút Kết thúc trò chơi sẽ kết thúc trò chơi.
  4. Chuyển qua tất cả các từ và nhận thấy rằng ứng dụng tự động chuyển đến màn hình điểm.

Trong một lớp học lập trình trước đây, bạn đã sử dụng liên kết dữ liệu như một cách an toàn để nhập các chế độ xem trong ứng dụng GuessTheWord. Tuy nhiên, sức mạnh thực sự của liên kết dữ liệu là thực hiện những gì tên gọi đề xuất: liên kết dữ liệu trực tiếp với các đối tượng chế độ xem trong ứng dụng của bạn.

Cấu trúc hiện tại của ứng dụng

Trong ứng dụng của bạn, các chế độ xem được xác định trong bố cục XML và dữ liệu cho các chế độ xem đó sẽ được lưu giữ trong đối tượng ViewModel. Giữa mỗi chế độ xem và ViewModel tương ứng là một bộ điều khiển giao diện người dùng, hoạt động như một chuyển tiếp giữa các chế độ xem đó.

Ví dụ:

  • Nút Tôi hiểu được xác định là chế độ xem Button trong tệp bố cục game_fragment.xml.
  • Khi người dùng nhấn vào nút Tôi hiểu, trình nghe lượt nhấp trong mảnh GameFragment sẽ gọi trình nghe lượt nhấp tương ứng trong GameViewModel.
  • Điểm số được cập nhật trong GameViewModel.

Chế độ xem ButtonGameViewModel không giao tiếp trực tiếp—họ cần trình nghe lượt nhấp trong GameFragment.

ViewModel được chuyển vào liên kết dữ liệu

Việc này sẽ đơn giản hơn nếu các chế độ xem trong bố cục kết nối trực tiếp với dữ liệu trong các đối tượng ViewModel mà không cần dùng bộ điều khiển giao diện người dùng làm bên trung gian.

Các đối tượng ViewModel chứa tất cả dữ liệu giao diện người dùng trong ứng dụng GuessTheWord. Bằng cách chuyển các đối tượng ViewModel vào liên kết dữ liệu, bạn có thể tự động hóa một số hoạt động kết nối giữa chế độ xem và các đối tượng ViewModel.

Trong nhiệm vụ này, bạn liên kết các lớp GameViewModelScoreViewModel với bố cục XML tương ứng của các lớp đó. Bạn cũng thiết lập các liên kết trình xử lý để xử lý các sự kiện nhấp chuột.

Bước 1: Thêm liên kết dữ liệu cho GameViewModel

Trong bước này, bạn liên kết GameViewModel với tệp bố cục tương ứng, game_fragment.xml.

  1. Trong tệp game_fragment.xml, hãy thêm biến liên kết dữ liệu thuộc loại GameViewModel. Nếu bạn gặp lỗi trong Android Studio, hãy dọn dẹp và xây dựng lại dự án.
<layout ...>

   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  
   <androidx.constraintlayout...
  1. Trong tệp GameFragment, hãy chuyển GameViewModel vào liên kết dữ liệu.

    Để làm điều này, hãy chỉ định viewModel cho biến binding.gameViewModel mà bạn đã khai báo trong bước trước đó. Đặt mã này bên trong onCreateView(), sau khi viewModel được khởi tạo. Nếu bạn gặp lỗi trong Android Studio, hãy dọn dẹp và xây dựng lại dự án.
// Set the viewmodel for databinding - this allows the bound layout access 
// to all the data in the ViewModel
binding.gameViewModel = viewModel

Bước 2: Sử dụng liên kết trình xử lý để xử lý sự kiện

Liên kết trình nghe là các biểu thức liên kết chạy khi các sự kiện như onClick(), onZoomIn() hoặc onZoomOut() được kích hoạt. Các liên kết trình nghe được viết dưới dạng biểu thức lambda.

Liên kết dữ liệu tạo trình xử lý và đặt trình nghe ở chế độ xem. Khi sự kiện đã nghe xảy ra, trình nghe sẽ đánh giá biểu thức lambda. Tính năng liên kết trình nghe hoạt động với Android Gradle Plugin phiên bản 2.0 trở lên. Để tìm hiểu thêm, hãy đọc bài viết Bố cục và biểu thức liên kết.

Ở bước này, bạn thay thế các trình xử lý lượt nhấp trong GameFragment bằng các liên kết trình nghe trong tệp game_fragment.xml.

  1. Trong game_fragment.xml, hãy thêm thuộc tính onClick vào skip_button. Xác định biểu thức liên kết và gọi phương thức onSkip() trong GameViewModel. Biểu thức liên kết này được gọi là liên kết nghe nhạc.
<Button
   android:id="@+id/skip_button"
   ...
   android:onClick="@{() -> gameViewModel.onSkip()}"
   ... />
  1. Tương tự, hãy liên kết sự kiện lượt nhấp của correct_button với phương thức onCorrect() trong GameViewModel.
<Button
   android:id="@+id/correct_button"
   ...
   android:onClick="@{() -> gameViewModel.onCorrect()}"
   ... />
  1. Liên kết sự kiện nhấp chuột của end_game_button với phương thức onGameFinish() trong GameViewModel.
<Button
   android:id="@+id/end_game_button"
   ...
   android:onClick="@{() -> gameViewModel.onGameFinish()}"
   ... />
  1. Trong GameFragment, hãy xóa các câu lệnh đã đặt trình xử lý lượt nhấp và xóa các hàm mà trình nghe lượt nhấp gọi. Bạn không cần dùng những mật khẩu đó nữa.

Mã cần xóa:

binding.correctButton.setOnClickListener { onCorrect() }
binding.skipButton.setOnClickListener { onSkip() }
binding.endGameButton.setOnClickListener { onEndGame() }

/** Methods for buttons presses **/
private fun onSkip() {
   viewModel.onSkip()
}
private fun onCorrect() {
   viewModel.onCorrect()
}
private fun onEndGame() {
   gameFinished()
}

Bước 3: Thêm liên kết dữ liệu cho PointViewModel

Trong bước này, bạn liên kết ScoreViewModel với tệp bố cục tương ứng, score_fragment.xml.

  1. Trong tệp score_fragment.xml, hãy thêm một biến liên kết thuộc loại ScoreViewModel. Bước này tương tự như những gì bạn đã làm cho GameViewModel ở trên.
<layout ...>
   <data>
       <variable
           name="scoreViewModel"
           type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
   </data>
   <androidx.constraintlayout.widget.ConstraintLayout
  1. Trong score_fragment.xml, hãy thêm thuộc tính onClick vào play_again_button. Xác định liên kết trình nghe và gọi phương thức onPlayAgain() trong ScoreViewModel.
<Button
   android:id="@+id/play_again_button"
   ...
   android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
   ... />
  1. Trong ScoreFragment, bên trong onCreateView(), hãy chạy viewModel. Sau đó, khởi chạy biến liên kết binding.scoreViewModel.
viewModel = ...
binding.scoreViewModel = viewModel
  1. Trong ScoreFragment, hãy xóa mã đặt trình xử lý lượt nhấp cho playAgainButton. Nếu Android Studio hiển thị lỗi, hãy dọn dẹp và xây dựng lại dự án.

Mã cần xóa:

binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. Chạy ứng dụng của bạn. Ứng dụng sẽ hoạt động như trước đây, nhưng giờ đây, các chế độ xem nút sẽ giao tiếp trực tiếp với các đối tượng ViewModel. Các chế độ xem không còn giao tiếp thông qua trình xử lý lượt nhấp nút trong ScoreFragment.

Khắc phục thông báo lỗi liên kết dữ liệu

Khi một ứng dụng dùng liên kết dữ liệu, quá trình biên dịch sẽ tạo các lớp trung gian dùng cho liên kết dữ liệu. Ứng dụng có thể có lỗi mà Android Studio không phát hiện cho đến khi bạn cố gắng biên dịch ứng dụng, do đó bạn không thấy cảnh báo hoặc mã đỏ trong khi bạn đang viết mã. Nhưng tại thời điểm biên dịch, bạn sẽ nhận được lỗi mã hóa đến từ các lớp trung gian được tạo.

Nếu bạn nhận được thông báo lỗi khó hiểu:

  1. Hãy xem kỹ thông báo trong ngăn Bản dựng của Android Studio. Nếu bạn thấy một vị trí kết thúc bằng databinding, tức là đã xảy ra lỗi liên kết dữ liệu.
  2. Trong tệp XML của bố cục, hãy kiểm tra lỗi trong các thuộc tính onClick có dùng liên kết dữ liệu. Tìm hàm mà biểu thức lambda gọi và đảm bảo rằng hàm tồn tại.
  3. Trong mục <data> của tệp XML, hãy kiểm tra chính tả của biến liên kết dữ liệu.

Ví dụ: hãy lưu ý rằng lỗi chính tả của tên hàm là onCorrect() trong giá trị thuộc tính sau đây:

android:onClick="@{() -> gameViewModel.onCorrectx()}"

Ngoài ra, hãy lưu ý đến lỗi chính tả của gameViewModel trong phần <data> của tệp XML:

<data>
   <variable
       name="gameViewModelx"
       type="com.example.android.guesstheword.screens.game.GameViewModel" />
</data>

Android Studio không phát hiện các lỗi như vậy cho đến khi bạn biên dịch ứng dụng, sau đó trình biên dịch sẽ hiển thị thông báo lỗi như sau:

error: cannot find symbol
import com.example.android.guesstheword.databinding.GameFragmentBindingImpl"

symbol:   class GameFragmentBindingImpl
location: package com.example.android.guesstheword.databinding

Liên kết dữ liệu hoạt động tốt với LiveData sử dụng với đối tượng ViewModel. Bây giờ, bạn đã thêm liên kết dữ liệu vào các đối tượng ViewModel, bạn đã sẵn sàng kết hợp LiveData.

Trong nhiệm vụ này, bạn sẽ thay đổi ứng dụng GuessTheWord để dùng LiveData làm nguồn liên kết dữ liệu nhằm thông báo cho giao diện người dùng về những thay đổi trong dữ liệu mà không cần dùng phương thức quan sát LiveData.

Bước 1: Thêm từ LiveData vào tệp game_fragment.xml

Trong bước này, bạn liên kết chế độ xem văn bản từ hiện tại với trực tiếp đối tượng LiveData trong ViewModel.

  1. Trong game_fragment.xml, hãy thêm thuộc tính android:text vào chế độ xem văn bản word_text.

Đặt thuộc tính này thành đối tượng LiveData, cách word từ GameViewModel, bằng cách sử dụng biến liên kết gameViewModel.

<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{gameViewModel.word}"
   ... />

Hãy lưu ý rằng bạn không phải sử dụng word.value. Thay vào đó, bạn có thể dùng đối tượng LiveData thực. Đối tượng LiveData hiển thị giá trị hiện tại của word. Nếu giá trị của word là null, đối tượng LiveData sẽ hiển thị một chuỗi trống.

  1. Trong GameFragment, trong onCreateView(), sau khi khởi tạo gameViewModel, hãy đặt hoạt động hiện tại làm chủ sở hữu vòng đời của biến binding. Thẻ này xác định phạm vi của đối tượng LiveData ở trên, cho phép đối tượng tự động cập nhật các chế độ xem trong bố cục, game_fragment.xml.
binding.gameViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. Trong GameFragment, hãy xóa đối tượng tiếp nhận dữ liệu cho LiveData word.

Mã cần xóa:

/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})
  1. Chạy ứng dụng của bạn và chơi trò chơi. Bây giờ, từ hiện tại đang được cập nhật mà không có phương thức quan sát trong bộ điều khiển giao diện người dùng.

Bước 2: Thêm LiveData điểm vào tệp score_fragment.xml

Trong bước này, bạn liên kết LiveData score với chế độ xem văn bản điểm trong mảnh điểm đó.

  1. Trong score_fragment.xml, hãy thêm thuộc tính android:text vào chế độ xem văn bản cho điểm. Hãy chỉ định scoreViewModel.score cho thuộc tính text. Vì score là một số nguyên, hãy chuyển đổi thành một chuỗi bằng cách sử dụng String.valueOf().
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{String.valueOf(scoreViewModel.score)}"
   ... />
  1. Trong ScoreFragment, sau khi khởi chạy scoreViewModel, hãy đặt hoạt động hiện tại làm chủ sở hữu vòng đời của biến binding.
binding.scoreViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. Trong ScoreFragment, hãy xóa đối tượng tiếp nhận dữ liệu cho đối tượng score.

Mã cần xóa:

// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Chạy ứng dụng của bạn và chơi trò chơi. Xin lưu ý rằng điểm số trong mảnh điểm hiển thị chính xác mà không có đối tượng tiếp nhận dữ liệu trong mảnh điểm số.

Bước 3: Thêm định dạng chuỗi bằng liên kết dữ liệu

Trong bố cục, bạn có thể thêm định dạng chuỗi cùng với liên kết dữ liệu. Trong việc cần làm này, bạn cần định dạng từ hiện tại để thêm dấu ngoặc kép xung quanh từ đó. Bạn cũng định dạng chuỗi điểm số vào tiền tố Điểm hiện tại cho chuỗi đó, như minh họa trong hình sau.

  1. Trong string.xml, hãy thêm các chuỗi sau, bạn sẽ dùng để định dạng chế độ xem văn bản wordscore. %s%d là phần giữ chỗ cho từ hiện tại và điểm số hiện tại.
<string name="quote_format">\"%s\"</string>
<string name="score_format">Current Score: %d</string>
  1. Trong game_fragment.xml, hãy cập nhật thuộc tính text của chế độ xem văn bản word_text để dùng tài nguyên chuỗi quote_format. Hãy chuyển sang gameViewModel.word. Thao tác này sẽ chuyển từ hiện tại làm đối số cho chuỗi định dạng.
<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{@string/quote_format(gameViewModel.word)}"
   ... />
  1. Định dạng chế độ xem văn bản score tương tự như word_text. Trong game_fragment.xml, hãy thêm thuộc tính text vào chế độ xem văn bản score_text. Sử dụng tài nguyên chuỗi score_format (lấy một đối số dạng số) được biểu thị bằng phần giữ chỗ %d. Chuyển đối tượng LiveData, score, làm đối số cho chuỗi định dạng này.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{@string/score_format(gameViewModel.score)}"
   ... />
  1. Trong lớp GameFragment, bên trong phương thức onCreateView(), hãy xóa mã quan sát score.

Mã cần xóa:

viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Dọn dẹp, tạo lại và chạy ứng dụng rồi chơi trò chơi. Lưu ý rằng từ hiện tại và điểm số được định dạng trong màn hình trò chơi.

Xin chúc mừng! Bạn đã tích hợp LiveDataViewModel với liên kết dữ liệu trong ứng dụng của mình. Điều này cho phép các chế độ xem trong bố cục của bạn giao tiếp trực tiếp với ViewModel mà không cần sử dụng trình xử lý lượt nhấp trong mảnh. Bạn cũng đã dùng đối tượng LiveData làm nguồn liên kết dữ liệu để tự động thông báo cho giao diện người dùng về các thay đổi trong dữ liệu mà không cần có phương thức quan sát LiveData.

Dự án Android Studio: GuessTheWord

  • Thư viện liên kết dữ liệu hoạt động liền mạch với các thành phần cấu trúc Android như ViewModelLiveData.
  • Các bố cục trong ứng dụng của bạn có thể liên kết với dữ liệu trong Thành phần cấu trúc, vốn đã giúp bạn quản lý vòng đời của bộ điều khiển giao diện người dùng và thông báo về các thay đổi trong dữ liệu.

Liên kết dữ liệu ViewModel

  • Bạn có thể liên kết ViewModel với một bố cục bằng cách dùng liên kết dữ liệu.
  • Các đối tượng ViewModel có lưu giữ dữ liệu giao diện người dùng. Bằng cách chuyển các đối tượng ViewModel vào liên kết dữ liệu, bạn có thể tự động hóa một số hoạt động kết nối giữa chế độ xem và các đối tượng ViewModel.

Cách liên kết ViewModel với bố cục:

  • Trong tệp bố cục, hãy thêm một biến liên kết dữ liệu thuộc loại ViewModel.
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • Trong tệp GameFragment, hãy chuyển GameViewModel vào liên kết dữ liệu.
binding.gameViewModel = viewModel

Liên kết trình nghe

  • Liên kết trình nghe là các biểu thức liên kết trong bố cục chạy khi các sự kiện nhấp chuột như onClick() được kích hoạt.
  • Các liên kết trình nghe được viết dưới dạng biểu thức lambda.
  • Khi liên kết trình xử lý, bạn thay thế trình xử lý lượt nhấp trong bộ điều khiển giao diện người dùng bằng các liên kết trình nghe trong tệp bố cục.
  • Liên kết dữ liệu tạo trình xử lý và đặt trình nghe ở chế độ xem.
 android:onClick="@{() -> gameViewModel.onSkip()}"

Thêm LiveData vào liên kết dữ liệu

  • Bạn có thể dùng các đối tượng LiveData làm nguồn liên kết dữ liệu để tự động thông báo cho giao diện người dùng về các thay đổi trong dữ liệu.
  • Bạn có thể liên kết chế độ xem trực tiếp với đối tượng LiveData trong ViewModel. Khi LiveData trong ViewModel thay đổi, các chế độ xem trong bố cục có thể được cập nhật tự động mà không cần có phương thức quan sát trong bộ điều khiển giao diện người dùng.
android:text="@{gameViewModel.word}"
  • Để liên kết dữ liệu LiveData hoạt động, hãy đặt hoạt động hiện tại (bộ điều khiển giao diện người dùng) làm chủ sở hữu vòng đời của biến binding trong bộ điều khiển giao diện người dùng.
binding.lifecycleOwner = this

Định dạng chuỗi có liên kết dữ liệu

  • Khi sử dụng liên kết dữ liệu, bạn có thể định dạng tài nguyên chuỗi bằng phần giữ chỗ như %s cho chuỗi và %d cho số nguyên.
  • Để cập nhật thuộc tính text của chế độ xem, hãy chuyển đối tượng LiveData làm đối số cho chuỗi định dạng.
 android:text="@{@string/quote_format(gameViewModel.word)}"

Khóa học từ Udacity:

Tài liệu dành cho nhà phát triển Android:

Phần này liệt kê các bài tập về nhà có thể được giao cho học viên đang làm việc qua lớp học lập trình này trong khóa học do người hướng dẫn tổ chức. Người hướng dẫn có thể làm những việc sau:

  • Giao bài tập về nhà nếu được yêu cầu.
  • Trao đổi với học viên cách nộp bài tập về nhà.
  • Chấm điểm bài tập về nhà.

Người hướng dẫn có thể sử dụng những đề xuất này ít hay nhiều tùy ý. Do đó, họ có thể thoải mái giao bất kỳ bài tập về nhà nào khác mà họ cảm thấy phù hợp.

Nếu bạn đang tự mình làm việc qua lớp học lập trình này, hãy thoải mái sử dụng các bài tập về nhà này để kiểm tra kiến thức của bạn.

Trả lời những câu hỏi này

Câu hỏi 1

Câu nào sau đây không đúng về liên kết trình nghe?

  • Liên kết trình nghe là các biểu thức liên kết sẽ chạy khi một sự kiện xảy ra.
  • Liên kết trình nghe hoạt động trên mọi phiên bản Plugin Android cho Gradle.
  • Các liên kết trình nghe được viết dưới dạng biểu thức lambda.
  • Việc liên kết trình nghe tương tự như quá trình tham chiếu phương thức, nhưng bạn được phép tuỳ ý chạy các biểu thức liên kết dữ liệu.

Câu hỏi 2

Giả sử ứng dụng của bạn chứa tài nguyên chuỗi này:
<string name="generic_name">Hello %s</string>

Câu nào sau đây là cú pháp đúng để định dạng chuỗi bằng biểu thức liên kết dữ liệu?

  • android:text= "@{@string/generic_name(user.name)}"
  • android:text= "@{string/generic_name(user.name)}"
  • android:text= "@{@generic_name(user.name)}"
  • android:text= "@{@string/generic_name,user.name}"

Câu hỏi 3

Khi nào một biểu thức liên kết với trình nghe được đánh giá và thực hiện?

  • Khi dữ liệu do LiveData lưu giữ được thay đổi
  • Khi việc thay đổi cấu hình tạo lại một hoạt động
  • Khi một sự kiện như onClick() xảy ra
  • Khi hoạt động chuyển sang thực hiện trong nền

Bắt đầu bài học tiếp theo: 5.4: Biến đổi LiveData

Để biết đường liên kết đến các lớp học lập trình khác trong khóa học này, hãy xem trang đích của các lớp học lập trình cơ bản về Android Kotlin.