Lớp học lập trình này thuộc khoá học Kiến thức cơ bản về Kotlin cho Android. Bạn sẽ nhận được nhiều giá trị nhất qua khoá học này nếu thực hiện các lớp học lập trình theo trình tự. Tất cả lớp học lập trình của khoá học đều được liệt kê trên trang đích của lớp học lập trình Kiến thức cơ bản về cách tạo ứng dụng Android bằng Kotlin.
Giới thiệu
Đến thời điểm này, bạn đã thiết lập mọi thứ và Android Studio đã tạo nhiều mã cho bạn. Trước khi sửa đổi tất cả mã đó, bạn cần biết những gì mình vừa tạo và cách điều hướng các tệp nguồn của một ứng dụng Android.
Trong lớp học lập trình này, bạn sẽ tìm hiểu thêm về các thành phần chính của một ứng dụng Android và thêm tính tương tác đơn giản vào một ứng dụng có nút.
Kiến thức bạn cần có
- Cách cài đặt và mở Android Studio.
- Cách tạo một dự án ứng dụng mới.
- Cách chạy ứng dụng trên trình mô phỏng hoặc thiết bị thực.
Kiến thức bạn sẽ học được
- Cách chỉnh sửa tệp bố cục của ứng dụng.
- Cách tạo một ứng dụng có hành vi tương tác.
- Rất nhiều thuật ngữ mới. Hãy xem Bảng thuật ngữ để biết nội dung giải thích dễ hiểu về các thuật ngữ và khái niệm.
Những việc bạn sẽ làm
- Khám phá tệp Kotlin
MainActivity
và tệp bố cục của hoạt động. - Chỉnh sửa bố cục của hoạt động trong XML.
- Thêm một phần tử
Button
vào bố cục của hoạt động. - Trích xuất các chuỗi được mã hoá cứng vào một tệp tài nguyên chuỗi.
- Triển khai các phương thức trình xử lý lượt nhấp để hiển thị thông báo trên màn hình khi người dùng nhấn vào một
Button
.
Trong lớp học lập trình này, bạn sẽ tạo một dự án ứng dụng mới có tên là DiceRoller và thêm tính năng tương tác cơ bản bằng một nút. Mỗi khi người dùng nhấp vào nút này, giá trị của văn bản hiển thị sẽ thay đổi. Ứng dụng DiceRoller hoàn chỉnh cho lớp học lập trình này sẽ có dạng như sau:
Trong lớp học lập trình gần đây nhất, bạn đã tìm hiểu về các phần chính của một dự án ứng dụng, bao gồm cả thư mục java
và res
. Trong nhiệm vụ này, bạn sẽ tập trung vào 2 tệp quan trọng nhất tạo nên ứng dụng của mình: Tệp MainActivity
Kotlin và tệp activity_main.xml
bố cục.
Bước 1: Kiểm tra MainActivity
MainActivity
là một ví dụ về Activity
. Activity
là một lớp Android cốt lõi vẽ giao diện người dùng (UI) của ứng dụng Android và nhận các sự kiện đầu vào. Khi ứng dụng của bạn chạy, ứng dụng sẽ chạy hoạt động được chỉ định trong tệp AndroidManifest.xml
.
Nhiều ngôn ngữ lập trình xác định một phương thức chính để khởi động chương trình. Các ứng dụng Android không có phương thức chính. Thay vào đó, tệp AndroidManifest.xml
cho biết rằng MainActivity
sẽ được chạy khi người dùng nhấn vào biểu tượng trình chạy của ứng dụng. Để khởi chạy một hoạt động, hệ điều hành Android sẽ dùng thông tin trong tệp kê khai để thiết lập môi trường cho ứng dụng và tạo MainActivity
. Sau đó, MainActivity
sẽ lần lượt thiết lập một số thành phần.
Mỗi hoạt động đều có một tệp bố cục được liên kết. Hoạt động và bố cục được kết nối bằng một quy trình gọi là tăng cường bố cục. Khi hoạt động bắt đầu, các khung hiển thị được xác định trong tệp bố cục XML sẽ được chuyển thành (hoặc "mở rộng" thành) các đối tượng khung hiển thị Kotlin trong bộ nhớ. Sau khi điều này xảy ra, hoạt động có thể vẽ các đối tượng này lên màn hình và cũng có thể sửa đổi chúng một cách linh động.
- Trong Android Studio, hãy chọn File > New > New Project (Tệp > Mới > Dự án mới) để tạo một dự án mới. Sử dụng Empty activity (Hoạt động trống) rồi nhấp vào Next (Tiếp theo).
- Gọi dự án DiceRoller và xác minh tất cả các giá trị khác cho tên dự án và vị trí dự án. Đảm bảo bạn đã đánh dấu vào ô "Sử dụng cấu phần phần mềm AndroidX". Nhấp vào Hoàn tất.
- Trong ngăn Project > Android (Dự án > Android), hãy mở rộng java > com.example.android.diceroller. Nhấp đúp vào MainActivity. Trình soạn thảo mã cho thấy mã trong
MainActivity
. - Bên dưới tên gói và câu lệnh nhập là phần khai báo lớp cho
MainActivity
. LớpMainActivity
mở rộngAppCompatActivity
.
class MainActivity : AppCompatActivity() { ...
- Lưu ý phương thức
onCreate()
. Các hoạt động không sử dụng hàm khởi tạo để khởi tạo đối tượng. Thay vào đó, một loạt phương thức được xác định trước (gọi là "phương thức vòng đời") sẽ được gọi trong quá trình thiết lập hoạt động. Một trong những phương thức vòng đời đó làonCreate()
. Bạn luôn ghi đè phương thức này trong ứng dụng của riêng mình. Bạn sẽ tìm hiểu thêm về các phương thức vòng đời trong một lớp học lập trình sau này.
TrongonCreate()
, bạn chỉ định bố cục được liên kết với hoạt động và tăng cường bố cục đó. Phương thứcsetContentView()
thực hiện cả hai việc đó.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
Phương thức setContentView()
tham chiếu đến bố cục bằng cách sử dụng R.layout.activity_main
, đây thực chất là một tham chiếu số nguyên. Lớp R
được tạo khi bạn tạo ứng dụng. Lớp R
bao gồm tất cả các thành phần của ứng dụng, kể cả nội dung của thư mục res
.
Trong trường hợp này, R.layout.activity_main
đề cập đến lớp R
, thư mục layout
và tệp bố cục activity_main.xml
đã tạo. (Tài nguyên không bao gồm đuôi tệp.) Bạn sẽ tham chiếu đến nhiều tài nguyên của ứng dụng (bao gồm cả hình ảnh, chuỗi và các phần tử trong tệp bố cục) bằng cách sử dụng các tham chiếu tương tự trong lớp R
.
Bước 2: Kiểm tra và khám phá tệp bố cục ứng dụng
Tất cả các hoạt động trong ứng dụng của bạn đều có một tệp bố cục được liên kết trong thư mục res/layout
của ứng dụng. Tệp bố cục là một tệp XML thể hiện giao diện thực tế của một hoạt động. Tệp bố cục thực hiện việc này bằng cách xác định các thành phần hiển thị và xác định vị trí các thành phần hiển thị xuất hiện trên màn hình.
Chế độ xem là những thứ như văn bản, hình ảnh và nút mở rộng lớp View
. Có nhiều loại khung hiển thị, bao gồm TextView
, Button
, ImageView
và CheckBox
.
Trong nhiệm vụ này, bạn sẽ kiểm tra và sửa đổi tệp bố cục ứng dụng.
- Trong ngăn Project > Android (Dự án > Android), hãy mở rộng res > layout (tài nguyên > bố cục) rồi nhấp đúp vào activity_main.xml. Trình chỉnh sửa thiết kế bố cục sẽ mở ra. Android Studio có trình chỉnh sửa này, cho phép bạn tạo bố cục ứng dụng theo cách trực quan và xem trước thiết kế bố cục. Bạn có thể tìm hiểu thêm về trình chỉnh sửa thiết kế trong một lớp học lập trình sau này.
- Để xem tệp bố cục dưới dạng XML, hãy nhấp vào thẻ Text (Văn bản) ở cuối cửa sổ.
- Xoá tất cả mã XML hiện có trong trình chỉnh sửa bố cục. Bố cục mặc định mà bạn nhận được khi tạo một dự án mới là một điểm khởi đầu tốt nếu bạn đang làm việc với trình chỉnh sửa thiết kế của Android Studio. Trong bài học này, bạn sẽ làm việc với XML cơ bản để tạo một bố cục mới từ đầu.
- Sao chép và dán mã này vào bố cục:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
Bây giờ, hãy xem xét mã:
- Phần tử gốc hoặc cấp cao nhất của bố cục là phần tử
<LinearLayout>
. Chế độ xemLinearLayout
là mộtViewGroup
. Nhóm thành phần hiển thị là những vùng chứa lưu giữ các thành phần hiển thị khác và giúp chỉ định vị trí của các thành phần hiển thị trên màn hình.
Tất cả các thành phần hiển thị và nhóm thành phần hiển thị mà bạn thêm vào bố cục đều được sắp xếp theo một hệ phân cấp thành phần hiển thị, trong đó phần tử XML trên cùng là gốc của hệ phân cấp đó. Khung hiển thị gốc có thể chứa các khung hiển thị và nhóm khung hiển thị khác, đồng thời các nhóm khung hiển thị được chứa có thể chứa các khung hiển thị và nhóm khung hiển thị khác. Khi ứng dụng của bạn chạy, hệ phân cấp thành phần hiển thị trong tệp bố cục XML sẽ trở thành một hệ phân cấp đối tượng khi bố cục được mở rộng. Trong trường hợp này, nhóm khung hiển thị gốc là một bố cục tuyến tính, giúp sắp xếp các khung hiển thị con theo tuyến tính, lần lượt (theo chiều dọc hoặc chiều ngang).
Thư mục gốc mặc định mà bạn nhận được cho một dự án Android mới làConstraintLayout
, hoạt động hiệu quả khi phối hợp với trình chỉnh sửa thiết kế. Đối với ứng dụng này, bạn sử dụng một nhóm thành phần hiển thịLinearLayout
, đơn giản hơn so với bố cục dựa trên ràng buộc. Bạn sẽ tìm hiểu thêm nhiều thông tin về nhóm khung hiển thị và bố cục ràng buộc trong bài học tiếp theo. - Trong thẻ
LinearLayout
, hãy lưu ý đến thuộc tínhandroid:layout_width
. Chiều rộng củaLinearLayout
này được đặt thànhmatch parent
, tức là có cùng chiều rộng với thành phần mẹ. Vì đây là khung hiển thị gốc, nên bố cục sẽ mở rộng ra toàn bộ chiều rộng của màn hình. - Lưu ý thuộc tính
android:layout_height
được đặt thànhwrap_content
. Thuộc tính này làm cho chiều cao củaLinearLayout
khớp với tổng chiều cao của tất cả các khung hiển thị có trong đó, hiện tại chỉ cóTextView
. - Kiểm tra phần tử
<TextView>
.TextView
này (hiển thị văn bản) là thành phần trực quan duy nhất trong ứng dụng DiceRoller. Thuộc tínhandroid:text
chứa chuỗi thực tế cần hiển thị, trong trường hợp này là chuỗi"Hello World!"
- Lưu ý các thuộc tính
android:layout_width
vàandroid:layout_height
trong phần tử<TextView>
. Cả hai thuộc tính này đều được đặt thànhwrap_content
. Nội dung của khung hiển thị văn bản chính là văn bản, vì vậy, khung hiển thị sẽ chỉ chiếm không gian cần thiết cho văn bản.
Ứng dụng đổ xúc xắc sẽ không hữu ích nếu người dùng không thể đổ xúc xắc và xem kết quả. Để bắt đầu, hãy thêm một nút vào bố cục để tung xúc xắc và thêm văn bản cho biết giá trị xúc xắc mà người dùng tung được.
Bước 1: Thêm một nút vào bố cục
- Thêm một phần tử
Button
vào bố cục bên dưới khung hiển thị văn bản bằng cách nhập <Button rồi nhấn phím Return. Một khốiButton
xuất hiện, kết thúc bằng/>
và bao gồm các thuộc tínhlayout_width
vàlayout_height
.
<Button
android:layout_width=""
android:layout_height="" />
- Đặt cả thuộc tính
layout_width
vàlayout_height
thành"wrap_content"
. Với các giá trị này, nút có cùng chiều rộng và chiều cao với nhãn văn bản mà nút chứa. - Thêm một thuộc tính
android:text
vào nút và gán giá trị "Roll" cho thuộc tính đó. Phần tử Nút hiện có dạng như sau:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Roll" />
Đối với các khung hiển thị Button
, thuộc tính text
là nhãn của nút. Trong trình chỉnh sửa bố cục, thuộc tính này được đánh dấu bằng màu vàng, cho biết một mẹo hoặc cảnh báo. Trong trường hợp này, màu vàng được dùng để làm nổi bật vì chuỗi "Roll"
được mã hoá cứng trong nhãn nút, nhưng chuỗi này phải là một tài nguyên. Bạn sẽ tìm hiểu về tài nguyên chuỗi trong phần tiếp theo.
Bước 2: Trích xuất tài nguyên chuỗi
Thay vì mã hoá cứng các chuỗi trong tệp bố cục hoặc tệp mã, bạn nên đưa tất cả các chuỗi của ứng dụng vào một tệp riêng biệt. Tệp này có tên là strings.xml
và nằm trong số các tài nguyên của ứng dụng, trong thư mục res/values/
.
Việc lưu trữ các chuỗi trong một tệp riêng biệt giúp bạn quản lý các chuỗi này dễ dàng hơn, đặc biệt là nếu bạn sử dụng các chuỗi này nhiều lần. Ngoài ra, tài nguyên chuỗi là bắt buộc để dịch và bản địa hoá ứng dụng, vì bạn cần tạo một tệp tài nguyên chuỗi cho mỗi ngôn ngữ.
Android Studio giúp bạn nhớ đặt các chuỗi vào một tệp tài nguyên bằng các gợi ý và cảnh báo.
- Nhấp một lần vào chuỗi "Roll" trong thuộc tính
android:text
của thẻ<Button>
. - Nhấn
Alt+Enter
(Option+Enter
trong macOS) rồi chọn Trích xuất tài nguyên chuỗi trong trình đơn bật lên. - Nhập
roll_label
cho Tên tài nguyên. - Nhấp vào OK. Một tài nguyên chuỗi được tạo trong tệp
res/values/string.xml
và chuỗi trong phần tử Nút được thay thế bằng một tham chiếu đến tài nguyên đó:android:text="@string/roll_label"
- Trong ngăn Project > Android (Dự án > Android), hãy mở rộng res > values (tài nguyên > giá trị), rồi nhấp đúp vào strings.xml để xem tài nguyên chuỗi trong tệp
strings.xml
:
<resources>
<string name="app_name">DiceRoller</string>
<string name="roll_label">Roll</string>
</resources>
Bước 3: Tạo kiểu và định vị khung hiển thị
Bố cục của bạn hiện chứa một khung hiển thị TextView
và một khung hiển thị Button
. Trong nhiệm vụ này, bạn sẽ sắp xếp các khung hiển thị trong nhóm khung hiển thị để trông hấp dẫn hơn.
- Nhấp vào thẻ Thiết kế để xem trước bố cục. Hiện tại, cả hai khung hiển thị đều nằm cạnh nhau và được đẩy lên đầu màn hình.
- Nhấp vào thẻ Text (Văn bản) để quay lại trình chỉnh sửa XML. Thêm thuộc tính
android:orientation
vào thẻLinearLayout
, sau đó gán giá trị"vertical"
cho thuộc tính này. Phần tử<LinearLayout>
giờ đây sẽ có dạng như sau:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
Nhóm khung hiển thị LinearLayout
sẽ đặt các khung hiển thị mà nhóm này chứa lần lượt theo một đường thẳng, theo chiều ngang trong một hàng hoặc theo chiều dọc trong một ngăn xếp. Hướng ngang là hướng mặc định. Vì bạn muốn TextView
xếp chồng lên Button
, nên bạn hãy đặt hướng thành dọc. Thiết kế hiện sẽ có dạng như sau, với nút ở bên dưới văn bản:
- Thêm thuộc tính
android:layout_gravity
vào cảTextView
vàButton
, sau đó gán giá trị"center_horizontal"
cho thuộc tính này. Thao tác này sẽ căn chỉnh cả hai khung hiển thị dọc theo tâm của trục ngang. Các phần tử TextView và Button giờ đây sẽ có dạng như sau:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Hello World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
- Thêm thuộc tính
android:layout_gravity
vào bố cục tuyến tính và gán giá trị"center_vertical"
cho thuộc tính đó. Phần tửLinearLayout
của bạn hiện sẽ có dạng như sau:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
tools:context=".MainActivity">
- Để tăng kích thước của văn bản trong chế độ xem văn bản, hãy thêm thuộc tính
android:textSize
vào phần tử<TextView>
với giá trị"30sp"
. Chữ viết tắt sp là viết tắt của pixel có thể mở rộng, đây là một đơn vị đo lường để định cỡ văn bản mà không phụ thuộc vào chất lượng màn hình của thiết bị. Phần tử TextView hiện sẽ có dạng như sau:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="30sp"
android:text="Hello World!" />
- Biên dịch và chạy ứng dụng của bạn.
Giờ đây, cả văn bản và nút đều được đặt ở vị trí phù hợp, đồng thời có văn bản lớn hơn trong khung hiển thị văn bản. Nút này chưa có chức năng nào, nên không có gì xảy ra khi bạn nhấp vào nút. Bạn sẽ làm việc đó ở bước tiếp theo.
Bước 4: Lấy một tham chiếu đến nút trong mã
Mã Kotlin trong MainActivity
chịu trách nhiệm xác định các phần tương tác của ứng dụng, chẳng hạn như những gì xảy ra khi bạn nhấn vào một nút. Để viết một hàm thực thi khi người dùng nhấp vào nút, bạn cần lấy một tham chiếu đến đối tượng Nút trong bố cục được mở rộng trong MainActivity. Cách lấy một tham chiếu đến nút:
- Chỉ định mã nhận dạng cho
Button
trong tệp XML. - Sử dụng phương thức
findViewById()
trong mã để lấy một tham chiếu đếnView
có mã nhận dạng cụ thể.
Sau khi có một tham chiếu đến khung hiển thị Button
, bạn có thể gọi các phương thức trên khung hiển thị đó để thay đổi khung hiển thị một cách linh động khi ứng dụng chạy. Ví dụ: bạn có thể thêm một trình xử lý lượt nhấp để thực thi mã khi người dùng nhấn vào nút.
- Mở tệp bố cục
activity_main.xml
(nếu chưa mở) rồi nhấp vào thẻ Text (Văn bản). - Thêm thuộc tính
android:id
vào nút và đặt tên cho nút (trong trường hợp này là "@+id/roll_button"
). Phần tử<Button>
của bạn hiện có dạng như sau:
<Button
android:id="@+id/roll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll_label" />
Khi bạn tạo một mã nhận dạng cho một khung hiển thị trong tệp bố cục XML, Android Studio sẽ tạo một hằng số nguyên có tên của mã nhận dạng đó trong lớp R
đã tạo. Vì vậy, nếu bạn đặt tên cho một khung hiển thị là roll_button
, thì Android Studio sẽ tạo một hằng số nguyên có tên là roll_button
trong lớp R
. Tiền tố "@+id"
cho tên mã nhận dạng cho trình biên dịch biết để thêm hằng số mã nhận dạng đó vào lớp R. Tất cả mã nhận dạng thành phần hiển thị trong tệp XML của bạn đều phải có tiền tố này.
- Mở tệp
MainActivity
Kotlin. Bên trongonCreate()
, sausetContentView()
, hãy thêm dòng này:
val rollButton: Button = findViewById(R.id.roll_button)
Sử dụng phương thức findViewById()
để lấy một giá trị tham chiếu View
cho khung hiển thị mà bạn đã xác định trong lớp XML. Trong trường hợp này, bạn sẽ nhận được tham chiếu Button
từ lớp R
và mã nhận dạng roll_button
, đồng thời chỉ định tham chiếu đó cho biến rollButton
.
- Lưu ý rằng Android Studio sẽ làm nổi bật lớp
Button
bằng màu đỏ và gạch chân lớp này để cho biết đây là một tham chiếu chưa được giải quyết và bạn cần nhập lớp này trước khi có thể sử dụng. Chú giải công cụ cho biết tên lớp đủ điều kiện cũng có thể xuất hiện: - Nhấn
Alt+Enter
(Option+Enter
trên máy Mac) để chấp nhận tên lớp đủ điều kiện.
Bước 5: Thêm một trình xử lý lượt nhấp để hiển thị thông báo tạm thời
Trình xử lý lượt nhấp là một phương thức được gọi mỗi khi người dùng nhấp hoặc nhấn vào một phần tử có thể nhấp trên giao diện người dùng, chẳng hạn như một nút. Để tạo một trình xử lý lượt nhấp, bạn cần:
- Một phương thức thực hiện một số thao tác.
- Phương thức
setOnClickHandler()
kết nốiButton
với phương thức trình xử lý.
Trong nhiệm vụ này, bạn sẽ tạo một phương thức trình xử lý lượt nhấp để hiển thị Toast
. (Thông báo ngắn là một thông báo xuất hiện trên màn hình trong một khoảng thời gian ngắn.) Bạn kết nối phương thức trình xử lý lượt nhấp với Button
.
- Trong lớp
MainActivity
sauonCreate()
, hãy tạo một hàm riêng tư tên làrollDice()
.
private fun rollDice() {
}
- Thêm dòng này vào phương thức
rollDice()
để hiển thịToast
khirollDice()
được gọi:
Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
Để tạo một thông báo ngắn, hãy gọi phương thức Toast.makeText()
. Phương thức này yêu cầu 3 điều kiện:
- Một đối tượng
Context
. Đối tượngContext
cho phép bạn giao tiếp và nhận thông tin về trạng thái hiện tại của hệ điều hành Android. Bạn cần mộtContext
ở đây để đối tượngToast
có thể yêu cầu hệ điều hành hiển thị thông báo. VìAppCompatActivity
là một lớp con củaContext
, nên bạn chỉ cần sử dụng từ khoáthis
cho ngữ cảnh. - Thông báo sẽ xuất hiện ở đây
"button clicked"
. - khoảng thời gian hiển thị thông báo. Phương thức
show()
ở cuối sẽ hiển thị thông báo.
- Trong
onCreate()
, sau khi gọifindViewById()
, hãy thêm dòng này để chỉ địnhrollDice()
làm trình xử lý lượt nhấp cho đối tượngrollButton
:
rollButton.setOnClickListener { rollDice() }
Định nghĩa đầy đủ về lớp MainActivity
của bạn giờ đây có dạng như sau:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.setOnClickListener { rollDice() }
}
private fun rollDice() {
Toast.makeText(this, "button clicked",
Toast.LENGTH_SHORT).show()
}
}
- Biên dịch và chạy ứng dụng của bạn. Mỗi lần bạn nhấn vào nút, một thông báo tạm thời sẽ xuất hiện.
Trong nhiệm vụ này, bạn sẽ sửa đổi phương thức rollDice()
để thay đổi văn bản trong TextView
. Đối với bước đầu tiên, bạn sẽ thay đổi văn bản đó từ "Hello World!"
thành chuỗi "Dice Rolled!"
. Đối với bước thứ hai, bạn hiển thị một số ngẫu nhiên từ 1 đến 6.
Bước 1: Hiển thị một chuỗi
- Mở
activity_main.xml
rồi thêm một mã nhận dạng vàoTextView
.
android:id="@+id/result_text"
- Mở
MainActivity
. Trong phương thứcrollDice()
, hãy đánh dấu ghi chú vào dòng mã để hiển thịToast
. - Sử dụng phương thức
findViewById()
để lấy tham chiếu đếnTextView
theo mã nhận dạng của đối tượng này. Chỉ định tham chiếu cho một biếnresultText
.
val resultText: TextView = findViewById(R.id.result_text)
- Chỉ định một chuỗi mới cho thuộc tính
resultText.text
để thay đổi văn bản hiển thị. Bạn có thể bỏ qua gợi ý trích xuất chuỗi đó thành một tài nguyên; đây chỉ là một chuỗi tạm thời.
resultText.text = "Dice Rolled!"
- Biên dịch và chạy ứng dụng. Lưu ý rằng thao tác nhấn vào nút Roll (Đổ xúc xắc) hiện sẽ cập nhật
TextView
.
Bước 2: Hiển thị một số ngẫu nhiên
Cuối cùng, trong nhiệm vụ này, bạn sẽ thêm tính ngẫu nhiên vào lượt nhấp nút để mô phỏng việc đổ xúc xắc. Mỗi khi người dùng nhấp hoặc nhấn vào nút này, mã của bạn sẽ chọn một số ngẫu nhiên từ 1 đến 6 và cập nhật TextView
. Nhiệm vụ tạo số ngẫu nhiên không dành riêng cho Android và bạn sẽ dùng lớp Random
để thực hiện nhiệm vụ này.
- Ở đầu phương thức
rollDice()
, hãy dùng phương thứcRandom.nextInt()
để lấy một số ngẫu nhiên từ 1 đến 6:
val randomInt = Random().nextInt(6) + 1
- Đặt thuộc tính
text
thành giá trị của số nguyên ngẫu nhiên, dưới dạng chuỗi:
resultText.text = randomInt.toString()
- Biên dịch và chạy ứng dụng. Mỗi lần bạn nhấn vào nút Roll (Đổ xúc xắc), số trong khung hiển thị văn bản sẽ thay đổi.
Dự án Android Studio: DiceRoller
Thử thách: Thêm một nút thứ hai vào ứng dụng có nhãn "Count Up" (Đếm lên) xuất hiện ngay bên dưới nút Roll (Tung xúc xắc). Khi được nhấn, nút Count Up (Đếm lên) sẽ lấy giá trị hiện tại của chế độ xem văn bản kết quả, cộng thêm 1 và cập nhật chế độ xem văn bản. Đảm bảo bạn xử lý những trường hợp đặc biệt sau:
- Nếu khung hiển thị văn bản kết quả chưa chứa một số (tức là nếu khung hiển thị văn bản vẫn có chuỗi "Hello World" mặc định), hãy đặt văn bản kết quả thành 1.
- Nếu số lượng đã là 6, bạn không cần làm gì cả.
Đoạn mã giải pháp cho thử thách lập trình
Dự án Android Studio: DiceRoller-challenge
Hoạt động
MainActivity
là một lớp con củaAppCompatActivity
, vàAppCompatActivity
lại là một lớp con củaActivity
.Activity
là một lớp Android cốt lõi, chịu trách nhiệm vẽ giao diện người dùng của ứng dụng Android và nhận các sự kiện đầu vào.- Tất cả các hoạt động đều có một tệp bố cục được liên kết, đó là một tệp XML trong tài nguyên của ứng dụng. Tệp bố cục được đặt tên theo hoạt động, ví dụ:
activity_main.xml
. - Phương thức
setContentView()
trongMainActivity
liên kết bố cục với hoạt động và tăng cường bố cục đó khi hoạt động được tạo. - Tăng cường bố cục là một quy trình trong đó các thành phần hiển thị được xác định trong tệp bố cục XML sẽ được chuyển thành (hoặc "tăng cường" thành) các đối tượng thành phần hiển thị Kotlin trong bộ nhớ. Sau khi quá trình mở rộng bố cục diễn ra,
Activity
có thể vẽ các đối tượng này lên màn hình và sửa đổi chúng một cách linh hoạt.
Khung hiển thị
- Tất cả các phần tử trên giao diện người dùng trong bố cục ứng dụng đều là lớp con của lớp
View
và được gọi là khung hiển thị.TextView
vàButton
là ví dụ về các khung hiển thị. - Các phần tử
View
có thể được nhóm bên trong mộtViewGroup
. Một nhóm thành phần hiển thị đóng vai trò là vùng chứa cho các thành phần hiển thị hoặc các nhóm thành phần hiển thị khác trong đó.LinearLayout
là một ví dụ về nhóm khung hiển thị sắp xếp các khung hiển thị theo tuyến tính.
Xem thuộc tính
- Các thuộc tính
android:layout_width
vàandroid:layout_height
cho biết trọng số và chiều cao của một khung hiển thị. Giá trịmatch_parent
kéo dài khung hiển thị theo chiều rộng hoặc chiều cao của phần tử mẹ. Giá trịwrap_content
sẽ thu nhỏ khung hiển thị để vừa với nội dung của khung hiển thị. - Thuộc tính
android:text
cho biết văn bản mà một khung hiển thị sẽ hiển thị (nếu khung hiển thị đó hiển thị văn bản). Đối với các nút,android:text
là nhãn nút. - Thuộc tính
android:orientation
trong một nhóm khung hiển thịLinearLayout
sắp xếp các phần tử khung hiển thị mà nhóm đó chứa. Giá trịhorizontal
sắp xếp các thành phần hiển thị từ trái sang phải. Giá trịvertical
sắp xếp các khung hiển thị từ trên xuống dưới. - Thuộc tính
android:layout_gravity
xác định vị trí của một khung hiển thị và tất cả các phần tử con của khung hiển thị đó. - Thuộc tính
android:textSize
xác định kích thước của văn bản trong một chế độ xem văn bản. Kích thước văn bản được chỉ định bằng đơn vị sp (pixel có thể mở rộng). Bằng cách sử dụng đơn vị sp, bạn có thể điều chỉnh kích thước văn bản mà không phụ thuộc vào chất lượng màn hình của thiết bị.
Chuỗi
- Thay vì mã hoá cứng các chuỗi trong bố cục, bạn nên sử dụng tài nguyên chuỗi.
- Tài nguyên chuỗi có trong tệp
values/res/string.xml
. - Để trích xuất chuỗi, hãy sử dụng
Alt+Enter
(Option+Enter
trên máy Mac). Chọn Trích xuất tài nguyên chuỗi trong trình đơn bật lên.
Sử dụng chế độ xem
- Để kết nối mã Kotlin với một khung hiển thị mà bạn đã xác định trong bố cục, bạn cần lấy một tham chiếu đến đối tượng khung hiển thị sau khi khung hiển thị được mở rộng. Chỉ định một mã nhận dạng (
android:id
) cho khung hiển thị trong bố cục, sau đó dùng phương thứcfindViewById()
để lấy đối tượng khung hiển thị được liên kết. - Khi bạn tạo một mã nhận dạng cho một khung hiển thị trong tệp bố cục XML, Android Studio sẽ tạo một hằng số nguyên có tên của mã nhận dạng đó trong lớp
R
đã tạo. Sau đó, bạn có thể sử dụng tham chiếuR.id
đó trong phương thứcfindViewById()
. - Bạn có thể đặt trực tiếp các thuộc tính của một đối tượng thành phần hiển thị trong mã Kotlin theo tên thuộc tính. Ví dụ: văn bản trong một thành phần hiển thị văn bản được xác định bằng thuộc tính
android:text
trong XML và được xác định bằng thuộc tínhtext
trong Kotlin. - Trình xử lý lượt nhấp là một phương thức được gọi khi người dùng nhấp hoặc nhấn vào một phần tử trên giao diện người dùng. Để đính kèm một phương thức xử lý lượt nhấp vào một khung hiển thị (chẳng hạn như nút), hãy sử dụng phương thức
setOnClickListener()
.
Sử dụng thông báo dạng toast
Thông báo ngắn là một khung hiển thị cho người dùng thấy một thông báo đơn giản trong một cửa sổ nhỏ bật lên.
Để tạo một thông báo dạng toast, hãy gọi phương thức của nhà máy makeText()
trên lớp Toast
bằng 3 đối số:
- Bối cảnh của ứng dụng
Activity
- Thông báo cần hiển thị, ví dụ: tài nguyên chuỗi
- Khoảng thời gian, ví dụ:
Toast.LENGTH_SHORT
Để hiển thị thông báo ngắn, hãy gọi show()
.
Khoá học của Udacity:
Tài liệu dành cho nhà phát triển Android:
- Làm quen với Android Studio
- Bố cục
View
Button
TextView
- Tổng quan về tài nguyên ứng dụng
- Tổng quan về sự kiện đầu vào
findViewById()
setOnClickListener()
Context
Khác:
Phần này liệt kê các bài tập về nhà cho học viên của lớp học lập trình này trong phạm vi khoá học có người hướng dẫn. Người hướng dẫn phải thực hiện các việc sau đây:
- Giao bài tập về nhà nếu cần.
- Trao đổi với học viên về 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 các đề xuất này ít hoặc nhiều tuỳ ý và nên giao cho học viên 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ự học các lớp học lập trình, hãy sử dụng những bài tập về nhà này để kiểm tra kiến thức của mình.
Thay đổi ứng dụng
Mở ứng dụng DiceRoller. Thêm một nút có nhãn "Đặt lại" vào ứng dụng. Nút này sẽ xuất hiện ngay bên dưới nút Đổ xúc xắc. Hãy đặt nút đó để đặt lại khung hiển thị văn bản kết quả thành 0.
Trả lời các câu hỏi sau
Câu hỏi 1
Phương thức nào trên Activity
làm tăng cường bố cục của ứng dụng và làm xuất hiện các thành phần hiển thị dưới dạng đối tượng?
onCreate()
setClickListener()
setContentView()
show()
Câu hỏi 2
Bạn sử dụng thuộc tính khung hiển thị nào để thiết lập chiều rộng của một khung hiển thị sao cho khung đó sẽ điều chỉnh cho vừa với nội dung bên trong?
android:view_width="wrap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="match_parent"
Gửi ứng dụng của bạn để được chấm điểm
Kiểm tra để đảm bảo ứng dụng có những đặc điểm sau:
- Bố cục ứng dụng phải có một khung hiển thị văn bản và hai nút.
- Mã của ứng dụng phải đặt hai trình xử lý lượt nhấp, mỗi trình xử lý cho một nút.
- Trình xử lý lượt nhấp đặt lại chế độ xem văn bản phải đặt thuộc tính văn bản thành 0.
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 khoá học này, hãy xem trang đích của lớp học lập trình Kiến thức cơ bản về cách tạo ứng dụng Android bằng Kotlin.