Lập trình Android bằng Java (3): Làm quen với một số điều khiển

Bài trước: Lập trình Android bằng Java (2): Chương trình đầu tiên

-----

3. Làm quen với một số điều khiển

3.1 Thêm điều khiển cho giao diện

Ở bài học trước, chúng ta đã biết:

- Khi khởi chạy một ứng dụng, hệ điều hành Android sẽ đọc và thực thi nội dung của AndroidManifest.xml

- Dựa vào chỉ dẫn trong AndroidManifest.xml, Android sẽ đọc và thực thi mã nguồn trong MainActivity.java

- Mã nguồn trong MainActivity.java sẽ nạp giao diện từ activity_main.xml

Xem hình minh họa:

Chúng ta sẽ thêm một số điều khiển (nhãn, ô nhập văn bản, nút) cho màn hình MainActivity, bằng cách thiết kế, chỉnh sửa trên tập tin activity_main.xml.

- Trong giao diện Android Studio, mở tập tin activity_main.xml > giao diện thiết kế của activity_main.xml sẽ xuất hiện

- Khung Palette: (bên trái) gồm các điều khiển, muốn thêm điều khiển cho giao diện, chọn một điều khiển, kéo thả vào cửa sổ giao diện (vùng giữa)

- Cửa sổ giao diện: (vùng giữa) chứa giao diện đang được thiết kế

- Khung chuyển chế độ xem: (phía trên, bên phải) cho phép bạn xem activity_main.xml ở chế độ thiết kế (design), chế độ mã nguồn (code) hoặc cả hai

- Khung Attributes: (bên phải) cho phép thiết lập các thuộc tính cho đối tượng thiết kế

Thêm các điều khiển cho giao diện:

TextView

- id: txtXinChao

Cách làm: ở cửa sổ giao diện, chọn TextView chúng ta đã tạo ở bài học trước, có nội dung “chao bac Teo!”, hoặc bạn có thể kéo thả một TextView mới > Khung Attributes, mục id, thêm nội dung txtXinChao. Nội dung trong id là tên duy nhất của TextView trong ứng dụng, chúng ta sẽ tham chiếu (truy cập) tới TextView thông qua id. Có nhiều quy tắc đặt tên cho id, ví dụ phần đầu txt là viết tắt của TextView, phần sau XinChao là tên của TextView.

Button

- id: btnChao

- text: Chào

Cách làm: kéo một Button từ Palette thả vào cửa sổ giao diện. Điền thông tin btnChao vào thuộc tính id; điền chữ Chào vào thuộc tính text.

Plain Text

- id: editTxtTen

- text: (để trắng)

- hint: Nhập tên

Cách làm: kéo một Plain Text từ Palette thả vào cửa sổ giao diện. Điền thông tin editTxtTen vào thuộc tính id; thuộc tính text để trắng, thuộc tính hint điền Nhập tên.

Kết quả giao diện sẽ như sau:

- Bấm nút Run app để chạy ứng dụng, bạn sẽ thấy các điều khiển xuất hiện trên màn hình điện thoại, tuy nhiên vị trí của chúng bị xáo trộn. Nguyên nhân là do chúng ta chưa neo (anchor) các điều khiển với nhau, và neo vào màn hình.

- Bấm chuột vào điều khiển, sẽ xuất hiện 4 nút chấm tròn ở đường viền, bạn bấm vào nút chấm tròn, giữ và kéo về cạnh của điện thoại, sẽ xuất hiện mũi tên để bạn neo vào cạnh của điện thoại. Thực hiện neo điều khiển về 2 phía của điện thoại, và neo vào điều khiển phía trên. Xem hình minh họa.


- Bấm nút Run app để chạy lại ứng dụng, bạn sẽ thấy các điều khiển đã được cố định.

3.2 Viết mã xử lý cho các điều khiển

Với giao diện đã thiết kế, chúng ta sẽ viết mã Java để xử lý như sau:

- Cho người dùng nhập tên vào ô Nhập tên

- Khi người dùng bấm nút Chào, sẽ lấy chuỗi trong ô Nhập tên hiển thị trên ô “chao bac Teo!, thay đổi chuỗi hiển thị thành chao bac [chuỗi]!. Ví dụ, người dùng nhập chữ vào ô Nhập tên, thì sẽ xuất chuỗi chao bac Tí!.

Thực hiện:

- Mở tập tin activity_main.xml ở chế độ lập trình (Code), trong phần tử Button, thêm thuộc tính lắng nghe sự kiện click (onClick), hàm xử lý cho sự kiện click là onBtnClick.

[activity_main.xml]

<Button

   

   app:layout_constraintStart_toStartOf="parent"

   app:layout_constraintTop_toBottomOf="@+id/editTxtTen"

   android:onClick="onBtnClick"/>

- Trong tập tin MainActivity.java, phần import, thêm 2 thư viện: 

import android.widget.TextView;

import android.widget.EditText;

- Trong tập tin MainActivity.java, lớp MainActivity, thêm hàm onBtnClick:  

public class MainActivity extends AppCompatActivity {

protected void onCreate(Bundle savedInstanceState) { 

……

}

public void onBtnClick(View view) {

  // tạo biến tham chiếu tới chuỗi hiển thị, sử dụng lớp R

  TextView txtXinChao =  findViewById(R.id.txtXinChao);

  // tạo biến tham chiếu tới ô nhập liệu

   EditText editTxtTen = findViewById(R.id.editTxtTen);

   // lấy tên lưu vào chuỗi ten

   String ten = editTxtTen.getText().toString();

   // hiển thị câu chào

   txtXinChao.setText("chao bac " + ten + "!");

}

}

- Bấm nút Run app để chạy ứng dụng, nhập tên và bấm nút Chào để xem kết quả. Xem hình minh họa.

3.3 Tạo màn hình Register

Chúng ta cùng làm một màn hình Register đơn giản, để luyện tập một số kĩ năng thiết kế và xử lý các điều khiển.

Màn hình Register gồm:

- 3 ô nhập văn bản, để người dùng nhập First Name, Last Name và Email

- 1 nút REGISTER

- 3 nhãn (text view) để hiển thị First Name, Last Name và Email (sau khi người dùng nhập thông tin và bấm nút REGISTER)

Thực hiện:

- Trong giao diện của Android Studio, vào menu File > Close Project để đóng dự án đang mở (nếu có dự án đang mở)

- Tạo dự án mới: New Project > Phone and Tablet > Empty Views Activity > đặt tên cho dự án là Register.

- Thiết kế giao diện: mở tập tin activity_main.xml, xóa TextView HelloWorld, thêm 3 ô nhập liệu (Plain Text), 1 nút (Button), 3 nhãn (TextView)

TextView First Name

- id: editTxtFirstName

- hint: First Name

- text: (empty)

TextView Last Name

- id: editTxtLastName

- hint: Last Name

- text: (empty)

TextView Last Name

- id: editTxtEmail

- hint: Email

- text: (empty)

Button REGISTER

- id: btnRegister

- text: REGISTER

- onClick: onBtnRegisterClick

TextView First Name

- id: txtFirstName

- text: First Name

TextView Last Name

- id: txtLastName

- text: Last Name

Neo (constraint) TextView First Name vào 2 cạnh màn hình điện thoại, margin top 100. Các điều khiển còn lại neo 2  bên, và neo phía trên lên điều khiển kề trên, margin top 25.

[activity_main.xml (design)]


[activity_main.xml (code)]

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:id="@+id/main"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity">

 

   <EditText

       android:id="@+id/editTxtFirstName"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="100dp"

       android:ems="10"

       android:hint="First Name"

       android:inputType="text"

       app:layout_constraintEnd_toEndOf="parent"

       app:layout_constraintStart_toStartOf="parent"

       app:layout_constraintTop_toTopOf="parent" />

 

   <EditText

       android:id="@+id/editTxtLastName"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:ems="10"

       android:hint="Last Name"

       android:inputType="text"

       app:layout_constraintEnd_toEndOf="@+id/editTxtFirstName"

       app:layout_constraintStart_toStartOf="@+id/editTxtFirstName"

       app:layout_constraintTop_toBottomOf="@+id/editTxtFirstName" />

 

   <EditText

       android:id="@+id/editTxtEmail"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:ems="10"

       android:hint="Email"

       android:inputType="text"

       app:layout_constraintEnd_toEndOf="@+id/editTxtLastName"

       app:layout_constraintStart_toStartOf="@+id/editTxtLastName"

       app:layout_constraintTop_toBottomOf="@+id/editTxtLastName" />

 

   <Button

       android:id="@+id/btnRegister"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:onClick="onBtnRegisterClick"

       android:text="REGISTER"

       app:layout_constraintEnd_toEndOf="@+id/editTxtEmail"

       app:layout_constraintStart_toStartOf="@+id/editTxtEmail"

       app:layout_constraintTop_toBottomOf="@+id/editTxtEmail" />

 

   <TextView

       android:id="@+id/txtFirstName"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:text="First Name"

       app:layout_constraintEnd_toEndOf="@+id/btnRegister"

       app:layout_constraintStart_toStartOf="@+id/btnRegister"

       app:layout_constraintTop_toBottomOf="@+id/btnRegister" />

 

   <TextView

       android:id="@+id/txtLastName"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:text="Last Name"

       app:layout_constraintEnd_toEndOf="@+id/txtFirstName"

       app:layout_constraintStart_toStartOf="@+id/txtFirstName"

       app:layout_constraintTop_toBottomOf="@+id/txtFirstName" />

 

   <TextView

       android:id="@+id/txtEmail"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="25dp"

       android:text="Email"

       app:layout_constraintEnd_toEndOf="@+id/txtLastName"

       app:layout_constraintStart_toStartOf="@+id/txtLastName"

       app:layout_constraintTop_toBottomOf="@+id/txtLastName" />

</androidx.constraintlayout.widget.ConstraintLayout>

Trong MainActivity.java, viết hàm onBtnRegisterClick:

public void onBtnRegisterClick(View view) {

   TextView txtFirstName = findViewById(R.id.txtFirstName);

   TextView txtLastName = findViewById(R.id.txtLastName);

   TextView txtEmail = findViewById(R.id.txtEmail);

 

   EditText edtTxtFirstName = findViewById(R.id.editTxtFirstName);

   EditText edtTxtLastName = findViewById(R.id.editTxtLastName);

   EditText edtTxtEmail = findViewById(R.id.editTxtEmail);

 

   txtFirstName.setText("First Name: " + edtTxtFirstName.getText().toString());

   txtLastName.setText("Last Name: " + edtTxtLastName.getText().toString());

   txtEmail.setText("Email: " + edtTxtEmail.getText().toString());

}

Bấm Run app để xem kết quả:

3.4 Bài tập

1. Thuộc tính id của một điều khiển dùng để làm gì? Phát biểu nào không đúng?

A. Là giá trị sẽ được hiển thị lên giao diện của điều khiển  

B. Là tên duy nhất của một điều khiển trong ứng dụng

C. Được sử dụng để tham chiếu tới điều khiển khi lập trình xử lý

D. Nên học cách đặt tên cho id theo chuẩn, để việc lập trình dễ dàng và chuyên nghiệp

2. Điều khiển nào để tạo ra ô nhập liệu? Phát biểu nào đúng?

A. Button

B. TextView

C. Plain Text

D. Palette

3. Làm lại các ví dụ trong bài học.

---

Gợi ý làm bài tập

1(A), 2(C)

-----

Cập nhật: 23/1/2025

-----

Bài sau: