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
trongViewModel
. - 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ượngViewModel
để các chế độ xem đó giao tiếp trực tiếp với các đối tượngViewModel
. - 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ượngLiveData
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átLiveData
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.
- (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.
- Chạy ứng dụng và chơi trò chơi.
- 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.
- 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ụcgame_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 trongGameViewModel
. - Điểm số được cập nhật trong
GameViewModel
.
Chế độ xem Button
và GameViewModel
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 GameViewModel
và ScoreViewModel
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
.
- Trong tệp
game_fragment.xml
, hãy thêm biến liên kết dữ liệu thuộc loạiGameViewModel
. 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...
- Trong tệp
GameFragment
, hãy chuyểnGameViewModel
vào liên kết dữ liệu.
Để làm điều này, hãy chỉ địnhviewModel
cho biếnbinding.gameViewModel
mà bạn đã khai báo trong bước trước đó. Đặt mã này bên trongonCreateView()
, sau khiviewModel
đượ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
.
- Trong
game_fragment.xml
, hãy thêm thuộc tínhonClick
vàoskip_button
. Xác định biểu thức liên kết và gọi phương thứconSkip()
trongGameViewModel
. 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()}"
... />
- 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ứconCorrect
()
trongGameViewModel
.
<Button
android:id="@+id/correct_button"
...
android:onClick="@{() -> gameViewModel.onCorrect()}"
... />
- Liên kết sự kiện nhấp chuột của
end_game_button
với phương thứconGameFinish
()
trongGameViewModel
.
<Button
android:id="@+id/end_game_button"
...
android:onClick="@{() -> gameViewModel.onGameFinish()}"
... />
- 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
.
- Trong tệp
score_fragment.xml
, hãy thêm một biến liên kết thuộc loạiScoreViewModel
. Bước này tương tự như những gì bạn đã làm choGameViewModel
ở trên.
<layout ...>
<data>
<variable
name="scoreViewModel"
type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
- Trong
score_fragment.xml
, hãy thêm thuộc tínhonClick
vàoplay_again_button
. Xác định liên kết trình nghe và gọi phương thứconPlayAgain()
trongScoreViewModel
.
<Button
android:id="@+id/play_again_button"
...
android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
... />
- Trong
ScoreFragment
, bên trongonCreateView()
, hãy chạyviewModel
. Sau đó, khởi chạy biến liên kếtbinding.scoreViewModel
.
viewModel = ...
binding.scoreViewModel = viewModel
- Trong
ScoreFragment
, hãy xóa mã đặt trình xử lý lượt nhấp choplayAgainButton
. 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() }
- 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 trongScoreFragment
.
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:
- 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. - 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. - 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
.
- Trong
game_fragment.xml
, hãy thêm thuộc tínhandroid:text
vào chế độ xem văn bảnword_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.
- Trong
GameFragment
, trongonCreateView()
, sau khi khởi tạogameViewModel
, hãy đặt hoạt động hiện tại làm chủ sở hữu vòng đời của biếnbinding
. Thẻ này xác định phạm vi của đối tượngLiveData
ở 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
- Trong
GameFragment
, hãy xóa đối tượng tiếp nhận dữ liệu choLiveData
word
.
Mã cần xóa:
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
- 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 đó.
- Trong
score_fragment.xml
, hãy thêm thuộc tínhandroid:text
vào chế độ xem văn bản cho điểm. Hãy chỉ địnhscoreViewModel.score
cho thuộc tínhtext
. 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ụngString.valueOf()
.
<TextView
android:id="@+id/score_text"
...
android:text="@{String.valueOf(scoreViewModel.score)}"
... />
- Trong
ScoreFragment
, sau khi khởi chạyscoreViewModel
, hãy đặt hoạt động hiện tại làm chủ sở hữu vòng đời của biếnbinding
.
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
- Trong
ScoreFragment
, hãy xóa đối tượng tiếp nhận dữ liệu cho đối tượngscore
.
Mã cần xóa:
// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 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.
- 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ảnword
vàscore
.%s
và%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>
- Trong
game_fragment.xml
, hãy cập nhật thuộc tínhtext
của chế độ xem văn bảnword_text
để dùng tài nguyên chuỗiquote_format
. Hãy chuyển sanggameViewModel.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)}"
... />
- Định dạng chế độ xem văn bản
score
tương tự nhưword_text
. Tronggame_fragment.xml
, hãy thêm thuộc tínhtext
vào chế độ xem văn bảnscore_text
. Sử dụng tài nguyên chuỗiscore_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ượngLiveData
,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)}"
... />
- Trong lớp
GameFragment
, bên trong phương thứconCreateView()
, hãy xóa mã quan sátscore
.
Mã cần xóa:
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 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 LiveData
và ViewModel
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ư
ViewModel
vàLiveData
. - 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ượngViewModel
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ượngViewModel
.
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ểnGameViewModel
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
trongViewModel
. KhiLiveData
trongViewModel
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ếnbinding
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ượngLiveData
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:
Để 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.