lOMoARcPSD| 61552889
ĐẠIHỌCBÁCHKHOAHÀNỘI
TRƯỜNGCÔNGNGHỆTHÔNGTINVÀTRUYỀNTHÔNG
BÁO CÁO LESSION 5
Môn: Phát triển ứng dụng cho thiết bị di ộng – IT4785
Mã lớp: 151902
Giảng viên hướng dẫn : Thầy Nguyễn Hồng Quang
Họ và tên – MSSV : Nguyễn Văn Minh - 20215092
Lab 4.3
1. Tạo số ngẫu nhiên:
Sử dụng IntRange để biểu diễn phạm vi giá trị của xúc xắc (ví dụ: 1..6 cho xúc xắc
6 mặt). Gọi hàm random() trên IntRange để tạo ra một sngẫu nhiên trong phạm vi
ó.
lOMoARcPSD| 61552889
2. Tạo lớp Dice:
Định nghĩa lớp Dice với thuộc tính sides ại diện cho số cạnh của xúc xắc. Tạo
phương thức roll() bên trong lớp Dice để mô phỏng việc tung xúc xắc. Phương
thức này sử dụng random() để tạo ra một sngẫu nhiên trong phạm vi từ 1
ến sides và in kết quả ra console.
3. Tạo đối ợng Dice:
Trong hàm main(), tạo một đối ợng Dice (ví dụ: myFirstDice) bằng cách sử dụng
constructor của lớp Dice.
Truy cập thuộc tính sides của đối ợng bằng cách sử dụng dấu chấm (.), ví dụ:
myFirstDice.sides.
Gọi phương thức roll() trên đối ợng Dice để tung xúc xắc, ví dụ: myFirstDice.roll().
lOMoARcPSD| 61552889
4. Trả về giá trị từ phương thức roll():
Sửa ổi phương thức roll() để trả về giá trị số nguyên (Int) thay vì in ra
console. Sử dụng câu lệnh return để trả về giá trị của biến randomNumber trong
phương thức roll().
Trong hàm main(), gán giá trị trả về của myFirstDice.roll() cho một biến (ví dụ:
diceRoll) và in ra kết quả.
5. Thay ổi số cạnh của xúc xắc:
Sửa ổi phương thức roll() để sử dụng thuộc tính sides thay vì giá trị cố ịnh 1..6.
Thay ổi giá trị của thuộc tính sides cho đối ợng Dice sau khi ã tạo.
lOMoARcPSD| 61552889
6. Tùy chỉnh xúc xắc:
Sửa ổi lớp Dice để nhn số cạnh (numSides) làm tham số đầu vào khi tạo
đối ng.
Xóa bỏ thuộc tính sides và sử dụng numSides thay thế.
Cập nhật hàm main() để truyền số cạnh mong muốn khi tạo đối ợng Dice.
7. Thực hành tốt:
Rút gọn code bằng cách trả về giá trị ngẫu nhiên trực tiếp từ phương thức roll().
lOMoARcPSD| 61552889
Gọi myFirstDice.roll() trực tiếp trong câu lệnh println() để loại bỏ biến diceRoll.
lOMoARcPSD| 61552889
Lab 4.4
1. Thiết lp ứng dụng:
Tạo dự án mới trong Android Studio với Empty Activity template, ặt tên ứng dụng
là "Dice Roller".
Tạo layout: Sử dụng Layout Editor để thêm Button và TextView vào layout
`activity_main.xml`.
Thêm constraint cho Button và TextView để nh vị chúng trên màn hình.
Thay ổi text của Button thành "Roll".
Thay i kích thước chữ của TextView và xóa nội dung text.
2. Giới thiệu về Activities:
Activity cung cấp cửa sổ để ứng dụng vẽ giao diện người dùng (UI), thường chiếm
toàn bộ màn hình. Mỗi ứng dụng có ít nhất một activity, activity đầu tiên
ược gọi là
`MainActivity`.
Trong code `MainActivity`, cần cung cấp chi tiết về layout của Activity và cách người
dùng tương tác với nó.
3. Làm cho Button tương tác:
Trong `MainActivity.kt`, sử dụng `findViewById()` để tìm Button trong layout và
lưu tham chiếu vào biến `rollButton`.
Sử dụng `setOnClickListener()` để thêm `click listener` cho `rollButton`. Code bên
trong `click listener` sẽ ược thực thi khi người dùng nhấn vào Button.
Ban đầu, hiển thị thông báo Toast "Dice Rolled!" khi Button ược nhấn.
Sau ó, thay ổi code để cập nhật TextView với giá trị "6" khi Button ược nhấn.
lOMoARcPSD| 61552889
4.
Thêm logic tung xúc xắc:
Thêm lớp `Dice` từ bài lab 4.3 vào ứng dụng, với phương thức `roll()` trả về kết quả
tung xúc xắc ngẫu nhiên.
Tạo phương thức `rollDice()` trong `MainActivity.kt` để xử lý logic tung xúc xắc:
Tạo đối ợng `Dice` với 6 mặt.
Gọi phương thức `roll()` để tung xúc xắc và lưu kết quả vào biến `diceRoll`.
Tìm TextView bằng `findViewById()`.
Cập nhật text của TextView với giá trị của `diceRoll`.
lOMoARcPSD| 61552889
5. Thực hành tốt:
Rút gọn code bằng cách gộp các lệnh thành một dòng.
Sử dụng `Reformat Code` (Ctrl+Alt+L hoặc Command+Option+L) để ịnh dạng
code theo chuẩn Android.
Thêm comment vào code để giải thích chức năng của từng phần.
lOMoARcPSD| 61552889
Lab 4.5
1. Thiết lập code ban đầu: Sử dụng code từ bài tập Dice Roller trước ó làm
iểm bắt đầu.
2. Kiểm tra số may mắn:
Tạo một biến luckyNumber và gán giá trị cho nó (ví dụ: 4).
Sử dụng câu lệnh if để kiểm tra xem kết quả tung xúc xắc (rollResult) có bằng với
luckyNumber hay không.
In ra thông báo "You win!" nếu điều kiện úng.
lOMoARcPSD| 61552889
3. Xử lý trường hợp không trúng số:
Thêm câu lệnh else để in thông báo "You didn't win, try again!" khi kết quả tung
không bằng luckyNumber.
4. Thêm thông báo chi tiết:
Sử dụng nhiều câu lệnh else if để in ra các thông báo khác nhau cho mỗi giá trị
tung xúc xắc (ngoại trừ luckyNumber).
Ví dụ, nếu tung ược số 1, in ra "So sorry! You rolled a 1. Try again!", nếu tung
ược số 2, in ra "Sadly, you rolled a 2. Try again!", v.v.
lOMoARcPSD| 61552889
5. Sử dụng câu lệnh when:
Thay thế chuỗi if-else if-else bằng câu lệnh when.
So sánh kết quả tung (rollResult) với luckyNumber và các giá trị tung có thể khác.
In ra thông báo tương ứng cho mỗi trường hợp.
Lab 4.6
1. Cập nhật Layout:
Mở ứng dụng Dice Roller ã tạo ở bài lab 4.4. Xóa TextView khỏi layout
activity_main.xml.
Kéo ImageView từ Palette vào Design view, ặt nó phía trên Button.
Chọn một hình ảnh tạm thời từ Sample data (ví dụ: avatars).
Thêm constraint cho ImageView và Button để ịnh vị chúng trên màn hình.
Đặt kích thước cố ịnh cho ImageView (ví dụ: 160dp x 200dp).
Thêm margin cho Button để tạo khoảng cách với ImageView.
lOMoARcPSD| 61552889
2. Thêm hình ảnh xúc xắc:
Tải xuống file zip chứa hình ảnh xúc xắc từ ường dẫn ược cung cấp trong bài lab.
Giải nén file zip để có ược 6 file hình ảnh xúc xắc, hiển thị các giá trị từ 1 ến 6.
Mở Resource Manager trong Android Studio.
Nhập 6 file hình ảnh xúc xắc vào thư mục drawable của ứng dụng.
Ghi nhớ resource ID của các hình ảnh này, ví dụ: R.drawable.dice_1,
R.drawable.dice_2, v.v.
3. Sử dụng hình ảnh xúc xắc:
Thay thế hình ảnh tạm thời trong ImageView bằng hình ảnh dice_1. Trong
MainActivity.kt, xóa code liên quan ến TextView.
Trong phương thức rollDice(), tạo biến diceImage kiểu ImageView và gán nó với
ImageView trong layout bằng findViewById().
Thêm dòng code diceImage.setImageResource(R.drawable.dice_2) để kiểm tra xem
bạn có thể cập nhật ImageView khi nút ược nhấn hay không.
Chạy ứng dụng để xác minh rằng nó chạy mà không có lỗi.
lOMoARcPSD| 61552889
4. Hiển thị hình ảnh xúc xắc phù hợp:
Xóa dòng code diceImage.setImageResource(R.drawable.dice_2) trong rollDice().
Thay thế nó bằng câu lệnh when để cập nhật ImageView dựa trên giá trị của
diceRoll.
Trong mỗi case của câu lệnh when, sử dụng setImageResource() để ặt hình
ảnh xúc xắc tương ứng.
Chạy ứng dụng và kiểm tra xem hình ảnh xúc xắc thay ổi theo kết quả tung.
lOMoARcPSD| 61552889
5. Tối ưu code:
Tạo biến drawableResource để lưu trữ resource ID của hình ảnh xúc xắc.
Sử dụng câu lệnh when để gán giá trị cho drawableResource dựa trên diceRoll.
Gọi setImageResource() một lần và truyền drawableResource vào để cập nhật
ImageView.
Chạy ứng dụng để ảm bảo nó vẫn hoạt ộng chính xác.
6. Đặt content description cho ImageView:
Thêm dòng code diceImage.contentDescription = diceRoll.toString() sau khi cập nhật
hình ảnh cho ImageView. Điều này giúp người dùng sử dụng trình ọc màn hình
hiểu ược giá trị xúc xắc ược hiển thị.
7. Thực hành tốt:
lOMoARcPSD| 61552889
Trong onCreate(), gọi rollDice() sau khi thiết lập setOnClickListener() để hin
thị kết quả tung ngẫu nhiên khi ứng dụng khởi ng.
Thêm comment vào code để giải thích chức năng của từng phần.
Lab 4.7
1. Tải xuống code dự án: Tải xuống code khởi ộng từ ường dẫn ược cung cấp
trong bài lab và mở nó trong Android Studio.
lOMoARcPSD| 61552889
2. Xây dựng giao diện người dùng:
Mở file activity_main.xml.
Sử dụng TextView để hiển thị ớng dẫn cho người dùng.
Sử dụng ImageView để hiển thị hình ảnh dựa trên trạng thái hiện tại của ứng dụng.
Căn giữa cả hai view trên màn hình.
3. Làm cho ứng dụng tương tác:
Mở file MainActivity.kt.
lOMoARcPSD| 61552889
ớc 1: Định cấu hình ImageView:
Thiết lập setOnClickListener() cho lemonImage để cập nhật trạng thái của
ứng dụng khi người dùng chạm vào nó.
Thiết lập setOnLongClickListener() để hiển thị snackbar cho biết số lần
người dùng ã vắt chanh khi họ nhấn giữ lemonImage.
ớc 2: Cài ặt clickLemonImage():
Xử lý chuyển ổi giữa các trạng thái SELECT, SQUEEZE, DRINK và RESTART
dựa trên giá trị của biến lemonadeState.
Cập nhật các biến lemonSize và squeezeCount khi cần thiết.
Gọi setViewElements() sau khi xử lý cập nhật trạng thái.
ớc 3: Cài ặt setViewElements():
Cập nhật TextView và ImageView dựa trên trạng thái hiện tại của ứng dụng
(lemonadeState).
Sử dụng resource ID của hình ảnh và văn bản từ file strings.xml.
4. Chạy ứng dụng: Chạy ứng dụng trên emulator hoặc thiết bị Android để
kiểm tra chức năng. 5. Kiểm tra ứng dụng:
Chạy các testược cung cấp trong dự án để xác minh code của bạn hoạt ộng như
mong i.
Sửa lỗi nếu có test nào không thành công.
lOMoARcPSD| 61552889

Preview text:

lOMoAR cPSD| 61552889
ĐẠIHỌCBÁCHKHOAHÀNỘI
TRƯỜNGCÔNGNGHỆTHÔNGTINVÀTRUYỀNTHÔNG BÁO CÁO LESSION 5
Môn: Phát triển ứng dụng cho thiết bị di ộng – IT4785 Mã lớp: 151902 Giảng viên hướng dẫn : Thầy Nguyễn Hồng Quang Họ và tên – MSSV : Nguyễn Văn Minh - 20215092 Lab 4.3 1. Tạo số ngẫu nhiên:
Sử dụng IntRange để biểu diễn phạm vi giá trị của xúc xắc (ví dụ: 1..6 cho xúc xắc
6 mặt). Gọi hàm random() trên IntRange để tạo ra một số ngẫu nhiên trong phạm vi ó. lOMoAR cPSD| 61552889 2. Tạo lớp Dice:
Định nghĩa lớp Dice với thuộc tính sides ại diện cho số cạnh của xúc xắc. Tạo
phương thức roll() bên trong lớp Dice
để mô phỏng việc tung xúc xắc. Phương
thức này sử dụng random()
để tạo ra một số ngẫu nhiên trong phạm vi từ 1
ến sides và in kết quả ra console.
3. Tạo đối tượng Dice:
Trong hàm main(), tạo một đối tượng Dice (ví dụ: myFirstDice) bằng cách sử dụng constructor của lớp Dice.
Truy cập thuộc tính sides của
đối tượng bằng cách sử dụng dấu chấm (.), ví dụ: myFirstDice.sides.
Gọi phương thức roll() trên đối tượng Dice để tung xúc xắc, ví dụ: myFirstDice.roll(). lOMoAR cPSD| 61552889
4. Trả về giá trị từ phương thức roll():
Sửa ổi phương thức roll()
để trả về giá trị số nguyên (Int) thay vì in ra
console. Sử dụng câu lệnh return để trả về giá trị của biến randomNumber trong phương thức roll().
Trong hàm main(), gán giá trị trả về của myFirstDice.roll() cho một biến (ví dụ:
diceRoll) và in ra kết quả. 5. Thay
ổi số cạnh của xúc xắc:
Sửa ổi phương thức roll() để sử dụng thuộc tính sides thay vì giá trị cố ịnh 1..6.
Thay ổi giá trị của thuộc tính sides cho đối tượng Dice sau khi ã tạo. lOMoAR cPSD| 61552889 6. Tùy chỉnh xúc xắc:
Sửa ổi lớp Dice để nhận số cạnh (numSides) làm tham số đầu vào khi tạo đối tượng.
Xóa bỏ thuộc tính sides và sử dụng numSides thay thế.
Cập nhật hàm main() để truyền số cạnh mong muốn khi tạo đối tượng Dice. 7. Thực hành tốt:
Rút gọn code bằng cách trả về giá trị ngẫu nhiên trực tiếp từ phương thức roll(). lOMoAR cPSD| 61552889
Gọi myFirstDice.roll() trực tiếp trong câu lệnh println() để loại bỏ biến diceRoll. lOMoAR cPSD| 61552889 Lab 4.4
1. Thiết lập ứng dụng:
Tạo dự án mới trong Android Studio với Empty Activity template, ặt tên ứng dụng là "Dice Roller".
Tạo layout: Sử dụng Layout Editor để thêm Button và TextView vào layout `activity_main.xml`.
Thêm constraint cho Button và TextView để ịnh vị chúng trên màn hình.
Thay ổi text của Button thành "Roll".
Thay ổi kích thước chữ của TextView và xóa nội dung text.
2. Giới thiệu về Activities:
Activity cung cấp cửa sổ để ứng dụng vẽ giao diện người dùng (UI), thường chiếm
toàn bộ màn hình. Mỗi ứng dụng có ít nhất một activity, activity đầu tiên ược gọi là `MainActivity`.
Trong code `MainActivity`, cần cung cấp chi tiết về layout của Activity và cách người dùng tương tác với nó.
3. Làm cho Button tương tác:
Trong `MainActivity.kt`, sử dụng `findViewById()`
để tìm Button trong layout và
lưu tham chiếu vào biến `rollButton`.
Sử dụng `setOnClickListener()` để thêm `click listener` cho `rollButton`. Code bên trong `click listener` sẽ
ược thực thi khi người dùng nhấn vào Button.
Ban đầu, hiển thị thông báo Toast "Dice Rolled!" khi Button ược nhấn.
Sau ó, thay ổi code để cập nhật TextView với giá trị "6" khi Button ược nhấn. lOMoAR cPSD| 61552889 4. Thêm logic tung xúc xắc:
Thêm lớp `Dice` từ bài lab 4.3 vào ứng dụng, với phương thức `roll()` trả về kết quả
tung xúc xắc ngẫu nhiên.
Tạo phương thức `rollDice()` trong `MainActivity.kt` để xử lý logic tung xúc xắc:
Tạo đối tượng `Dice` với 6 mặt.
Gọi phương thức `roll()` để tung xúc xắc và lưu kết quả vào biến `diceRoll`.
Tìm TextView bằng `findViewById()`.
Cập nhật text của TextView với giá trị của `diceRoll`. lOMoAR cPSD| 61552889 5. Thực hành tốt:
Rút gọn code bằng cách gộp các lệnh thành một dòng.
Sử dụng `Reformat Code` (Ctrl+Alt+L hoặc Command+Option+L) để ịnh dạng code theo chuẩn Android.
Thêm comment vào code để giải thích chức năng của từng phần. lOMoAR cPSD| 61552889 Lab 4.5 1. Thiết lập code ban
đầu: Sử dụng code từ bài tập Dice Roller trước ó làm iểm bắt đầu. 2. Kiểm tra số may mắn:
Tạo một biến luckyNumber và gán giá trị cho nó (ví dụ: 4).
Sử dụng câu lệnh if để kiểm tra xem kết quả tung xúc xắc (rollResult) có bằng với luckyNumber hay không.
In ra thông báo "You win!" nếu điều kiện úng. lOMoAR cPSD| 61552889
3. Xử lý trường hợp không trúng số:
Thêm câu lệnh else để in thông báo "You didn't win, try again!" khi kết quả tung không bằng luckyNumber.
4. Thêm thông báo chi tiết:
Sử dụng nhiều câu lệnh else if
để in ra các thông báo khác nhau cho mỗi giá trị
tung xúc xắc (ngoại trừ luckyNumber). Ví dụ, nếu tung
ược số 1, in ra "So sorry! You rolled a 1. Try again!", nếu tung
ược số 2, in ra "Sadly, you rolled a 2. Try again!", v.v. lOMoAR cPSD| 61552889
5. Sử dụng câu lệnh when:
Thay thế chuỗi if-else if-else bằng câu lệnh when.
So sánh kết quả tung (rollResult) với luckyNumber và các giá trị tung có thể khác.
In ra thông báo tương ứng cho mỗi trường hợp. Lab 4.6 1. Cập nhật Layout:
Mở ứng dụng Dice Roller ã tạo ở bài lab 4.4. Xóa TextView khỏi layout activity_main.xml.
Kéo ImageView từ Palette vào Design view, ặt nó phía trên Button.
Chọn một hình ảnh tạm thời từ Sample data (ví dụ: avatars).
Thêm constraint cho ImageView và Button để ịnh vị chúng trên màn hình.
Đặt kích thước cố ịnh cho ImageView (ví dụ: 160dp x 200dp).
Thêm margin cho Button để tạo khoảng cách với ImageView. lOMoAR cPSD| 61552889
2. Thêm hình ảnh xúc xắc:
Tải xuống file zip chứa hình ảnh xúc xắc từ ường dẫn ược cung cấp trong bài lab.
Giải nén file zip để có ược 6 file hình ảnh xúc xắc, hiển thị các giá trị từ 1 ến 6.
Mở Resource Manager trong Android Studio.
Nhập 6 file hình ảnh xúc xắc vào thư mục drawable của ứng dụng.
Ghi nhớ resource ID của các hình ảnh này, ví dụ: R.drawable.dice_1, R.drawable.dice_2, v.v.
3. Sử dụng hình ảnh xúc xắc:
Thay thế hình ảnh tạm thời trong ImageView bằng hình ảnh dice_1. Trong
MainActivity.kt, xóa code liên quan ến TextView.
Trong phương thức rollDice(), tạo biến diceImage kiểu ImageView và gán nó với
ImageView trong layout bằng findViewById().
Thêm dòng code diceImage.setImageResource(R.drawable.dice_2) để kiểm tra xem
bạn có thể cập nhật ImageView khi nút ược nhấn hay không.
Chạy ứng dụng để xác minh rằng nó chạy mà không có lỗi. lOMoAR cPSD| 61552889
4. Hiển thị hình ảnh xúc xắc phù hợp:
Xóa dòng code diceImage.setImageResource(R.drawable.dice_2) trong rollDice().
Thay thế nó bằng câu lệnh when để cập nhật ImageView dựa trên giá trị của diceRoll.
Trong mỗi case của câu lệnh when, sử dụng setImageResource() để ặt hình
ảnh xúc xắc tương ứng.
Chạy ứng dụng và kiểm tra xem hình ảnh xúc xắc thay ổi theo kết quả tung. lOMoAR cPSD| 61552889 5. Tối ưu code:
Tạo biến drawableResource để lưu trữ resource ID của hình ảnh xúc xắc. Sử dụng câu lệnh when
để gán giá trị cho drawableResource dựa trên diceRoll.
Gọi setImageResource() một lần và truyền drawableResource vào để cập nhật ImageView.
Chạy ứng dụng để ảm bảo nó vẫn hoạt ộng chính xác.
6. Đặt content description cho ImageView:
Thêm dòng code diceImage.contentDescription = diceRoll.toString() sau khi cập nhật
hình ảnh cho ImageView. Điều này giúp người dùng sử dụng trình ọc màn hình
hiểu ược giá trị xúc xắc ược hiển thị. 7. Thực hành tốt: lOMoAR cPSD| 61552889
Trong onCreate(), gọi rollDice() sau khi thiết lập setOnClickListener() để hiển
thị kết quả tung ngẫu nhiên khi ứng dụng khởi ộng.
Thêm comment vào code để giải thích chức năng của từng phần. Lab 4.7
1. Tải xuống code dự án: Tải xuống code khởi ộng từ ường dẫn ược cung cấp
trong bài lab và mở nó trong Android Studio. lOMoAR cPSD| 61552889
2. Xây dựng giao diện người dùng: Mở file activity_main.xml.
Sử dụng TextView để hiển thị hướng dẫn cho người dùng.
Sử dụng ImageView để hiển thị hình ảnh dựa trên trạng thái hiện tại của ứng dụng.
Căn giữa cả hai view trên màn hình.
3. Làm cho ứng dụng tương tác: Mở file MainActivity.kt. lOMoAR cPSD| 61552889
Bước 1: Định cấu hình ImageView:
Thiết lập setOnClickListener() cho lemonImage để cập nhật trạng thái của
ứng dụng khi người dùng chạm vào nó.
Thiết lập setOnLongClickListener()
để hiển thị snackbar cho biết số lần
người dùng ã vắt chanh khi họ nhấn giữ lemonImage.
Bước 2: Cài ặt clickLemonImage():
Xử lý chuyển ổi giữa các trạng thái SELECT, SQUEEZE, DRINK và RESTART
dựa trên giá trị của biến lemonadeState.
Cập nhật các biến lemonSize và squeezeCount khi cần thiết.
Gọi setViewElements() sau khi xử lý cập nhật trạng thái.
Bước 3: Cài ặt setViewElements():
Cập nhật TextView và ImageView dựa trên trạng thái hiện tại của ứng dụng (lemonadeState).
Sử dụng resource ID của hình ảnh và văn bản từ file strings.xml.
4. Chạy ứng dụng: Chạy ứng dụng trên emulator hoặc thiết bị Android để
kiểm tra chức năng. 5. Kiểm tra ứng dụng:
Chạy các testược cung cấp trong dự án để xác minh code của bạn hoạt ộng như mong ợi.
Sửa lỗi nếu có test nào không thành công. lOMoAR cPSD| 61552889