[Công nghệ Thông tin] -- [Web] -- [Công nghệ phần mềm] -- [PhoThong] -- [Đăng ký các khóa học] -- [Langbiang's Portfolio] -- [Học viên cũ] -- [10.000 giờ]
--------------- <> -----------------
---  KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM --->>>  CÁC KHÓA HỌC...
---  Nhận làm website, web app, chạy quảng cáo, digital marketing --->>>  LIÊN HỆ...

Tìm kiếm trong Blog

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: Lập trình Android bằng Java (4): Activity và intent

Thói quen chưa tốt > hậu quả > cách sửa

Ghi lại vài trải nghiệm của bản thân. Hi vọng có thêm thông tin cho các bạn.


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

Bài trước: Lập trình Android bằng Java (1): Lập trình cho thiết bị di động

-----

2. Tạo chương trình đầu tiên

Ở bài học trước, chúng ta đã cài đặt xong môi trường lập trình. Bao gồm:

- Trình dịch và thực thi mã Java (JDK)

- Công cụ lập trình tích hợp (Android Studio)

- Công cụ phát triển ứng dụng cho Android (Android SDK)

- Tạo được điện thoại giả lập

Trong đó, Android Studio là công cụ nền tảng, được sử dụng để gắn kết các công cụ liên quan lại với nhau, giúp bạn lập trình được tiện lợi. Xem hình minh họa:

2.1 Chương trình Hello World!

Chúng ta cùng tạo một dự án, để xuất dòng chữ “Hello World!” ra màn hình điện thoại.

Mở Android Studio > Project > New Project > Phone and Tablet > Empty Views Activity > Next

Điền các thông tin:

- Name: tên dự án, ví dụ TeoFirstApp

- Save location: nơi lưu dự án trên đĩa cứng, ví dụ E:\Android_Code\TeoFirstApp

- Language: ngôn ngữ lập trình, ví dụ Java. 

Bấm Finish để hoàn thành.

Đây là giao diện của Android Studio sau khi tạo dự án TeoFirstApp:


Giao diện của Android Studio gồm 3 khu vực chính:

- Cây thư mục của dự án (khung bên trái)

- Thanh công cụ (phía trên), trong đó có nút Run app, để chạy dự án

- Cửa sổ thiết kế giao diện, soạn thảo mã nguồn (khung lớn ở giữa)

Bấm nút Run app để chạy dự án. Nếu chạy thành công, bạn sẽ thấy kết quả là dòng chữ Hello World! xuất hiện trên điện thoại: 

Bạn cần bật nút nguồn của điện thoại (nếu chưa bật) để xem kết quả. 

Bấm nút Stop app trên thanh công cụ của Android Studio để dừng chương trình.

Chúc mừng bạn đã tạo được chương trình đầu tiên cho thiết bị di động.

2.2 Một số thành phần của dự án Android

Trong giao diện của Android Studio, quan sát cây thư mục của dự án có tên là app (khung bên trái), gồm 3 thư mục:

- manifests: chứa tập tin AndroidManifest.xml, là tập tin chứa các thông tin cấu hình quan trọng của ứng dụng

- java: chứa các tập tin mã nguồn Java

- res: chứa các tài nguyên khác của dự án, như hình ảnh, tập tin thiết kế giao diện, định nghĩa các giá trị

Bạn có thể dùng File Explorer để mở và quan sát các thư mục này trong đĩa cứng:


2.3 Quá trình khởi chạy một ứng dụng

Sau khi bấm nút Run app (trong Android Studio) thì quá trình khởi chạy một ứng dụng Android diễn ra như thế nào? 

Đầu tiên, hệ điều hành Android sẽ đọc và thực thi nội dung trong tập tin AndroidManifest.xml.

AndroidManifest.xml

Manifest: nghĩa thông thường là danh mục người và hàng hóa sẽ được vận chuyển trong một chuyến bay.

Trong Android Studio, thư mục manifests chứa tập tin AndroidManifest.xml, là tập tin chứa các thông tin cấu hình quan trọng của ứng dụng. 

Nội dung của tập tin AndroidManifest.xml:

[AndroidManifest.xml]

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

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

   <application

       android:allowBackup="true"

       android:dataExtractionRules="@xml/data_extraction_rules"

       android:fullBackupContent="@xml/backup_rules"

       android:icon="@mipmap/ic_launcher"

       android:label="@string/app_name"

       android:roundIcon="@mipmap/ic_launcher_round"

       android:supportsRtl="true"

       android:theme="@style/Theme.TeoFirstApp"

       tools:targetApi="31">

       <activity

           android:name=".MainActivity"

           android:exported="true">

           <intent-filter>

               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />

           </intent-filter>

       </activity>

   </application>

</manifest>

Khi chạy ứng dụng, tập tin AndroidManifest.xml sẽ được đọc và thực thi đầu tiên. Dựa vào thông tin khai báo trong AndroidManifest.xml, hệ điều hành Android thực hiện các xử lý tương ứng.

Để đơn giản, phần này chỉ tập trung tìm hiểu luồng xử lý chính.

 <activity

           android:name=".MainActivity"

           android:exported="true">

           <intent-filter>

               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />

           </intent-filter>

 </activity>

Phần tử <activity> định nghĩa một cửa sổ giao diện (hay màn hình, screen, user interface) cho ứng dụng. Trong lập trình Android, mỗi màn hình được gọi là một Activity.

Thuộc tính android:name=".MainActivity" cho biết tên activity là MainActivity, mã nguồn của MainActivity được viết trong class MainActivity, nằm trong cùng package với tập tin AndroidManifest.xml.

Phần tử <intent-filter> và <action> báo cho Android biết activity có tên MainActivity là đầu vào của ứng dụng (main entry point), là activity được gọi đầu tiên.

<intent-filter>

               <action android:name="android.intent.action.MAIN" />

</intent-filter>

Nội dung tập tin MainActivity.java:

[MainActivity.java]

package com.example.teofirstapp;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;

import androidx.appcompat.app.AppCompatActivity;

import androidx.core.graphics.Insets;

import androidx.core.view.ViewCompat;

import androidx.core.view.WindowInsetsCompat;

 

public class MainActivity extends AppCompatActivity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       EdgeToEdge.enable(this);

       setContentView(R.layout.activity_main);

       ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {

           Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());

           v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);

           return insets;

       });

   }

}

Bạn nên sử dụng chatbot (ví dụ copilot, gemini, chatgpt) để xem giải thích ý nghĩa từng dòng lệnh.

Một số ý quan trọng trong tập tin MainActivity:

- Từ khóa package dùng để khai báo class MainActivity thuộc package com.example.teofirstapp

- Từ khóa import dùng để triệu gọi các thư viện sẽ được sử dụng

- Tạo lớp Activity kế thừa lớp AppCompatActivity

- Tạo phương thức onCreate(), ghi đè phương thức cùng tên của lớp cha (AppCompatActivity)

- setContentView(R.layout.activity_main): cho biết màn hình MainActivity sẽ được định nghĩa trong tập tin activity_main.xml.

- Tập tin activity_main.xml nằm trong thư mục res\layout. Bạn mở activity_main.xml, sửa dòng chữ “Hello World!” thành “chao bac Teo!”. Xem hình minh họa.


- Chạy lại dự án để xem kết quả. Dòng chữ xuất hiện trên điện thoại sẽ là “chao bac Teo!”.

2.4 Bài tập

1. Trong một dự án Android viết bằng Java, 3 thư mục bạn hay làm việc với nó là thư mục nào? Phát biểu nào sau đây không đúng?

A. code

B. res

C. manifests

D. java

2. Quá trình khởi chạy của một ứng dụng Android theo thứ tự đúng là?

A.  AndroidManifest.xm > activity_main.xml > MainActivity.java

B. activity_main.xml > MainActivity.java > AndroidManifest.xm 

C. MainActivity.java > AndroidManifest.xml > activity_main.xml

D. AndroidManifest.xml > MainActivity.java > activity_main.xml

3. Phát biểu nào sau đây không đúng?

A. Activity là một màn hình giao diện

B. AndroidManifest.xml là tập tin chứa thông tin cấu hình của một ứng dụng 

C. activity_main.xml là tập tin định nghĩa giao diện của MainActivity

D. MainActivity không phải là đầu vào ứng dụng (main entry point)

4. Tạo và chạy được chương trình “Hello World!”. Sửa dòng chữ “Hello World!” thành “chao bac Teo!”.

---

Gợi ý trả lời câu hỏi:

1(A), 2(D), 3(D)

-----

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

-----

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