







Preview text:
lOMoAR cPSD| 58728417 Bài tập 1:
Lý thuyết trọng tâm 1. CircleImageView:
o Thư viện de.hdodenhof.circleimageview hiển thị ảnh dạng tròn. o Dependency:
implementation 'de.hdodenhof:circleimageview:3.1.0'. o Sử dụng trong XML
với thuộc tính app:civ_border_width, app:civ_border_color.
2. Ẩn thanh tiêu đề:
o Gọi getSupportActionBar().hide() trong onCreate hoặc dùng theme
NoActionBar trong AndroidManifest.xml.
3. ArrayList và Log.d:
o ArrayList lưu trữ danh sách số (Integer).
o Log.d in thông tin debug (số chẵn/lẻ) vào Logcat.
4. Xử lý chuỗi và Toast:
o EditText nhận chuỗi, TextView hiển thị kết quả. o StringBuilder.reverse() đảo
ngược chuỗi, toUpperCase() chuyển chữ hoa. o Toast.makeText() hiển thị thông báo ngắn. Bài tập 4:
Lý thuyết trọng tâm 1. ListView:
o Là một ViewGroup hiển thị danh sách các mục (items) theo dạng cuộn dọc. o
Sử dụng Adapter để liên kết dữ liệu với giao diện.
o Hạn chế: Hiệu suất kém với danh sách lớn, không hỗ trợ cuộn ngang.
2. GridView: o Hiển thị danh sách các mục theo dạng lưới (grid) với các hàng và cột. o
Cũng sử dụng Adapter để cung cấp dữ liệu. o Thích hợp cho hiển thị ảnh hoặc dữ liệu
dạng bảng, nhưng hiệu suất hạn chế với tập dữ liệu lớn. 3. RecyclerView:
o Là phiên bản cải tiến của ListView và GridView, hỗ trợ cuộn dọc, ngang, hoặc lưới.
o Sử dụng ViewHolder để tối ưu hóa hiệu suất, tái sử dụng view. o Yêu cầu Adapter tùy chỉnh và LayoutManager (LinearLayoutManager,
GridLayoutManager, StaggeredGridLayoutManager).
o Linh hoạt, hiệu suất cao, phù hợp với danh sách lớn.
4. Custom Adapter cho ListView:
o Kế thừa lớp BaseAdapter hoặc ArrayAdapter.
o Ghi đè các phương thức:
getCount(): Trả về số lượng mục.
getItem(int position): Trả về dữ liệu tại vị trí.
getView(int position, View convertView, ViewGroup parent): Tạo hoặc
tái sử dụng view cho mỗi mục.
o Cần inflate layout tùy chỉnh cho mỗi item.
5. Custom Adapter cho GridView: lOMoAR cPSD| 58728417
o Tương tự ListView, kế thừa BaseAdapter hoặc ArrayAdapter. o Trong
getView(), thiết kế layout dạng lưới (thường là hình vuông hoặc ảnh).
o Quản lý dữ liệu và view tương tự ListView, nhưng hiển thị theo cột.
6. Custom Adapter cho RecyclerView:
o Kế thừa RecyclerView.Adapter. o Cần tạo lớp
ViewHolder kế thừa RecyclerView.ViewHolder để giữ tham chiếu đến các view trong layout item.
o Ghi đè các phương thức:
onCreateViewHolder: Inflate layout cho item và tạo ViewHolder.
onBindViewHolder: Gán dữ liệu vào ViewHolder tại vị trí cụ thể.
getItemCount: Trả về số lượng mục.
o Sử dụng LayoutManager để định dạng giao diện (dọc, ngang, lưới). So sánh ngắn gọn •
ListView: Đơn giản, phù hợp danh sách nhỏ, hiệu suất thấp. •
GridView: Hiển thị lưới, phù hợp ảnh, hiệu suất hạn chế. •
RecyclerView: Linh hoạt, hiệu suất cao, yêu cầu cấu hình phức tạp hơn. Lưu ý •
ListView và GridView ít được sử dụng trong ứng dụng hiện đại, RecyclerView là lựa
chọn ưu tiên do tính tối ưu và linh hoạt. •
Custom Adapter cần tối ưu tái sử dụng view (sử dụng ViewHolder cho RecyclerView,
kiểm tra convertView cho ListView/GridView).
Lý thuyết dễ hiểu 1. ListView:
o Hiển thị danh sách các mục, cuộn dọc (như danh bạ điện thoại). o Dùng Adapter để đổ dữ liệu vào.
o Nhược điểm: Chậm khi danh sách dài. 2. GridView:
o Hiển thị các mục dạng lưới (như thư viện ảnh). o Cũng dùng Adapter để gắn dữ liệu.
o Chậm với danh sách lớn. 3. RecyclerView:
o Nâng cấp của ListView và GridView, hỗ trợ cuộn dọc, ngang, hoặc lưới. o Dùng
ViewHolder để tái sử dụng view, chạy mượt hơn. o Cần Adapter tùy chỉnh và
LayoutManager (quyết định kiểu hiển thị: danh sách, lưới...).
4. Custom Adapter cho ListView:
o Tạo Adapter bằng cách kế thừa BaseAdapter hoặc ArrayAdapter. o Cần viết:
Số lượng mục (getCount).
Lấy dữ liệu tại vị trí (getItem). lOMoAR cPSD| 58728417
Tạo view cho mỗi mục (getView), dùng layout tùy chỉnh.
5. Custom Adapter cho GridView:
o Giống ListView, kế thừa BaseAdapter hoặc ArrayAdapter. o Trong getView,
tạo view dạng lưới (thường là ảnh hoặc ô vuông).
o Cách làm tương tự ListView.
6. Custom Adapter cho RecyclerView:
o Kế thừa RecyclerView.Adapter và tạo lớp ViewHolder. o Cần viết:
onCreateViewHolder: Tạo view cho item.
onBindViewHolder: Gán dữ liệu vào view. getItemCount: Số lượng mục.
o Kết hợp với LayoutManager để chọn kiểu hiển thị. Tóm lại •
ListView: Dễ, nhưng chậm, dùng cho danh sách nhỏ. •
GridView: Hiển thị lưới, chậm với dữ liệu lớn. •
RecyclerView: Mạnh mẽ, mượt, dùng phổ biến, nhưng hơi phức tạp. •
Custom Adapter giúp tùy chỉnh giao diện và dữ liệu, cần tái sử dụng view để tối ưu. Bài tập 4:
Tổng hợp lý thuyết về Input Control trong Android
Chương 1. Khái niệm Input Control •
Định nghĩa: Input Control là các thành phần giao diện người dùng (UI) có tính tương tác trong
ứng dụng Android, cho phép người dùng nhập liệu hoặc thực hiện hành động. Các control này
bao gồm: Button, Text Field (EditText), SeekBar, CheckBox, Toggle Button, Zoom Button, ProgressBar, v.v. •
Mục đích: Tăng cường khả năng tương tác, thu thập dữ liệu từ người dùng, hoặc thực hiện
các hành động cụ thể trong ứng dụng.
Chương 2. Các loại Input Control chính 2.1. Button •
Mô tả: Là nút bấm để thực hiện một hành động khi người dùng nhấn hoặc click. •
Ví dụ sử dụng: Kích hoạt sự kiện thông qua các phương thức xử lý sự kiện. •
Tùy chỉnh: Có thể sử dụng Drawable Shape để tạo giao diện tùy chỉnh. 2.2. ImageButton •
Mô tả: Tương tự Button nhưng hiển thị hình ảnh thay vì văn bản. •
Ứng dụng: Dùng trong các giao diện cần nút bấm dạng biểu tượng. lOMoAR cPSD| 58728417 2.3. EditText •
Mô tả: Là lớp con của TextView, cung cấp khả năng nhập và chỉnh sửa văn bản. •
Thuộc tính quan trọng:
o android:inputType: Xác định kiểu dữ liệu nhập (text, number, phone, email, v.v.). o
android:maxLines, android:lines: Giới hạn số dòng văn bản. o android:layout_width,
android:layout_height: Kích thước của EditText.
2.4. Toggle Button / Switch •
Mô tả: Cho phép chuyển đổi trạng thái ON/OFF. •
Ứng dụng: Dùng để bật/tắt chức năng (ví dụ: Wi-Fi, Bluetooth). •
Ví dụ: Sử dụng Switch để thay đổi hình nền ứng dụng. 2.5. CheckBox •
Mô tả: Hiển thị trạng thái checked/unchecked, tương tự nút ON/OFF nhưng có giao diện khác. •
Ứng dụng: Dùng cho các tùy chọn đa lựa chọn. 2.6. ProgressBar •
Mô tả: Hiển thị tiến trình của một tác vụ (ví dụ: tải dữ liệu, upload file). • Thuộc tính:
o android:max: Giá trị tối đa của ProgressBar. o
android:progress: Giá trị hiện tại. 2.7. SeekBar •
Mô tả: Thanh trượt cho phép người dùng chọn giá trị trong một khoảng (ví dụ: điều chỉnh âm lượng). • Thuộc tính:
o android:max: Giá trị tối đa.
o android:progress: Giá trị mặc định ban đầu.
o android:secondaryProgress: Giá trị phụ (thường dùng để hiển thị tiến trình đệm). • Sự kiện:
o onProgressChanged: Ghi nhận giá trị thay đổi. o onStartTrackingTouch: Khi
bắt đầu kéo thanh trượt. o onStopTrackingTouch: Khi dừng kéo. Chương 3. Tùy chỉnh giao diện
3.1. Drawable Shape Custom Button/EditText •
Mô tả: Tùy chỉnh giao diện Button hoặc EditText bằng cách sử dụng file Drawable Resource. • Quy trình:
1. Vẽ Button/EditText lên ViewGroup trong layout XML.
2. Tạo file Drawable Resource trong thư mục res/drawable, định nghĩa hình dạng (hình
chữ nhật, màu sắc, góc bo tròn, gradient, v.v.).
3. Áp dụng Drawable vào Button/EditText thông qua thuộc tính android:background. lOMoAR cPSD| 58728417 Chương 4. Menu 4.1. Options Menu •
Mô tả: Menu hiển thị ở thanh hành động (Action Bar) hoặc nút ba chấm. • Quy trình:
1. Tạo thư mục menu trong res.
2. Tạo file Menu Resource, định nghĩa các mục menu (Setting, Share, Logout, v.v.).
3. Gọi menu trong Activity thông qua phương thức inflate.
4. Xử lý sự kiện khi người dùng chọn mục menu. 4.2. Popup Menu •
Mô tả: Menu hiển thị khi nhấn vào một View cụ thể. • Quy trình:
1. Tạo và gọi Popup Menu, liên kết với một View cụ thể.
2. Xử lý sự kiện khi người dùng chọn mục trong Popup Menu (ví dụ: hiển thị thông báo
hoặc thay đổi văn bản). 4.3. Context Menu •
Mô tả: Menu hiển thị khi nhấn giữ (long press) vào một View. • Quy trình:
1. Đăng ký View cho Context Menu trong phương thức onCreate.
2. Tạo Context Menu, thiết lập tiêu đề và biểu tượng.
3. Xử lý sự kiện khi người dùng chọn mục trong Context Menu. Chương 5. Dialog 5.1. Alert Dialog •
Mô tả: Hiển thị thông báo với các nút tùy chọn (ví dụ: Có/Không). •
Ứng dụng: Dùng để xác nhận hành động (ví dụ: đăng xuất, xóa dữ liệu).
5.2. Custom Alert Dialog •
Mô tả: Dialog tùy chỉnh với layout riêng. • Quy trình:
1. Tạo layout XML cho Dialog.
2. Tạo và hiển thị Dialog, thiết lập các thuộc tính như không có tiêu đề, không cho phép hủy khi chạm ngoài.
3. Ánh xạ và xử lý sự kiện cho các thành phần trong Dialog. Bài tập 5: lOMoAR cPSD| 58728417
Lý thuyết dễ hiểu 1. Data Binding:
o Là kỹ thuật trong Android kết nối trực tiếp dữ liệu (data) với giao diện (UI) mà
không cần viết nhiều mã truy cập View.
o Sử dụng file XML với thẻ và biến @={} để gán dữ liệu. o Cần bật
trong build.gradle: dataBinding { enabled = true }.
o Lợi ích: Giảm mã boilerplate, cập nhật UI tự động khi dữ liệu thay đổi. 2. Shared Preferences:
o Là cách lưu trữ dữ liệu nhỏ, đơn giản dạng cặp key-value (như cài đặt ứng dụng, tên người dùng).
o Lưu trong file XML, truy cập qua SharedPreferences class. o Phương thức
chính: getSharedPreferences(), edit(), putString(), getString(), apply().
o Lợi ích: Dễ dùng, phù hợp dữ liệu nhẹ, không cần cấu trúc phức tạp. 3. SQLite:
o Là cơ sở dữ liệu nhẹ, tích hợp sẵn trong Android, lưu trữ dữ liệu có cấu trúc
(như danh sách sinh viên, sản phẩm).
o Sử dụng bảng (table) với hàng (row) và cột (column).
o Truy cập qua SQLiteDatabase hoặc Room (thư viện hiện đại). o Hỗ trợ CRUD
(Create, Read, Update, Delete) qua câu lệnh SQL. o Lợi ích: Lưu trữ dữ liệu
lớn, có tổ chức, hỗ trợ truy vấn phức tạp. Tóm lại •
Data Binding: Kết nối dữ liệu với UI, giảm mã, tự động cập nhật. •
Shared Preferences: Lưu dữ liệu nhỏ, đơn giản (key-value). •
SQLite: Lưu dữ liệu lớn, có cấu trúc, dùng cho ứng dụng phức tạp. Bài tập 6:
Lý thuyết rõ ràng, dễ hiểu 1. Thread:
o Là luồng riêng để chạy các việc nặng (như tải dữ liệu, xử lý file) mà không làm giao diện (UI) bị đơ.
o Main thread chỉ dùng cho giao diện, không chạy tác vụ lâu.
o Tạo Thread: Dùng lớp Thread hoặc Runnable với start(). 2. Handler:
o Giúp Thread phụ gửi dữ liệu về main thread để cập nhật giao diện (như đổi text của TextView).
o Dùng Handler để gửi Message hoặc Runnable.
o Ví dụ: Thread phụ tính toán xong, Handler cập nhật UI. 3. AsyncTask:
o Lớp hỗ trợ chạy tác vụ nền và cập nhật UI dễ dàng. o 3 phương thức chính:
doInBackground: Chạy ở Thread phụ (tác vụ nặng).
onPostExecute: Cập nhật UI khi xong. lOMoAR cPSD| 58728417
onProgressUpdate: Cập nhật tiến độ.
o Nhược điểm: Cũ, không dùng cho Android mới (thay bằng Executors hoặc Coroutines).
4. JSON: o Là định dạng dữ liệu (key-value) để gửi/nhận thông tin từ API. o Dạng:
Object {} (như {"name": "John"}) hoặc Array [] (như [1, 2, 3]).
o Xử lý: Dùng JSONObject, JSONArray hoặc thư viện Gson để chuyển thành đối tượng Java.
5. Volley (Kết nối API):
o Thư viện nhẹ để gọi API, gửi yêu cầu HTTP (GET, POST). o Cách dùng: Tạo RequestQueue.
Gửi JsonObjectRequest hoặc StringRequest để lấy dữ liệu.
o Lợi ích: Dễ, tự quản lý hàng đợi.
o Nhược điểm: Yếu khi tải file lớn hoặc API phức tạp.
6. Retrofit2 (Kết nối API):
o Thư viện mạnh để gọi API, tự động chuyển JSON thành đối tượng Java/Kotlin. o Cách dùng:
Tạo interface với annotation (@GET, @POST).
Khởi tạo Retrofit với base URL và converter (Gson).
Gọi API qua Call hoặc Coroutine.
o Lợi ích: Mã gọn, dễ mở rộng, xử lý lỗi tốt. o Nhược điểm: Cấu hình ban đầu phức tạp hơn Volley. Tóm lại •
Thread: Chạy việc nặng, không làm đơ UI.
Handler: Đưa dữ liệu từ Thread phụ về UI. •
AsyncTask: Tác vụ nền đơn giản, nhưng lỗi thời. •
JSON: Định dạng dữ liệu cho API. •
Volley: Dễ, tốt cho API đơn giản. •
Retrofit2: Mạnh, gọn, dùng cho API phức tạp. Bài tập 8:
Lý thuyết rõ ràng, dễ hiểu 1. ViewFlipper:
o Là một ViewGroup hiển thị nhiều View (giao diện) lần lượt, chuyển đổi giữa
chúng bằng cách cuộn hoặc tự động (như slideshow). o Cách dùng:
Thêm các View con (như ImageView, TextView) vào XML hoặc code.
Sử dụng setInAnimation, setOutAnimation để thêm hiệu ứng chuyển đổi.
Điều khiển: showNext(), showPrevious(), hoặc startFlipping() (tự động).
o Lợi ích: Đơn giản, phù hợp cho carousel hoặc slideshow nhỏ.
o Nhược điểm: Ít linh hoạt, không tối ưu cho danh sách phức tạp. lOMoAR cPSD| 58728417 2. ViewPager:
o Là một ViewGroup hiển thị các giao diện (page) theo dạng trượt ngang (như tab
ảnh, màn hình hướng dẫn). o Cách dùng:
Kết hợp với Adapter (thường là FragmentStateAdapter hoặc PagerAdapter).
Thêm ViewPager2 (phiên bản mới) vào XML.
Có thể kết hợp với TabLayout để tạo tab.
o Lợi ích: Linh hoạt, hỗ trợ trượt mượt, tích hợp tốt với Fragment.
o Nhược điểm: Cần cấu hình Adapter, phức tạp hơn ViewFlipper. 3. Fragment:
o Là một phần giao diện độc lập trong Activity, có vòng đời riêng (như onCreate, onCreateView).
o Dùng để chia nhỏ giao diện hoặc tái sử dụng (như hiển thị danh sách, chi tiết). o Cách dùng:
Tạo lớp kế thừa Fragment, định nghĩa giao diện trong onCreateView.
Quản lý qua FragmentManager để thêm, thay thế, xóa (add, replace, remove).
Thường dùng với ViewPager để hiển thị nhiều Fragment.
o Lợi ích: Tái sử dụng, linh hoạt, phù hợp ứng dụng phức tạp. o Nhược điểm:
Quản lý vòng đời và giao tiếp phức tạp hơn View. Tóm lại •
ViewFlipper: Đơn giản, dùng cho slideshow, chuyển View tự động hoặc thủ công. •
ViewPager: Trượt ngang mượt, dùng cho các page, kết hợp tốt với Fragment. •
Fragment: Giao diện module, tái sử dụng, quản lý linh hoạt trong Activity.