1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lập trình thiết bị di động 1 (Nghề Ứng dụng phần mềm Trình độ Cao đẳng)

132 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo trình Lập trình thiết bị di động 1
Tác giả Nguyễn Hoàng Vũ
Trường học Cao đẳng nghề Cần Thơ
Chuyên ngành Ứng dụng phần mềm
Thể loại sách giáo trình
Năm xuất bản 2021
Thành phố Cần Thơ
Định dạng
Số trang 132
Dung lượng 3,8 MB

Cấu trúc

  • BÀI 1: TỔNG QUAN VỀ LẬP TRÌNH ANDROID VÀ MÔI TRƯỜNG PHÁT TRIỂN (9)
    • 1. Tổng quan android (9)
      • 1.1. Hệ điều hành Android (9)
      • 1.2 Tại sao lập trình trên Android (0)
        • 1.2.1 Xu thế phát triển công nghệ di động (0)
        • 1.2.2. Thị trường thiết bị Android (17)
        • 1.2.3. Nhu cầu tuyển dụng lập trình viên Android (17)
    • 2. KIẾN TRÚC ANDROID (17)
    • 3. MÔI TRƯỜNG PHÁT TRIỂN ỨNG DỤNG ANDROID (19)
      • 3.1 Giới thiệu Java JDK, Android SDK, Android Studio (19)
      • 3.2 Thiết lập môi trường phát triển (20)
      • 3.3 Tạo ứng dụng đầu tiên (30)
        • 3.3.1 Khởi tạo dự án (30)
        • 3.3.2 Cấu trúc dự án (33)
        • 3.3.3. AndroidManifest (37)
      • 3.4. Cập nhật Android API (38)
      • 3.5. Cài đặt và sử dụng Android Virtual Device (AVÍ DỤ ) (39)
  • BÀI 2: CÁC THÀNH PHẦN ỨNG DỤNG ANDROID (44)
    • 1. Các thành phần trong ứng dụng Android (44)
      • 1.1. Activity (44)
      • 1.2. Intent (44)
      • 1.3. View (44)
      • 1.4. Broadcast Receiver (45)
      • 1.5. Service (45)
      • 1.6. Content Provider (45)
      • 1.7 Context (45)
      • 1.8. Notification (46)
    • 2. TƯƠNG THÍCH THIẾT BỊ (46)
    • 3. ACTIVITY VÀ ĐỘ ƯU TIÊN ỨNG DỤNG (47)
      • 3.1. Xây dựng Activity (47)
      • 3.2. Quản lý trạng thái Activity (Managing the Activity Lifecycle) (48)
      • 3.3. Vòng đời của Activity (Activity Lifecycle) (0)
      • 3.4. Độ ưu tiên trong ứng dụng (50)
  • BÀI 3 CÁC ĐIỀU KHIỂN CƠ BẢN (57)
    • 1. Giao diện người dùng (57)
      • 1.1. Layout (57)
        • 1.1.1. Frame Layout (57)
        • 1.1.2. Linear Layout (59)
        • 1.1.3. Table Layout (59)
        • 1.1.4. Relative Layout (60)
    • 2. View và Viewgroup (61)
      • 2.2. Các thuộc tính của View (0)
        • 2.2.1. Id (63)
        • 2.2.2. Thuộc tính vị trí (63)
    • 3. Các điều khiển cơ bản (64)
      • 3.1. TextView (64)
      • 3.2. EditText (66)
      • 3.3. Button (66)
      • 3.4. Checkbox (67)
      • 3.5. RadioButton (68)
      • 3.6. ToggleButton (68)
      • 3.7. Switch (68)
    • 4. Kiểm tra lỗi và tối ưu lại giao diện (69)
  • BÀI 4 TÀI NGUYÊN ỨNG DỤNG TRONG ANDROID (73)
    • 1. TỔNG QUAN (73)
      • 1.1. Tài nguyên (73)
      • 1.2. Định nghĩa tài nguyên (74)
    • 2. TÍNH TƯƠNG THÍCH (76)
    • 3. TRUY XUẤT TÀI NGUYÊN (77)
      • 3.1. Lớp R (77)
      • 3.2. Tài nguyên Alias (77)
    • 4. CÁC TÀI NGUYÊN ỨNG DỤNG CƠ BẢN (78)
      • 4.1. String (78)
      • 4.2. Bool o Cú pháp (79)
      • 4.3. Color (79)
      • 4.4. Id (79)
      • 4.5. Dimen (80)
      • 4.6. Integer (80)
      • 4.7. Integer (81)
      • 5.1 Tài nguyên hình ảnh (82)
        • 5.1.1. Thư mục lưu trữ (82)
        • 5.1.2. Định dạng (82)
        • 5.1.3. Truy xuất (82)
      • 5.2. Các dạng tài nguyên hình ảnh (82)
        • 5.2.1. Bitmap (82)
      • 5.3. Shape (83)
      • 5.4. LayerList (84)
      • 5.5. StateList (85)
      • 5.6. LevelList (86)
      • 5.7. Transition (86)
      • 5.8. Inset (87)
      • 5.9. Clip (87)
      • 5.10. Scale (88)
      • 5.11. NineoPatch (88)
    • 6. INTENT (89)
      • 6.1. Khái niệm về Intent (89)
        • 6.1.1 Cơ chế hoạt động (89)
        • 6.1.2. Xây dựng và truy xuất Intent (89)
      • 6.2. Intent filter (91)
        • 6.2.1. Mô tả (91)
        • 6.2.3. Xây dựng IntentFilter (92)
          • 6.2.3.1. Action (92)
        • 2.3.2. Data (92)
          • 6.2.3.3. Category (93)
  • BÀI 5: QUẢN LÝ BỘ NHỚ THIẾT BỊ VÀ XÂY DỰNG GIAO DIỆN VỚI (96)
    • 1. Bộ quản lý Asset (96)
      • 1.1 Giới thiệu (96)
      • 1.2. Đọc dữ liệu A sset (0)
    • 2. Shared Preferences (99)
      • 2.1. Giới thiệu (99)
      • 2.2. Lưu trữ (99)
      • 2.3. Truy xuất (0)
    • 3. Bộ nhớ thiết bị (101)
      • 3.1. Bộ lưu trữ trong (101)
      • 3.2. Bộ lưu trữ ngoài (0)
    • 4. các điều khiển hiển thị danh sách (103)
    • 5. Các dạng Adapter (103)
      • 5.1. BaseAdapter (103)
      • 5.2. SimpleCursorAdapter (104)
    • 6. CÁC ĐIỀU KHIỂN DANH SÁCH (104)
      • 6.1. AbsListView (104)
      • 6.2. Listview (104)
      • 6.3. GridView (107)
      • 6.4. Spinner (108)
      • 6.5. Tạo Custom ListView (109)
      • 6.6 AutoCompleteTextView (113)
      • 6.7. MultiAutoCompleteTextView (114)
    • 7. Giao diện với Fragment (115)
      • 7.1 Khái quát (115)
      • 7.2. Giao diện (116)
      • 7.3. Vòng đời củ một Fragment (0)
      • 7.4. Lưu trữ Fragment (BackStack) (118)
    • 8. Xây dựng và sử dụng Fragment (119)
      • 8.1. Thực hiện xây dựng Fragment (119)
      • 8.2. Sử dụng Fragment (119)
  • TÀI LIỆU THAM KHẢo (132)

Nội dung

TỔNG QUAN VỀ LẬP TRÌNH ANDROID VÀ MÔI TRƯỜNG PHÁT TRIỂN

Tổng quan android

- Năm 2003, Android Inc được thành lập bởi Andy Rubin, Rich Miner, Nick Sears và Chris White tại California

- Năm 2005, Google mua lại Android Inc và bắt đầu nuôi ý tưởng tự sản xuất điện thoại di động

Vào năm 2007, tổ chức Open Handset Alliance (OHA) đã được thành lập với sự tham gia của hơn 80 công ty trong lĩnh vực kỹ thuật điện tử, bao gồm các công ty chuyên về phần cứng, phân phối thiết bị di động, cũng như các công ty phần mềm và sản xuất chất bán dẫn.

Có thể kể đến một số công ty nổi tiếng như Samsung, Motorola, LG, HTC, ToMobile, Vodafone, ARM và Qualcomm…

- Năm 2008, Google ra mắt chiếc di động đầu tiên đồng thời open source bản SDK (Software Development Kit) phiên bản 1.0

- Năm 2010, Google khởi đầu dòng thiết bị Nexus với thiết bị đầu tiên của HTC là Nexus one

- Năm 2013, ra mắt loạt thiết bị phiên bản GPE

- Năm 2014, Google công báo Android Wear, hệ điều hành dành cho các thiết bị đeo được

- Các phiên bản của hệ điều hành Android:

Hình 1.1 Các phiên bản hệ điều hành Android

Phiên bản API Thời gian phát hành Đặc điểm nổi bật

Thanh thông báo kéo từ trên xuống, màn hình chínhọphong phú, tích hợp chặt chẽ với Gmail, giao diện đơn giản nhưng khá đẹp mắt thời bấy giờ Android 1.1 2 02/2009

Tải và cài đặt bản cập nhật ngay trên thiết bị, không cần kết nối với máy tính (phương thức over The Air)

Android đầu tiên được Google đặt tên theo các món đồ ăn theo thứ tự chữ cái, mang đến nhiều tính năng nổi bật như bàn phím ảo, khả năng tùy biến giao diện với widget, cải tiến clipboard, khả năng quay phim, và cho phép tải ảnh, video lên YouTube cũng như truy cập danh bạ trong Google Talk.

Giao diện đã được cải thiện với hỗ trợ mạng CDMA và các thành phần đồ họa độc lập theo độ phân giải Tính năng Quick Search Box cho phép người dùng tìm kiếm mọi thứ chỉ trong một hộp tìm kiếm Android Market hiển thị các ứng dụng miễn phí và trả phí hàng đầu Camera cũng được nâng cấp với trình xem ảnh tốt hơn.

Hệ thống hỗ trợ nhiều tài khoản người dùng và tính năng Quick Contact, cùng với bàn phím ảo được cải tiến Trình duyệt mới hỗ trợ HTML5, cho phép phát video toàn màn hình và tích hợp hộp địa chỉ với thanh tìm kiếm, đồng thời cho phép phóng to, thu nhỏ bằng cách chạm vào màn hình Giao diện được thiết kế đẹp mắt, sang trọng và gọn gàng hơn trước.

Eclair 7 01/2010 Hỗ trợ Live Wallpaper, chuyển giọng nói thành văn bản và một màn hình khóa mới

Từ 3 màn hình chính tăng lên thành 5 màn hình Dãy nút kích hoạt nhanh chế độ gọi điện, web và App Drawer xuất hiện Khả năng hiển thị hình ảnh 3D Tính năng trạm phát Wifi xuất hiện Hỗ trợ duyệt web với Flash Tính năng di chuyển một phần ứng dụng từ bộ nhớ máy sang thẻ nhớ

Bài viết đề cập đến hai thanh chặn khi chọn văn bản, cùng với sự cải thiện đáng kể của bàn phím, giúp người dùng dễ dàng sử dụng hơn Ngoài ra, có sự xuất hiện của công cụ quản lý pin và ứng dụng, cùng với hỗ trợ cho camera trước Những tính năng mới này chủ yếu tập trung vào phát triển game, đa phương tiện và các phương thức truyền thông hiện đại.

Phiên bản dành riêng cho máy tính bảng sử dụng tông màu đen và xanh dương chủ đạo với homescreen và widget được thiết kế lại Thiết kế mới không còn nút nhấn vật lý, cải thiện khả năng đa nhiệm với nút Recent Apps giúp chuyển đổi ứng dụng nhanh chóng Ngoài ra, thanh Action Bar cũng được tích hợp để nâng cao trải nghiệm người dùng.

Phiên bản Android 3.1 và 3.2 sửa lỗi và thêm vài tính năng mới như thay đổi kích thước widget ngay trên homescreen, hỗ trợ thẻ SD,

Hệ điều hành mới hỗ trợ bộ font Roboto và mang đến hệ thống thông báo hoàn toàn mới, đẹp mắt và tiện lợi hơn Bàn phím được cải thiện để nâng cao trải nghiệm người dùng Việc hợp nhất hệ điều hành cho smartphone và máy tính bảng giúp duyệt web nhanh hơn, tối ưu hóa hiệu suất hoạt động của thiết bị, đồng thời kéo dài thời gian sử dụng pin.

Màn hình khóa trên thiết bị Android cho phép người dùng kích hoạt ba tính năng khác nhau thông qua vòng trượt mở khóa, bao gồm mở khóa máy, sử dụng camera và kích hoạt Google Now Đối với Android 4.0, người dùng có hai tính năng chính là mở khóa máy và sử dụng camera.

Khả năng tìm kiếm bằng giọng nói trên Android đã được cải thiện với kết quả trả về thiết kế theo dạng thẻ đồ họa, mang tính thông minh và trực quan hơn Dự án Project Butter đã giúp nâng cao độ mượt mà cho hệ điều hành Android, mang lại trải nghiệm người dùng chưa từng có.

Miracast là một chuẩn chia sẻ nội dung số qua kết nối WiFi, cho phép người dùng truyền tải nội dung một cách dễ dàng Tính năng nhập liệu bằng cách vẽ các đường nét từ ký tự này đến ký tự khác, cùng với chế độ chụp ảnh toàn cảnh Photo Sphere, mang lại trải nghiệm thú vị cho người dùng Ngoài ra, hệ điều hành Android 4.3 hỗ trợ nhiều tài khoản người dùng trên máy tính bảng, giúp cá nhân hóa và nâng cao tính tiện lợi khi sử dụng.

18 07/2013 Hỗ trợ kết nối Bluetooth Smart, bộ API openGL ES

3.0, bổ sung tính năng sử dụng WioFi để định vị ngay cả khi người dùng tắt kết nối này Hỗ trợ tính năng Restricted Profile, Notification Access,

Hiệu suất được cải tiến với RAM 512 MB có khả năng chạy KitKat, mang lại hiệu năng cao gấp 1,6 lần so với phiên bản trước Giao diện được thiết kế phẳng hơn, kết hợp với dịch vụ tìm kiếm Google Search giúp dò và tự động liên kết danh bạ có sẵn trên internet với số điện thoại mới Ngoài ra, Text Messages và Hangouts được gộp chung, bàn phím mặc định được bổ sung thêm các biểu tượng Emoji, và tính năng Screen Recording cho phép ghi lại các hoạt động trên màn hình thành video MP4.

Hình ảnh trên thiết bị hiện nay sắc nét và đa dạng màu sắc hơn trước Chức năng “T action” cho phép người dùng thực hiện các tác vụ cụ thể bằng cách lắc máy Ngoài ra, tính năng tự động trả lời cuộc gọi khi đưa máy lên tai và tự động giảm âm lượng chuông khi nhấc máy khỏi mặt bàn giúp tăng cường trải nghiệm sử dụng Người dùng có thể dễ dàng nhận và trả lời thông báo như email, tin nhắn và cuộc gọi nhỡ ngay trên màn hình khóa Những cải tiến này không chỉ tiết kiệm pin mà còn nâng cao tính bảo mật cho thiết bị.

Thiết kế lại quyền hạn của các ứng dụng với tính năng Chrome Custom Tabs trên trình duyệt Chrome cho phép nhà phát triển chèn nội dung trang web đầy đủ vào ứng dụng Tính năng này hỗ trợ mở nội dung trực tiếp bằng các ứng dụng liên quan và giới thiệu hệ thống thanh toán mới trên di động mang tên Android.

Pay Cải thiện độ ổn định, hiệu suất cũng như khả năng tiết kiệm pin Hỗ trợ cổng kết nối USB TypeC thế hệ mới

Trước khi được công bố với tên gọi Nougat, phiên bản "Android N" từng được Google gọi là "New York Cheesecake" Nougat mang đến nhiều tính năng mới, nổi bật là khả năng đa tác vụ cải tiến, phù hợp với sự gia tăng của điện thoại thông minh có màn hình lớn, bao gồm chế độ chia màn hình và khả năng chuyển đổi nhanh giữa các ứng dụng.

KIẾN TRÚC ANDROID

Android Software Stack bao gồm nhân Linux và một tập hợp các thư viện C/C++ mà tầng ứng dụng sử dụng để truy cập các dịch vụ, bộ quản lý thực thi và quản lý ứng dụng Mỗi tầng trong cấu trúc này đảm nhiệm những chức năng và vai trò riêng biệt, góp phần vào sự vận hành hiệu quả của hệ điều hành Android.

Lõi Linux là phần quan trọng nhất của toàn bộ hệ thống, bao gồm các chức năng điều khiển phần cứng, quản lý xử lý và bộ nhớ, bảo mật, kết nối mạng và quản lý năng lượng.

- Libraries – thực thi trên tầng nhân Linux, bao gồm các thư viện lõi khác nhau của C/C++ như libc và SSL Có các dạng sau:

 Thư viện hổ trợ phát các tập tin đa truyền thông

 Bộ quản lý hiển thị

 Thư viện hổ trợ đồ họa openGL 2D và 3D

 SQLite hổ trợ lưu trữ cơ sở dữ liệu

 SSL và WebKit cho phép tương tác với trình duyệt và bảo mật Internet

Android Run Time là yếu tố quyết định sự khác biệt giữa thiết bị Android và thiết bị Linux Thành phần này bao gồm máy ảo Dalvik và thư viện lõi, tạo nên nền tảng cho các ứng dụng Android hoạt động hiệu quả.

Android Run Time ngoài tăng tốc độ cho ứng dụng còn làm nền cho tầng

Application Framework kết nối đến

Mặc dù hầu hết các ứng dụng Android được phát triển bằng ngôn ngữ Java, Dalvik không phải là máy ảo Java Các thư viện lõi của Android cung cấp hầu hết các chức năng chính tương tự như trong thư viện Java, cùng với những thư viện riêng biệt của Android.

Dalvik VM là một máy ảo được tối ưu hóa, cho phép chạy nhiều tiến trình hiệu quả trên nền tảng nhân Linux Nó quản lý các tiểu trình và bộ nhớ ở mức thấp, giúp nâng cao hiệu suất hoạt động của ứng dụng.

Khung ứng dụng cung cấp các lớp cần thiết để phát triển ứng dụng, đồng thời bao gồm các lớp trừu tượng cho phép truy cập phần cứng, quản lý giao diện người dùng và tài nguyên của ứng dụng.

The Application Layer consists of pre-installed applications and third-party apps In the Android Runtime, this layer utilizes classes from the Application Framework to execute applications effectively.

MÔI TRƯỜNG PHÁT TRIỂN ỨNG DỤNG ANDROID

3.1 Giới thiệu Java JDK, Android SDK, Android Studio

Android SDK (Software Development Kit) và JDK (Java Development Kit) là hai công cụ thiết yếu cho việc phát triển ứng dụng Android Để lập trình hiệu quả hơn, việc sử dụng một IDE (Integrated Development Environment) như Eclipse sẽ mang lại sự tiện lợi và hỗ trợ đáng kể trong quá trình phát triển ứng dụng.

Android SDK, JDK và Eclipse hỗ trợ nhiều hệ điều hành như Windows, Mac OS và Linux, cho phép lập trình viên làm việc trên nền tảng mà họ đã quen thuộc Hơn nữa, với việc Android chạy trên máy ảo Dalvik, quá trình phát triển ứng dụng trở nên đồng nhất trên cả ba môi trường này.

Android Studio, công cụ lập trình chính thức của Google, đã ra mắt phiên bản đầu tiên 0.1 vào tháng 5/2013 Hiện tại, phiên bản mới nhất là 1.2.1, được phát hành vào tháng 5/2015, và phiên bản 1.3 đã được công bố tại sự kiện Google I/O 2015 Android Studio được xây dựng trên nền tảng IntelliJ, cung cấp nhiều tính năng mạnh mẽ hơn so với ADT.

- Hỗ trợ xây dựng dự án dạng Gradle

Hỗ trợ sửa lỗi nhanh chóng và tái sử dụng cấu trúc phương thức là yếu tố quan trọng trong phát triển ứng dụng Ngoài ra, việc cung cấp các công cụ kiểm tra tính khả dụng, khả năng hoạt động của ứng dụng và sự tương thích với nền tảng cũng góp phần nâng cao hiệu suất và trải nghiệm người dùng.

- Hỗ trợ bảo mật mã nguồn và đóng gói ứng dụng

- Trình biên tập giao diện cung cấp tổng quan giao diện ứng dụng và các Thành phần, cho phép tuỳ chỉnh trên nhiều cấu hình khác nhau

- Cho phép tương tác với nền Google Cloud

Android Studio liên tục phát triển các phiên bản cải tiến nhằm tạo ra một môi trường phát triển toàn diện, mang lại trải nghiệm nhanh chóng và mượt mà hơn so với các IDE khác.

3.2 Thiết lập môi trường phát triển:

Ứng dụng Android được chạy trên máy ảo Dalvik, cho phép lập trình viên phát triển ứng dụng tương thích với nhiều phiên bản hệ điều hành khác nhau.

- Android Studio phiên bản năm 2020Cụ thể như sau:

 ổ cứng nhiều, ưu tiên SSD

- Để bắt đầu viết ứng dụng với Android Studio, chúng ta cần tải và cài đặt hai bộ phần mềm sau:

 Bước trước tiên, ta cần tải Android Studio phiên bản mới nhất tại đây:

 https://developer.android.com/studio

Hình 1.7 Trang Android Studio để download Nhấn vào “DOWNLOAD ANDROID STUDIO”

Hình 1.9 Lưu file Download Android Studio

Bấm save để tải về, tùy tốc độ mà lâu hay mau, đợi chỗ này nó tải cho xong

Sau khi tải xong thì bắt đầu cài đặt

Trước khi cài đặt thì nên tạo 1 thư mục Android trong ổ C, ví dụ:

Hình 1.10 Tạo 1 thư mục Androidtrong ổ C

Khi cài đặt sẽ có 2 thành phần mà ta nên cài vào bên trong thư mục Android, đó là:

 android-studio->công cụ lập trình

 sdk->các thư viện để hỗ trợ lập trình

Bây giờ double click vào file cài mới tải ở trên về để cài đặt:

- Sau khi tải bộ cài Android Studio thành công, chúng ta chạy tập tin android – studio – bundle để tiến hành cài đặt Android Studio → màn hình Welcome to

Android Studio Setup xuất hiện → Next:

Hình 1.11 Màn hình Welcome to Android Studio

Để bắt đầu cài đặt, bạn cần xác định đường dẫn đến nơi cài đặt JDK đã có Sau đó, nhấn Next để tiếp tục Một hộp thoại lựa chọn cấu hình cài đặt sẽ xuất hiện; hãy đảm bảo chọn (check) tất cả các thành phần cần thiết như trong hình bên dưới.

Hình 1.12 Hộp thoại lựa chọn cấu hình

• Để mặc định như trên rồi tiếp tục nhấn Next:

Hình 1.13 Chọn đường dẫn cài

- Ở màn hình trên lưu ý cài vào thư mục C:\Android\android-studio

- Sau đó nhấn Next để tiếp tục:

Sau đó nhấn “Install” để bắt đầu cài đặt

Hình 1.15 Hộp thoạichờ cài đặt

Ngồi chờ xíu cho nó cài đặt, khi cài đặt xong sẽ có thông báo như dưới đây:

Chọn Do not import Setting, sau đó click OK (vì cài lần đầu nên k chọn bên trên)

Hình 1.17 Hộp thoại Do not import Setting

Bạn chọn một trong hai cái đều được

Hình 1.18 Hộp thoại Data Sharing

Màn hình Welcome xuất hiện

Chọn Install Type là Standard nhé!

Hình 1.20 Hộp thoại Install Type

Xuất hiện Select UI Theme, next tiếp tục

Hình 1.21 Hộp thoại Select UI Theme

Chờ cho phần mềm tải và cài đặt các thành phần cần thiết

Thời gian tương đương với phần cài đặt Tuy nhiên phần này còn phụ thuộc vào tốc độ mạng

Hình 1.23 Hộp thoại Downloading Components

Nếu bạn đã từng phát triển ứng dụng Android, bạn sẽ có sẵn SDK và phần mềm không yêu cầu thêm bất kỳ cài đặt nào Ngược lại, nếu bạn chưa từng cài đặt, bạn sẽ cần phải cài đặt SDK để tiếp tục.

Hình 1.23 Hộp thoại cài SDK

Chương trình sẽ báo Missing SDK, ta tiếp tục nhấn Next

Hình 1.24 Hộp thoại Missing SDK

Lưu ý Android SDK Location ta chọn đúng nơi mà ta đã tạo thư mục trước đó: C:\Android\sdk

Sau đó nhấn Next để tiếp tục Màn hình Verify Settings sẽ xuất hiện như dưới đây:

Hình 1.25 Hộp thoại Verify Settings

Nhấn FINISH để cài, màn hình Downloading Components sẽ hiển thị như dưới đây, chờ:

Chờ cho tới khi nó báo hoàn tất:

Hình 1.26 Hộp thoại Finish Components

Nhấn Finish để hoàn tất quá trình cài đặt SDK

Lúc này phần mềm Android Studio sẽ xuất hiện như dưới đây:

Hình 1.27 Hộp thoại Android Studio

Chọn giao diện là Light cho nó sáng sủa sau đó nhấn next để hoàn tất-> lúc này ra cái màn hình Android studio bình thường

3.3 Tạo ứng dụng đầu tiên

Launch Android Studio and you will see the "Welcome to Android Studio" screen Select "Start a new Android Studio project" to create a new Android Studio project.

Hình 1.28 Android Studio phiên bản năm 2020

- Hộp thoại tiếp theo xuất hiện yêu cầu đặt tên cho ứng dụng và tên domain như hình sau:

Hình 1.30 đặt tên cho ứng dụng

Trong hộp thoại này, bạn cần cung cấp các thông tin quan trọng như: Tên ứng dụng (Application name) là tên của ứng dụng bạn phát triển; Tên miền công ty (Company Domain) là sự kết hợp giữa tên miền của công ty và tên ứng dụng, dùng để tạo ra gói ứng dụng và đưa lên Google Play Store; Tên gói ứng dụng (Package name) là tên duy nhất để phân biệt ứng dụng của bạn với các gói khác trên Google Play Store; và Địa điểm dự án (Project location) là nơi lưu trữ ứng dụng của bạn.

- Sau khi nhập xong thông tin (bao gồm tên ứng dụng, domain và nơi lưu dự án)

→ nhấn Next để tiếp tục → Xuất hiện hộp thoại chọn thiết bị (device) mà bạn muốn phát triển ứng dụng:

Để phát triển ứng dụng trên điện thoại và máy tính bảng, hãy chọn tùy chọn như hình trên và nhấn "Next" để tiếp tục Lưu ý rằng Minimum SDK là phiên bản thấp nhất cần thiết để chạy ứng dụng, và một số phương thức API sẽ được gọi thêm trong thư viện hỗ trợ.

- Chọn Blank Activity và nhấn Next Hộp thoại nhập thông tin của Activity xuất hiện như sau:

Hình 1.22 Tên lớp lưu giữ mã nguồn

Trong hộp thoại này, bạn cần cung cấp các thông tin sau: Tên lớp lưu giữ mã nguồn cho Activity, Tên tập tin XML để thiết lập giao diện cho Activity, Tên tiêu đề hiển thị khi kích hoạt Activity trên thiết bị, và Tên tập tin XML để tạo menu cho phần mềm.

- Sau khi nhập đầy đủ thông tin, nhấn Finish để kết thúc Chờ “building” dự án xong là hoàn tất việc tạo dự án

- Sau khi tạo dự án, chúng ta tiến hành mở dự án đã tạo để xem cấu trúc của nó

Và trên màn hình của chúng ta lúc này sẽ tương tự như sau:

- Ở hình trên, màn hình làm việc được chia thành 7 phần – 7 phần này, chúng ta sẽ tương tác thường với chúng với các chức năng cụ thể như sau:

- Phần 1: thanh công cụ này rất tiện lợi Nó giúp chúng ta thao tác nhanh các chức năng thường dùng khi lập trình, chi tiết như sau:

 Biểu tượng dùng để mở một tập tin (file) hay một dự án (Project)

Biểu tượng "Lưu tất cả" cho phép người dùng lưu trữ tất cả các tập tin trong dự án một cách nhanh chóng Ngoài ra, bạn cũng có thể sử dụng phím tắt Ctrl + S để thực hiện chức năng này thay vì phải nhấn vào biểu tượng.

Biểu tượng đồng bộ tập tin giúp tìm kiếm và tải lại tất cả các tập tin đã thay đổi từ bên ngoài từ ổ đĩa cứng.

Chúng ta có thể dùng phím Ctrl + All +Y để thực hiện chức năng này thay vì chọn biểu tượng này

Biểu tượng Undo và Redo cho phép người dùng quay lại các hành động đã thực hiện trước đó hoặc làm lại chúng Bạn cũng có thể sử dụng phím tắt Ctrl + Z để hoàn tác và Ctrl + Shift + Z để làm lại hành động.

 Biểu tượng để “cut” tập tin hoặc hình ảnh đến Clipboad Có thể sử dụng phím Ctrl + X để thực hiện chức năng này thay vì chọn biểu tượng này

CÁC THÀNH PHẦN ỨNG DỤNG ANDROID

Các thành phần trong ứng dụng Android

- Trong một ứng dụng Android thường chúng ta sẽ gặp 8 Thành phần cơ bản sau:

Trong ứng dụng Android, Activity là một màn hình cho phép người dùng tương tác với các chức năng của ứng dụng, chẳng hạn như chụp hình, xem bản đồ và gửi email.

- Một ứng dụng có thể có một hoặc nhiều Activity, Activity được khởi chạy đầu tiên khi ứng dụng hoạt động được gọi là “MainActivity”

- Activity có thể hiển thị ở chế toàn màn hình, hoặc ở dạng cửa sổ với một kích thước nhất định

- Các Activity có thể gọi đến các Activity khác, Activity được gọi sẽ nhận được tương tác ở thời điểm đó

Intent là một đối tượng chứa thông điệp, cho phép tạo ra các yêu cầu hành động giữa các thành phần trong ứng dụng hoặc giữa các ứng dụng khác nhau.

- Được sử dụng nhiều trong 3 trường hợp sau:

 Chuyển phát thông tin cho Broadcast Receiver

View được sử dụng để tạo ra các điều khiển trên màn hình, cho phép người dùng tương tác và hiển thị thông tin cần thiết.

- View bao gồm hai dạng:

 View: các điều khiển đơn lẻ

 ViewGroup: tập hợp nhiều điều khiển đơn lẻ

Thành phần ứng dụng cho phép truyền tải thông báo trên toàn hệ thống mà không cần giao diện, thông qua thanh trạng thái Broadcast Receiver có khả năng truyền thông báo dưới hai dạng khác nhau.

 Hệ thống: các thông báo được truyền trực tiếp từ hệ thống như: tắt màn hình, pin yếu, thay đổi kết nối…

 Ứng dụng: xây dựng các truyền thông báo đến các Thành phần trong ứng dụng như: khởi động Service, tải nội dung đến ứng dụng…

- Service được sử dụng để thực thi các tác vụ cần nhiều thời gian, thực hiện ở chế độ ngầm và thường không cần giao diện hiển thị

- Service được chạy ngầm, tức lại ứng dụng vẫn chạy nhưng không hiển thị giao diện tương tác

- Một số tác vụ cần thực hiện bằng Service:

 Trình diễn các tập tin đa truyền thông như nhạc, phim, …

 Kết nối và thực hiện tải các nội dung thông qua Internet

 Truy xuất đọc ghi tập tin

Content Provider phát triển phương pháp truy xuất dữ liệu ứng dụng từ nhiều nguồn khác nhau, bao gồm SQLite, tập tin, tài nguyên Web và các thư mục lưu trữ khác.

- Có thể sử dụng Content Provider để xây dựng các ứng dụng sử dụng chung nguồn tài nguyên hoặc sử dung riêng

- Trong Android, một số Content Provider được xây dựng sẵn:

 Tài nguyên đa truyền thông

- Context thuộc gói android.content (android.content.Context)

Lớp cơ bản của Android chứa hầu hết thông tin về môi trường ứng dụng, cho thấy rằng mọi thao tác và tương tác với hệ điều hành đều phải diễn ra qua lớp này.

- Nó cung cấp các phương thức để các lớp khác có thể tương tác với hệ thống Android

Context cho phép truy cập đến các nguồn tài nguyên đã được định nghĩa và các lớp khác, đóng vai trò quan trọng trong việc kết nối các thành phần của hệ thống Nó có thể được xem như một lớp ở mức ứng dụng, giúp cải thiện khả năng tương tác và quản lý tài nguyên hiệu quả hơn.

Hầu hết các lớp liên quan đến giao diện người dùng (UI) như layout, button, textview, imageview, và listview đều cần phải gọi "super" tới Context Điều này là do Context chịu trách nhiệm truy cập các tài nguyên như R.id và R.layout Nếu không tham chiếu đến lớp Context, chúng ta sẽ không thể sử dụng các tài nguyên mà mình đã tạo ra.

Context giúp chúng ta dễ dàng truy cập và tương tác với các tài nguyên của hệ thống, bao gồm thông tin, dịch vụ, thông số cấu hình, dữ liệu, danh bạ, cuộc gọi, kết nối và chế độ rung.

Thành phần thông báo cho phép gửi thông tin đến người dùng mà không làm gián đoạn hoạt động của họ trên thiết bị Ví dụ, khi nhận được tin nhắn hoặc email, thiết bị sử dụng thông báo để cảnh báo người dùng qua âm thanh, đèn nền, hoặc biểu tượng trên thanh tác vụ.

- Notification được xây dựng cho mục đích gửi các thông báo đến người dùng thông qua thanh trạng thái

- Giao diện Notification không thuộc giao diện ứng dụng, nhưng có thể tuỳ chỉnh giao diện Notification thông qua các phương thức có sẵn

TƯƠNG THÍCH THIẾT BỊ

- Ứng dụng Android được viết bằng ngôn ngữ Java và biên dịch, đóng gói cùng các tập tin tài nguyên thành tập tin *.apk

- Cài đặt trên thiết bị theo đường dẫn data/app/, được chứa trong Sandbox và được hiểu:

 Mỗi ứng dụng là một dạng “người dùng” khác nhau

 Mỗi ứng dụng được cấp một ID, do đó chỉ duy nhất ứng dụng mới có thể truy xuất các tập tin liên quan đến ứng dụng đó

 Ứng dụng thực thi riêng biệt trên từng máy ảo

 Tiến trình Linux được cấp phát khi bất cứ Thành phần ứng dụng được gọi thực thi, và thu hồi khi chấm dứt hoạt động

 Các ứng dụng có cùng ID và chứng chỉ (Cerfiticate) có thể truy xuất tài nguyên của nhau, hoặc xin quyền nếu truy xuất hệ thống

- Tính tương thích ứng dụng với thiết bị bao gồm:

 Trang bị tính năng của thiết bị

 Phiên bản hệ điều hành

- Trang bị tính năng của thiết bị:

 Mỗi tính năng phần cứng và phần mềm trên thiết bị Android được cung cấp một

ID, qui định thiết bị đó có được trang bị tính năng đó hay không Ví dụ:

FEATURE_SENSoR_CoMPASS: tính năng la bàn

FEATURE_APP_WIDGET: tính năng gắn Widget

- Phiên bản hệ điều hành:

Mỗi phiên bản mới của API đều có sự thay đổi về các phương thức, vì vậy việc khai báo thông tin phiên bản là cần thiết để tận dụng đầy đủ tính năng cho ứng dụng.

 Android ICS 4.0: bổ sung API cho Calendar

Android Kit Kat 4.4 đã bổ sung API cho WirelessPrint, giúp nâng cao khả năng in ấn từ thiết bị di động Ứng dụng Android cần tương thích với nhiều kích cỡ màn hình, được phân chia thành hai thuộc tính để đảm bảo trải nghiệm người dùng tốt nhất trên các thiết bị khác nhau.

 Kích thước vật lý màn hình

 Độ phân giải (mật độ điểm ảnh).

ACTIVITY VÀ ĐỘ ƯU TIÊN ỨNG DỤNG

Trong ứng dụng Android, người dùng tương tác với nhiều Activity, không chỉ một Để lập trình hiệu quả, cần chuyển đổi giữa các Activity và truyền dữ liệu từ Activity trước sang Activity mới để xử lý.

- Mỗi Activity đại diện cho một màn hình ứng dụng Ta sẽ thực hiện tạo Activity cho ứng dụng theo các bước sau:

 Tạo mới lớp kế thừa từ lớp Activity

 Thực thi các phương thức quản lý trạng thái Activity

 Xây dựng giao diện trong tài nguyên res/layout

 Khai báo Activity trong tập tin AndroidManifest.xml

Ví dụ: public class MyFirstActivity extends Activity{

@override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

- Đăng kí Activity trong tập tin AndroidMannifest.xml:

3.2 Quản lý trạng thái Activity (Managing the Activity Lifecycle)

Activity là thành phần quan trọng nhất trong việc xây dựng ứng dụng Android Hệ điều hành Android quản lý Activity theo dạng stack, trong đó khi một Activity mới được khởi tạo, nó sẽ được xếp lên đầu stack và trở thành activity đang chạy Các Activity trước đó sẽ bị tạm dừng và chỉ hoạt động trở lại khi Activity mới được giải phóng.

+ Tương tự như các ngôn ngữ lập trình khác, Activity Stack hoạt động theo cơ chế LIFo (LAST IN FIRST oUT)

Mỗi khi một Activity mới được mở, nó sẽ hiển thị trên Activity cũ Để trở về Activity trước, bạn chỉ cần nhấn nút “Back” hoặc sử dụng lệnh thích hợp Tuy nhiên, nếu bạn nhấn nút “Home”, bạn sẽ không thể sử dụng nút “Back” để quay lại màn hình cũ.

- Một Activity cơ bản có 4 trạng thái:

 Active: Activity đang hiển thị trên màn hình (foreground)

 Paused: Activity vẫn hiển thị (visible) nhưng không thể tương tác (lost focus)

Khi một activity mới xuất hiện, nó sẽ hiển thị giao diện chồng lên trên activity cũ Giao diện mới này có kích thước nhỏ hơn, cho phép người dùng vẫn nhìn thấy một phần của giao diện cũ, nhưng không thể tương tác với nó.

 Stopped: Activity bị thay thế hoàn toàn bởi Activity mới sẽ tiến đến trạng thái stopped

Khi hệ thống gặp tình trạng thiếu bộ nhớ, nó sẽ tự động giải phóng các tiến trình dựa trên nguyên tắc ưu tiên Các Activity ở trạng thái dừng hoặc tạm dừng cũng có thể bị giải phóng, và khi chúng được hiển thị trở lại, cần phải khởi động lại hoàn toàn và phục hồi trạng thái trước đó.

3.3 Vòng đời của Activity (Activity Lifecycle) o Entire lifetime: Từ phương thức onCreate() cho tới onDestroy(): từ lúc Activity được gọi ra cho đến lúc bị huỷ o Visible liftetime: Từ sau khi gọi onStart() cho tới lúc gọi onStop() : trong trường hợp này ta vẫn có thể thấy màn hình Activity o Foreground lifetime: o Xảy ra từ khi gọi onResume() cho tới lúc gọi onPause(): trong suốt thời gian này Activity luôn nằm ở trên cùng và ta có thể tương tác được với nó

Hình 2.4 Vòng đời của Activity

3.4 Độ ưu tiên trong ứng dụng

- Android quản lý các Ứng dụng dựa trên độ ưu tiên

- Nếu hai ứng dụng có cùng trạng thái thì ứng dụng nào đã chạy lâu hơn sẽ có độ ưu tiên thấp hơn

- Nếu ứng dụng đang chạy một Service hay Content Provider do một ứng dụng khác hỗ trợ thì sẽ có cùng độ ưu tiên với ứng dụng đó

- Các ứng dụng sẽ bị đóng mà không có sự báo trước

Hình 2.4 Cách phân định độ ưu tiên

- Foreground process: là process của ứng dụng hiện thời đang được người dùng tương tác

- Visible process: là process của ứng dụng mà activity đang hiển thị đối với người dùng (onPaused() của activity được gọi)

Service process: là Service đang chạy

- Background process: là process của ứng dụng mà các activity của nó không hiển thị với người dùng (onStoped() của activity được gọi)

- Empty process: process không có bất cứ 1 Thành phần nào active

Theo chế độ ưu tiên thì khi cần tài nguyên, Android sẽ tự động kill process, trước tiên là các empty process

Bài tập của học viên

1 Trình bày các Thành phần trong ứng dụng Android

2.Ứng dụng Android đã hoạt động thế nào

3.Tạo ra giao diện người dùng

1 Trình bày các Thành phần trong ứng dụng Android, tham khảo tại mục 1 ở bài 2 trong giáo trình

2 Ứ ng d ụ ng Andro id đã h o ạt độ ng th ế nào

Bạn vừa hoàn thành việc chạy ứng dụng Android đầu tiên và bây giờ hãy cùng xem xét cách mà Android hoạt động từ thời điểm ứng dụng được khởi động.

Trong cửa sổ Project, bạn chỉ thấy một phần của các Thành phần tham gia tạo nên ứng dụng của mình, vì một số Thành phần được tạo ra tự động bởi chương trình biên dịch và không hiển thị ở đây Chẳng hạn, dựa vào cấu trúc các file nguồn trong project, trình biên dịch sẽ tạo ra file nguồn R.java, file này định nghĩa các hằng số cho các nguồn tài nguyên trong project Để xem file R.java trong Android Studio, bạn có thể mở class MainActivity, nhấn chuột phải vào R.layout.main_activity và chọn Go To/Implementation(s).

Hình 2.7 Cửa sổ R.javaCác hằng số định nghĩa trong class R.java được tạo ra tương ứng với các tài nguyên trên Project:

Trong Project, bạn có thể sử dụng các hằng số để tham chiếu tài nguyên, ví dụ như R.layout.activity_main, đại diện cho file activity_main.xml trong thư mục res/layout.

Hình 2.8 Cửa sổ Nguyên tắc hoạt động

3.Tạ o ra giao diện người dùng

Những trọng tâm cần chú ý:

 Trình bày các Thành phần trong ứng dụng Android

 Trình bày tính tương thích thiết bị

 Quản lý trạng thái Activity (Managing the Activity Lifecycle)

 Trình bày độ ưu tiên trong ứng dụng

Bài mở rộng và nâng cao

Khám phá Google Nexus 9 trên máy ảo

Yêu cầu đánh giá kết quả học tập

 Trình bày các Thành phần trong ứng dụng Android

 Trình bày tính tương thích thiết bị

 Mô tả xây dựng Activity

 Trình bày quản lý trạng thái Activity (Managing the Activity Lifecycle)

 Trình bày độ ưu tiên trong ứng dụng

+ Thao tác thành thạo các bước cài đặt, cấu hình Bài trình diệt Virus symantec antivirus server và symantec antivirus client trên Windows Server 2019

+ Thực hiện đúng các thao tác bước cài đặt, cấu hình Bài trình diệt Virus symantec antivirus client

 Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc

 Về kiến thức: Đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp.

 Về kỹ năng: Đánh giá kỹ năng thực hành thực hiện cài đặt, cấu hình diệt Virus symantec antivirus

 Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc.

CÁC ĐIỀU KHIỂN CƠ BẢN

Giao diện người dùng

Giao diện người dùng là yếu tố quyết định sự thành công của ứng dụng Android, với yêu cầu phải trực quan, dễ hiểu và dễ sử dụng Bài viết này sẽ khám phá cấu trúc giao diện, các thành phần trên giao diện và thuộc tính của chúng để giúp ứng dụng thu hút người dùng hơn.

Giao diện được hình thành từ nhiều tài nguyên thiết yếu như layout, các điều khiển, hình ảnh và màu sắc Tất cả các tài nguyên này phục vụ cho việc thiết kế giao diện đều được lưu trữ trong thư mục res/.

- Các tài nguyên layout được lưu trữ trong thư mục res/layout

- Có thể có nhiều thư mục layout theo từ hạn định khác nhau:

- Truy xuất: bao gồm 2 cách thức:

+ Java: R.layout.

+ XML: @[pakage:]layout/

Layout trong Android là các lớp mở rộng từ ViewGroup, cho phép sắp xếp và bố trí các điều khiển giao diện Mỗi người dùng có thể tạo ra giao diện khác nhau, nhưng cần cân bằng giữa tính tiện dụng và thẩm mỹ Android cung cấp nhiều lớp Layout để người dùng có thể sử dụng hoặc tùy chỉnh theo nhu cầu của từng ứng dụng.

Bao gồm các lớp kế thừa từ ViewGroup: AbsoluteLayout (Deprecated), AdapView (ListView, Gridview…), DrawerLayout, FragmentBreadCrumbs, FrameLayout, GridLayout, LinearLayout, PagerTitleStrip, RelativeLayout, SlidingDrawer, SlidingPaneLayout, SwipeRefreshLayout, ViewPager

- Sử dụng trong các trường hợp xây dựng bố cục tổ chức hiển thị một đối tượng duy nhất

- Đối tượng mặc định vị trí topoleft trên FrameLayout, có thể sử dụng thuộc tính Gravity để thiết lập lại vị trí

Frame Layout có khả năng chứa nhiều View, cho phép các View này chồng lên nhau Tuy nhiên, các View nằm dưới có thể bị che khuất bởi các View nằm trên Do đó, Frame Layout thường chỉ được sử dụng để chứa một View duy nhất.

- Các đối tượng kế thừa phổ biến của FrameLayout:

+ ViewFlipper: đối tượng cho phép thực hiện hiển thị các đối tượng ở chế độ phân trang, chỉ hiển thị một đối tượng ở một thời điểm

 Các phương thức sử dụng:

• showPrevious + ScrollView: đối tượng cho phép thực hiện hiển thị các đối tượng ở chế độ cuộn màn hình, chỉ cho phép chứa một đối tượng ở một thời điểm

Ví dụ khai báo: android:layout_height="match_parent” >

Các phương thức sử dụng: o setFillViewPort o scrollBy o scrollTo o smoothScrollBy o smoothScrollTo

Giao diện một hướng được hiểu là việc sắp xếp các View trong Layout theo một chiều nhất định, có thể là chiều ngang (từ trái qua phải) hoặc chiều dọc (từ trên xuống dưới) Thuộc tính weight trong Layout cho phép điều chỉnh kích thước của các View dựa trên mối quan hệ của chúng, ví dụ như trong cùng một hàng.

LinearLayout được coi là một trong những Layout dễ sử dụng nhất, cho phép tạo ra giao diện đơn giản bằng cách sắp xếp các View theo một chiều duy nhất Tuy nhiên, điều này có thể gây khó khăn khi thiết kế các giao diện phức tạp, vì vậy LinearLayout thường được sử dụng trong các Layout khác Chẳng hạn, ta có thể thiết kế LinearLayout lồng nhau, với một Layout Horizontal chứa hai Button và một Layout Vertical cho phép hai Button nằm trên ListView.

- Có thể kéo dãn độ rộng một cột với thuộc tính: android: layout_span

Khi các View được đặt lên Layout, vị trí của chúng phụ thuộc vào View đã được đặt trước đó Vì vậy, việc thay đổi vị trí của một View sẽ ảnh hưởng đến vị trí của các View còn lại trong Layout.

Đối với các giao diện phức tạp, việc sử dụng Relative Layout sẽ mang lại sự thuận tiện hơn Trong Relative Layout, vị trí của các View được xác định dựa trên vị trí của các View đã được đặt trước đó và đối tượng chứa chúng.

- Ví dụ ở đây ta có thể xây dựng Layout cho TextView nằm phía trên ba Button theo vị trí tuỳ ý

Khi thiết kế giao diện, việc kết hợp nhiều loại layout có thể tạo ra sự sáng tạo, nhưng cũng làm tăng độ phức tạp và giảm tốc độ xử lý Do đó, cần chú ý và hạn chế sử dụng nhiều layout chồng chéo để đảm bảo hiệu suất tối ưu cho giao diện.

View và Viewgroup

Trong phát triển ứng dụng Android, việc tạo giao diện yêu cầu sử dụng hai lớp cốt lõi là View và ViewGroup Hai lớp này đóng vai trò quan trọng và thường xuyên được áp dụng trong quá trình xây dựng ứng dụng.

View và ViewGroup là hai lớp Java kế thừa từ lớp Java object

In Android development, the View class serves as the top-level parent class, while various subclasses such as ViewGroup, TextView, AnalogClock, and ImageView inherit from it Additionally, the ViewGroup class has its own subclasses, including FrameLayout, LinearLayout, and RelativeLayout Similarly, the TextView class is extended by three subclasses: EditText, Button, and CheckedTextView.

Hình 3.5 Các đối tượng View trong thư viện Android

View được sử dụng để tạo ra các điều khiển trên màn hình, cho phép người dùng tương tác và hiển thị thông tin cần thiết.

- View bao gồm hai dạng: o View: các điều khiển đơn lẻ o ViewGroup: tập hợp nhiều điều khiển đơn lẻ

Các đối tượng View hiển thị trên giao diện màn hình dưới dạng hình chữ nhật, với vị trí, kích thước và màu sắc có thể tùy chỉnh Chúng cũng nhận và xử lý các tương tác liên quan.

- Một số thể hiện của lớp View: TextView, ImageView, SurfaceView…

- ViewGroup cũng là một thể hiện của View

- Có thể xây dựng đối tượng View theo 2 cách:

 Kéo thả và tuỳ chỉnh thuộc tính trong XML

 Thiết lập thông số và truy xuất trực tiếp trong Java Code

Hiển thị nội dung thông qua phương thức set(TS)

Ví dụ: TextView hiển thị văn bản, ImageView hiển thị hình ảnh…

Ví dụ: sử dụng requestFocus để yêu cầu tương tác với điều khiển

Thiết lập chế độ hiển thị thông qua phương thức setVibility (hoặc thuộc tính visibility: trong XML)

• VISIBLE: Trạng thái hiển thị

• INVISIBLE: Trạng thái ẩn (vẫn giữ lại vị trí trên màn hình)

• GoNE: Trạng thái mất đi (mất vị trí trên màn hình) Xây dựng phương thức “lắng nghe”

Một số sự kiện lắng trên đối tượng View:

- Ví dụ: bắt lại các sự kiện nhấn xảy ra trên điều khiển: view.setonCLickListener(new onClickLisntener() {

@override public void onClick(View v) { Log.i(“View”, “onClick”);

2.2 Các thuộc tính của View

- Khai báo kiểu số nguyên int, đánh dấu vùng nhớ của đối tượng View

- Id có thể giống nhau cho các điều khiển khác nhau trong cùng một tập tin giao diện

- Phương thức thiết lập setId()

- Phương thức truy xuất getId()

- Thuộc tínhaid được đi kèm với đối tượng View khi khai báo trong XML cho phép truy xuất trong Java Code khi cần Ví dụ:

Khai báo id trong XML

To create a button in Android, use the following XML code: `` This button is designed to be centered horizontally, positioned below another element with the ID `edtClass`, and features a blue background with white text.

Button myBtn = (Button)findViewById(R.id.btnAdd);

2.2.2 Thuộc tính vị trí: cho biết toạ độ hiển thị cho View trên giao diện

- Phương thức thiết lập : o layout o setLeft o setTop o setRight o setBottom

- Phương thức truy xuất: o getLeft o getTop o getRight o getBottom

Vị trí của View phụ thuộc vào thuộc tính của đối tượng Layout, bao gồm kích thước chiều ngang và chiều cao Kích thước của đối tượng View có thể được thiết lập thông qua các thông số cụ thể.

 MATCH_PARENT (API 8 trở lên)

FILL_PARENT là một thông số có thể được thiết lập bằng bất kỳ giá trị nào tính theo dp, px hoặc dip Để thiết lập FILL_PARENT, bạn có thể sử dụng đối tượng LayoutParams hoặc chỉ định thông qua các thuộc tính layout_width và layout_height trong XML.

• getMeasureHeight o Canh lề nội dung trong JavaCode:

 Phương thức thiết lập: setPadding

Các điều khiển cơ bản

3.1 TextView: o TextView là đối tượng cho phép hiển thị các nội dung văn bản ở 4 dạng: o Normal : : dạng văn bản kích thước font chữ mặc đinh o SmallText : dạng văn bản kích thước font chữ nhỏ o MediumText : dạng văn bản kích thước font chữ vừa o LargeText : dạng văn bản kích thước font chữ to

- Thiết lập nội dung hiển thị:

Trong Java code: textView.setText(“Đối tượng TextView”);

Trong XML: android:text="Đối tượng TextView"

- TextView được hổ trợ các phương thức để thực hiện các siêu liên kết (Linkify)

Cơ chế tự động thiết lập hành động cho các siêu liên kết, bao gồm:

Trong Java code: textView.setAutoLinkMask(Linkify.PHONE_NUMBERS);

Trong XML: android:autoLink="phone"

- TextView cho phép hiển thị hình ảnh theo văn bản ở hai dạng: o Theo bố cục văn bản: Left, Top, Right, Bottom o Theo đoạn văn bản: Start, End

Trong Java code: textView.setCompoundDrawables(Left,Top, Right, Bottom);

Trong XML: android:drawableLeft=“@drawable/ic_launcher”

- Một số phương thức quan trọng khác: o setTextColor – android:textColor: thiết lập màu chữ o setTextSize – android:textSize: thiết lập kích cỡ chữ

Hình 3.7 Ví dụ về TextView o setTypeFace – android:typeface: thiết lập các tuỳ chọn khác về font hay áp dụng một định dạng font ngoài cho TextView

- EditText là lớp kế thừa từ TextView, được dùng thay đổi nội dung text, chứa tất cả thuộc tính của TextView

- Đối tượng Button được xây dựng từ TextView, cho phép thể hiện các nội dung văn bản, hình ảnh – nhận và phản hồi tương tác nhấn từ người dùng

- Bắt sự kiện khi người dùng ấn vào Buton: có 3 cách chính như sau: o Cách 1:

Button btnHello = (Button) findViewById(R.id.btnHello); btnHello.setonClickListener(new onClickListener() {

@override public void onClick(View v) {

}); o Cách 2: Cho Activity implement onClickListener của android.view.View import android.view.View.onClickListener;

Hình 3.9 Button public class MainActivity extends ActionBarActivity implements onClickListener

@override protected void onCreate(Bundle savedInstanceState)

{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

Button btnHello = (Button) findViewById(R.id.btnHello); btnHello.setonClickListener(this);

@override public void onClick(View v) { switch (v.getId()) { case R.id.btnHello: //do something break; default: break;

} o Cách 3: Thêm thuộc tính onClick vào thẻ Button:

- Viết phương thức public void doHello() trong MainActivity

@override protected void onCreate(Bundle savedInstanceState)

{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

} public void doHello(View v){ switch (v.getId()) { case R.id.btnHello: //do something break; default: break;

- CheckBox là đối tượng nút bấm hai trạng thái “được chọn” và “bỏ chọn” o

Phương thức lắng nghe sự kiện thay đổi trạng thái: checkBox.setonCheckedChangeListener(new onCheckedChangeLisntener() {

@override public void onCheckedChangeListener(CompoundButton v, boolean isChecked)

3.5 RadioButton: Đối tượng nút bấm hai trạng thái “được chọn” và “bỏ chọn”, không thể “bỏ chọn” khi đã “được chọn”

- Thường xử lý trên nhóm nút nhiều trạng thái

To listen for state change events in a RadioGroup, use the following method: `radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { Log.i("CompoundButton", "Checked at id:" + checkedId); } });` This code snippet allows you to capture and log the ID of the checked radio button whenever a selection is made.

3.6 ToggleButton: Đối tượng nút bấm hai trạng thái “bật” và “tắt”, thể hiện trạng thái trên đối tượng

- Thuộc tính quan trọng: o texton: trạng thái nút đang bật o textoff: trạng thái nút đang tắt

- Phương thức lắng nghe sự kiện thay đổi trạng thái trên nhóm nút: toggleButton.setonCheckedChangeListener(new onCheckedChangeLisntener() { @override public void onCheckedChangeListener(CompoundButton v, boolean isChecked) { Log.i(“CompoundButton”, “onChecked”); } });

3.7 Switch: Đối tượng nút bấm hai trạng thái “bật” và “tắt”, có thể thao tác bằng cách trượt ngón tay trên đối tượng o Thuộc tính quan trọng: texton: trạng thái nút đang bật o textoff: trạng thái nút đang tắt

- Phương thức lắng nghe sự kiện thay đổi trạng thái trên nhóm nút: switchButton.setonCheckedChangeListener(new onCheckedChangeLisntener() { @override public void onCheckedChangeListener(CompoundButton v, boolean isChecked) { Log.i(“CompoundButton”, “onChecked”);

Ngoài việc thiết lập các thuộc tính cho layout và các điều khiển trong tệp XML như đã nêu, chúng ta còn có thể nhập các giá trị mong muốn vào giao diện đã được hỗ trợ sẵn.

Hình 3.10 Minh họa thiết lập giá trị layout width trên giao diện tương tác.

Kiểm tra lỗi và tối ưu lại giao diện

Để kiểm tra lỗi và tối ưu lại giao diện, Android Studio có hỗ trợ công cụ Heirarchy Viewer giúp chúng ta làm việc này

To use the Hierarchy Viewer, click on the Android Device Monitor icon in the toolbar or navigate to Tools → Android → Android Device Monitor This will open the Android Device Monitor screen, where you can find and select the open Perspectives icon, then choose Hierarchy Viewer and click OK.

Chúng ta có thể sử dụng Hierarchy Viewer để kiểm tra cấu trúc giao diện bằng cách kết nối thiết bị thật hoặc khởi động thiết bị ảo, sau đó mở ứng dụng Hierarchy Viewer.

Khi ứng dụng khởi động, danh sách các thiết bị kết nối sẽ hiển thị Bạn chỉ cần chọn thiết bị cần kiểm tra và nhấn đúp vào tên gói của ứng dụng để xem cấu trúc giao diện, từ đó khám phá cấu trúc cây của giao diện ứng dụng đang hoạt động trên thiết bị.

Công cụ Hierarchy Viewer cho phép khảo sát cấu trúc giao diện ứng dụng, trong khi công cụ Pixel Perfect hỗ trợ việc phóng to, thu nhỏ màn hình Công cụ Pixel Perfect rất hữu ích trong việc phát triển giao diện ứng dụng yêu cầu độ chính xác cao về hình ảnh, giúp tinh chỉnh hình ảnh, màu sắc và độ trong suốt một cách hợp lý.

Bài tập của học viên

1 Hiểu và vận dụng được các điều khiển về giao diện người sử dụng

2 Vận dụng được View và Viewgroup vào ứng dụng thực tế

3 Vận dụng được các điều khiển cơ bản vào ứng dụng thực tế

4 Hiểu biết cách tối ưu hóa giao diện của chương trình

5 Thiết kế giao diện android –Tạo layout bằng code

Hình 3.12 Tạo layout bằng code

1 Trình bày và vận dụng được các điều khiển về giao diện người sử dụng, tham khảo mục 1 của Bài 3 trong giáo trình

2 Vận dụng được View và Viewgroup vào ứng dụng thực tế tham khảo mục

2 của Bài 3 trong giáo trình

3 Vận dụng được các điều khiển cơ bản vào ứng dụng thực tế

4 Trình bày biết cách tối ưu hóa giao diện của chương trình, tham khảo mục 3,4 của Bài 3 trong giáo trình

5 Thiết kế giao diện android –Tạo layout bằng code public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

//Tạo LinearLayout LinearLayout ll = new LinearLayout(this);

//Tạo button Button btn1 = new Button(this); btn1.setText("Hello");

//Tạo button Button btn2 = new Button(this); btn2.setText("World");

//Gắn button vào layout ll.addView(btn1);

Những trọng tâm cần chú ý:

 Trình bày đầy đủ nội dung Sự phức tạp của kiểm thử hàm, có cho ví dụ cụ thể

 Trình bày Kiểm thử lớp tương đương

 Trình bày Kiểm thử giá trị biên

 Trình bày chức năng Kiểm thử bằng bảng quyết định

 Trình bày Kiểm thử tổ hợp

 Thực hiện đúng các thao tác lập trình để kiểm thử

Bài mở rộng và nâng cao

Bài thực hành số 1: Thiết kế giao diện cho ứng dụng đổi năm dương lịch sang năm âm lịch

Hình 3.13 đổi năm dương lịch sang năm âm lịch

Bài thực hành số 2:Thiết kế giao diện cho ứng dụng tìm số nhỏ nhất trong 2 số

Hình 3.14 tìm số nhỏ nhất trong 2 số

Yêu cầu đánh giá kết quả học tập

 Hiểu và vận dụng được các điều khiển về giao diện người sử dụng

 Vận dụng được View và Viewgroup vào ứng dụng thực tế

 Vận dụng được các điều khiển cơ bản vào ứng dụng thực tế

 Hiểu biết cách tối ưu hóa giao diện của chương trình

 Trình bày thao tác cách tạo giao diện đơn giản

+ Thao tác thành thạo tronng gười dùng giao diện truy xuất tài nguyên

+ Thực hiện đúng các thao tác truy xuất tài nguyên cơ bản cũng như nang cao

 Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc

 Về kiến thức: Đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp

 Về kỹ năng: Đánh giá kỹ năng Thực hiện đúng các thao tác truy xuất Veiw,

Đánh giá kỹ năng cấp quyền cho người dùng và nhóm trong việc khai thác dữ liệu trên hệ thống là rất quan trọng Điều này đòi hỏi sự tự chủ và trách nhiệm, thể hiện qua tính tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc.

TÀI NGUYÊN ỨNG DỤNG TRONG ANDROID

TỔNG QUAN

Tài nguyên ứng dụng nâng cao là dạng dữ liệu được thiết kế để đáp ứng yêu cầu hiển thị trên các thiết bị khác nhau, bao gồm hình ảnh, âm thanh, văn bản và bố cục Chúng cho phép khai báo một lần và sử dụng rộng rãi trong toàn bộ ứng dụng, đồng thời dễ dàng điều chỉnh theo ngữ cảnh.

Android cung cấp nhiều phương pháp để sử dụng tài nguyên như hình ảnh, chuỗi hằng, chuyển hoạt và bố cục giao diện mà không cần phụ thuộc quá nhiều vào mã lệnh Điều này giúp đơn giản hóa quá trình lưu trữ, quản lý và cập nhật Ngoài ra, thiết kế trên Android cũng mang lại sự linh động trong việc điều chỉnh cho nhiều thiết bị phần cứng khác nhau.

- Hệ thống tự động tạo thư mục /res dùng để chứa các thư mục của từng loại tài nguyên

- Các file tài nguyên sẽ được chứa trong các thư mục tùy thuộc vào định dạng của tài nguyên đó

Để phát triển ứng dụng Android, chúng ta cần tạo các thư mục tài nguyên đúng định dạng Tài nguyên ứng dụng được định nghĩa trong thư mục res của dự án, bao gồm nhiều loại tài nguyên khác nhau.

 Animator : Các dạng tài nguyên chuyển hoạt (property animation) o

 Anim : Các dạng tài nguyên chuyển hoạt (property animation) o

 Color : Các dạng tài nguyên màu sắc

 Drawable : Các dạng tài nguyên hình ảnh o

 Layout : Các dạng tài nguyên giao diện o

 Menu : Các dạng tài nguyên chỉ mục o

 Raw : Các dạng tài nguyên không biên dịch o

 Values : Các dạng tài nguyên cơ bản Ví dụ: String, Integer, Boolean…

 o XML : Các dạng tài nguyên xml khác ình 4.1 Thư mục chứa tài nguyên ứng dụng Android

- Có quá nhiều thiết bị có cấu hình khác nhau về kích thước màn hình, độ phân giải, phím vật lý…

- Mỗi thiết bị có thể hoạt động ở nhiều chế độ khác nhau: nằm ngang, nằm đứng, thay đổi ngôn ngữ…

Từ hạn định là công cụ quan trọng trong việc tạo ra tài nguyên cho các thiết bị với cấu hình và chế độ hoạt động khác nhau Khi khởi tạo một Project mới, trong thư mục res sẽ xuất hiện bốn thư mục drawable và ba thư mục values, được phân biệt bởi hậu tố “o” Hậu tố này giúp phân loại tài nguyên cho các cấu hình khác nhau Khi ứng dụng được cài đặt trên thiết bị, hệ thống sẽ tự động tìm kiếm và sử dụng các tài nguyên phù hợp với phần cứng của thiết bị đó.

Hình 4.2 Ví dụ về từ hạn định

- Tất cả thư mục tài nguyên đều có thể sử dụng từ hạn định Bao gồm các từ hạn định sau:

MCC/MNC (Mã Quốc Gia Di Động – Mã Mạng Di Động) là các tài nguyên trong thư mục chỉ sử dụng cho một quốc gia hoặc nhà cung cấp dịch vụ mạng cụ thể Để sử dụng, người dùng cần khai báo mã MCC theo sau là số của quốc gia, hoặc số của nhà mạng nếu là MNC Ví dụ, mã mmc452omnc04 đại diện cho Việt Nam và mạng Viettel.

Các từ hạn định trong ngôn ngữ/region giúp phân biệt tài nguyên cho các thiết bị với các thiết lập ngôn ngữ khác nhau Những từ này bao gồm hai ký tự theo tiêu chuẩn ISO 639-01 và ISO 3166-1 alpha-2, ví dụ như "vn" cho tiếng Việt, "en" cho tiếng Anh, "en-US" cho tiếng Anh ở Mỹ và "en-GB" cho tiếng Anh ở Anh.

Chiều rộng màn hình nhỏ nhất (Smallest Screen Width) là một yếu tố quan trọng trong thiết kế giao diện đa dạng cho các thiết bị Các giá trị như sw600dp, sw320dp và sw720dp được sử dụng để xác định kích thước tối thiểu của màn hình, giúp đảm bảo rằng giao diện hoạt động hiệu quả trên nhiều loại thiết bị khác nhau.

Chiều rộng và chiều cao màn hình khả dụng là các kích thước tối thiểu cần thiết để chứa các tài nguyên sử dụng trong quá trình quay màn hình, chẳng hạn như w600dp và h720dp.

Kích thước màn hình được phân loại thành ba nhóm chính: nhỏ (từ HVGA trở xuống), trung bình (từ HVGA đến VGA) và lớn (từ VGA trở lên).

 Screen Aspect Ratio – bao gồm 2 lựa chọn long và notlong để chỉ định các màn rộng Ví dụ WVGA là long và QVGA là notlong

 Screen orientation – từ hạn định cho biết hướng cầm của thiết bị bao gồm port (portrait) khi thiết bị đứng và land (landscape) khi thiết bị nằm ngang

 Dock Mode – bao gồm car chế độ thiết bị dùng cho tình trạng lái xe và desk ở chế độ thường

Mật độ điểm ảnh (dpi - dot per inch) là chỉ số quan trọng để phân biệt các tài nguyên cho các màn hình có độ phân giải khác nhau, bao gồm ldpi (thấp - 120dpi), mdpi (trung bình - 160dpi), hdpi (cao - 240dpi) và xhdpi (rất cao - 320dpi) Ngoài ra, loại màn hình cảm ứng cũng được phân loại theo các định nghĩa như notouch (không hỗ trợ cảm ứng), stylus (dùng bút vẽ) và finger (cảm ứng điện dung).

Sự sẵn có của bàn phím được phân loại thành ba loại chính: keyexposed (bàn phím cứng), keyshidden (bàn phím trượt) và keysoft (bàn phím ảo), mỗi loại đều có những đặc điểm và ứng dụng riêng trong việc nhập liệu.

Các loại kiểu nhập liệu bao gồm nokeys (không có bàn phím), qwerty (bàn phím máy tính cá nhân) và 12key (bàn phím số) Đối với phím điều hướng, có hai loại là navexposed (phím cứng) và navhidden (phím trượt) Về kiểu điều hướng giao diện người dùng, các loại bao gồm nonav (không hỗ trợ điều hướng), dpad (bàn rê), trackball (bi lăn) và wheel (bánh xe).

 Platform Version – cho phép chỉ định các tài nguyên chạy trên các phiên bản có API khác nhau Ví dụ: v7 chỉ định các phiên bản có API 7 (Android 2.1)

Chúng ta có thể sử dụng nhiều từ hạn định cho các thư mục tài nguyên khác nhau, ngăn cách bằng dấu "o" Tuy nhiên, cần lưu ý rằng các từ hạn định phải tuân theo độ ưu tiên từ trên xuống dưới và không được phép sử dụng hai từ hạn định cùng loại trong cùng một thư mục.

- Ví dụ: các thư mục tài nguyên sau là không được phép: o layoutorUSoen (không theo thứ tự) o layoutovnoen (hai từ hạn định cùng loại)

- Quy tắc đặt tên thư mục có từ hạn định: o Có thể sử dụng nhiều từ hạn định trong thư mục lựa chọn, ngăn cách bởi dấu “o”

Ví dụ: drawableoenorUSoland o Phải tuân theo quyền ưu tiên từ trên xuống dưới

• Thư mục tài nguyên được lựa chọn không được lồng vào nhau Ví dụ: Không được phép /res/drawable/drawableoen

• Chỉ một giá trị cho loại từ hạn định được hỗ trợ cho một thư mục

Ví dụ: Không được phép drawableohdpiomdpi

• Không phân biệt chữ hoa, chữ thường.

TÍNH TƯƠNG THÍCH

o Để có thể tối ưu hóa tính tương thích thiết bị tài nguyên được chia làm hai dạng:

 Tài nguyên mặc định: không quan tâm đến cấu hình của thiết bị hoặc không có tài nguyên để lựa chọn

Tài nguyên đặc trưng được sử dụng trên các thiết bị riêng biệt thông qua từ hạn định và đường dẫn Trong quá trình ứng dụng hoạt động, hệ thống sẽ tự động xác định cấu hình hiện tại của thiết bị để lựa chọn tài nguyên phù hợp, với điều kiện là ứng dụng đã khai báo nguồn tài nguyên cho thiết bị đó.

Hình 4.3 Lựa chọn tài nguyên thích hợp.

TRUY XUẤT TÀI NGUYÊN

- Tất cả tài nguyên ứng dụng được truy xuất thông qua lớp R

- Chứa trong thư mục gen, tự động tạo các định danh cho tài nguyên (ID) thông qua AAPT (Android Application Project Tool)

- Chứa các lớp tài nguyên, mỗi dạng tài nguyên là một lớp tĩnh

- Truy xuất tài nguyên hình ảnh:

• Java code: R.drawable.ic_launcher

Cú pháp dùng chung khi truy xuất:

Java Code: []R..

@[:]/

 Package_name: tên gói ứng dụng

 Resource_type: dạng tài nguyên

• Tên tài nguyên cần truy xuất không bao gồm phần mở rộng tập tin

• Thuộc tính android:name dành cho các tài nguyên cơ bản (string, color…)

Tài nguyên Alias cho phép người dùng tạo ra tài nguyên mới từ các tài nguyên có sẵn, phục vụ cho nhiều cấu hình thiết bị khác nhau, nhưng không phải là tài nguyên mặc định.

Để tạo biểu tượng ứng dụng khác nhau cho các ngôn ngữ, cần lưu ý rằng tiếng Anh và tiếng Việt sẽ sử dụng cùng một biểu tượng Giải pháp cho vấn đề này là không sử dụng Alias, mà thay vào đó, thiết kế một hệ thống quản lý biểu tượng phù hợp với từng ngôn ngữ, đảm bảo rằng người dùng có trải nghiệm nhất quán và dễ nhận diện ứng dụng.

 Tạo thư mục tài nguyên cho từng ngôn ngữ

 Chép hình ảnh khác nhau cho từng thư mục, hai thư mục có từ hạn định en và vi có hình ảnh giống nhau

- Giải quyết vấn đề (dùng Alias):

 Tạo thư mục tài nguyên cho từng ngôn ngữ

 Chép hình ảnh khác nhau cho từng thư mục

 Thư mục có từ hạn định en tạo tài nguyên Alias từ thư mục vi.

CÁC TÀI NGUYÊN ỨNG DỤNG CƠ BẢN

- Các tài nguyên cơ bản được lưu trữ trong thư mục res/values

- Định danh tài nguyên được khởi tạo thông qua thuộc tính name, không phải tên tập tin

- Có thể lưu trữ nhiều tài nguyên vào trong một tập tin

- Một số tên tập tin đề xuất trong values: string.xml, arrays.xml, colors.xml, dimens.xml,

- Tất cả các tập tin xml trong values, được mở đầu và kết thúc bằng cặp thẻ

- Cung cấp tài nguyên dạng văn bản cho ứng dụng, cho phép thực hiện các thao tác định dạng và thiết kế khác nhau, bao gồm ba dạng:

Text_string

•string_name: định danh dùng để truy xuất trong XML và Java Code

• text_string: nội dung lưu trữ

Ví dụ: tạo tập tin strings.xml

Hello world!

- Truy xuất và sử dụng:

Khai báo TextView và gắn văn bản cho thuộc tính text o Truy xuất trong XML:

Truy xuất trong Java Code:

 Truy xuất trực tiếp: textView.setText(R.string.hello);

 Dùng phương thức getString: textView.setText(getString(R.string.hello));

[true | false]

- Ví dụ: res/valuesosmall/bools.xml

true

true

Hexa_color

- Tham chiếu tài nguyên trong xml

- Tham chiếu tài nguyên trong Java code

Resources res = getResources(); int color = res.getColor(R.color.color_name);

/res/values/filename.xml o Cú pháp khai báo:

- Tham chiếu tài nguyên trong xml:

- Tham chiếu tài nguyên trong Java code

TextView tv = (TextView) findViewById(R.id.id_name);

- Khai báo tài nguyên sử dụng cho các đại lượng kích thước trong ứng dụng

- Có thể sử dụng các đại lượng kích thước sau: dp – dip, sp, pt, px, mm, in

size

 dimen_name: định danh dùng để truy xuất trong XML và Java Code

 size: đại lượng đi kèm định dạng

- Ví dụ: tập tin dimens.xml

20sp

- Ví dụ truy xuất và sử dụng: Khai báo Button và thiết lập kích thước văn bản thông qua thuộc tính textSize o Truy xuất trong XML:

 Truy xuất trong Java Code: Dùng phương thức getDimension:

Resources res = getResources(); float textSize = res.getDimension(R.dimen.text_size); textView.setTextSize(textSize);

value

- Tham chiếu tài nguyên trong Java code

Resource res = getResources(); int value = res.getIntegers(R.integer.name);

Array o Thư mục tài nguyên:

- Tham chiếu tài nguyên trong Java code

Resource res = getResources(); int[] value = res.getIntArray(R.array.integer_name);

- Ví dụ: res/values/arrays.xml

@drawable/logout

o Tham chiếu tài nguyên trong Java code

TypedArray icons = res.obtainTypedArray(R.array.icons);

TypedArray colors = res.obtainTypedArray(R.array.colors); int color colors.getColor(0,0);

5 CÁC TÀI NGUYÊN ỨNG DỤNG NÂNG CAO

- Các tài nguyên hình ảnh được lưu trữ trong thư mục res/drawable

- Có thể có nhiều thư mục drawable theo từ hạn định khác nhau

- Tài nguyên hình ảnh bao gồm cả định dạng *.xml và định dạng hình ảnh (.png, gif, jpg)

5.1.3 Truy xuất: bao gồm 2 cách thức: o Java: R.drawable.

- XML: @[pakage:]drawable/

- Ví dụ: truy xuất tài nguyên hình ảnh o Trong Java Code:

Drawable drawable = res.getDrawable(R.drawable.ic_launcher);

5.2 Các dạng tài nguyên hình ảnh

- Các thực thi của Bitmap bao gồm: o Sử dụng như tài nguyên thông qua R.drawable.filename o Tham chiếu biên dịch tài nguyên thông qua đối tượng BitmapDrawable

- Các thuộc tính thường sử dụng của Bitmap trong XML:

- Ví dụ: xây dựng Bitmap trong XML: mipmap.xml

- Trong đó: android:name: Intent.CATEGoRY_string Khai báo theo cấu trúc android.intent.category.string

Bài tập của học viên

1 Trình bày được tài nguyên ứng dụng trong Android

2 Xác định chính xác tài nguyên ứng dụng Android

5 Dùng Linear layout thiết kế giao diện sau hinh 4.11 giao dện bài tập

1 Trình bày được tài nguyên ứng dụng trong Android, tham khảo ở mục 1 ở bài 4 trong giáo trình

2 Xác định chính xác tài nguyên ứng dụng Android, tham khảo ở mục 3 ở bài 4 trong giáo trình

3 Tính tương thích, tham khảo ở mục 2 ở bài 4 trong giáo trình

4 Truy xuất tài nguyên, tham khảo ở mục 4 ở bài 4 trong giáo trình

5 Dùng Linear layout thiết kế giao diện sau

Thiết kế Button 1 và 2: Sử dụng thuộc tính layout_weight với các giá trị là 1 và 3

In a horizontal LinearLayout, the attribute android:layout_width should be set to "0dp" for views to distribute space effectively, while the android:layout_height can be set to "0dp" with a specified android:layout_weight to control the view's size proportionally For instance, the button defined as android:text="Button 2" and android:id="@+id/button2" can utilize these attributes to achieve the desired layout behavior.

–Với View nằm trong linear layout theo chiều dọc thì thuộc tính: android:layout_height="0dp"

Thiết kế Button 3 và 4: Được chứa trong Linear layout dạng horizontal,kết hợp sử dụng thuộc tính layout_weight với các giá trị là 3 và 1

- Trình bày được tài nguyên ứng dụng trong Android

- Xác định chính xác tài nguyên ứng dụng Android

- Thực hiện đúng các thao tác khai thác các tài nguyên

Bài mở rộng và nâng cao

1 viết hàm SelectionSort bằng C++ • Hãy sinh các ca kiểm thử để kiểm thử các vòng lặp lồng nhau của hàm SelectionSort

Yêu cầu đánh giá kết quả học tập

 Trình bày được tài nguyên ứng dụng trong Android

 Xác định chính xác tài nguyên ứng dụng Android

 Thực hiện đúng các thao tác khai thác các tài nguyên

 Thao tác thành thạo các truy xuất tài nguyên

 Thực hiện đúng các thao tác truy xuất tài nguyên cơ bản cũng như nang cao

 Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc

 Về kiến thức: Đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp

 Về kỹ năng: Đánh giá kỹ năng thực các thao tác truy xuất tài nguyên cơ bản cũng như nang cao

 Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, linh hoạt và ngăn nắp trong công việc.

QUẢN LÝ BỘ NHỚ THIẾT BỊ VÀ XÂY DỰNG GIAO DIỆN VỚI

Bộ quản lý Asset

Asset là thư mục lưu trữ dữ liệu đầu vào như âm thanh, hình ảnh, và các tập tin cơ sở dữ liệu Những tập tin này không được biên dịch khi ứng dụng được đóng gói.

- Truy xuất đối tượng quản lý: getAssets() – AssetManager

- Các phương thức xử lý chính:

 open(String fileName, int mode) – InputStream

- Các chế độ mở Asset

- Để truy xuất được những tập tin trong thư mục assets, ta phải sử dụng bộ quản lý asset do Android cung cấp Lớp này tên là AssetManager

AssetManager là một lớp quan trọng trong ứng dụng, cho phép truy cập vào các tập tin không biên dịch Với AssetManager, bạn có thể mở và đọc các file nguyên gốc dưới dạng luồng byte, giúp dễ dàng quản lý và sử dụng tài nguyên trong ứng dụng.

- Cú pháp khởi tạo AssetManager:

- Để truy xuất phông chữ thông qua thư mục Asset ta sử dụng phương thức createFromAsset - Ví dụ:

Typeface arial = Typeface.createFromAsset(getAssets(), “font/arial.ttf”); textView.setTypeface(arial);

Ví dụ dưới đây sẽ giúp bạn hiểu cách sử dụng bộ quản lý tài sản để truy cập tài nguyên tập tin trong thư mục dự án.

- Ta có thư mục assets với các tập tin như Hình 5.1

- Xây dựng Activity với giao diện layout như sau:

"+files[i]);}

// To load text file InputStream input; try { input = assetManager.open("helloworld.txt"); int size = input.available(); input.close();

String text = new String(buffer) txtContent.setText(text); } catch (IOException e) { e.printStackTrace();

InputStream ims = assetManager.open("android_logo_small.jpg");

Drawable d = Drawable.createFromStream(ims, null);

// set the drawable to imageview imgAssets.setImageDrawable(d);

Shared Preferences

- Shared Preferences là một dạng lưu trữ nhanh bằng file XML

- SharedPreferences dùng lưu trữ dữ liệu dạng cơ bản

- Chỉ hỗ trợ một số kiểu dữ liệu cơ bản : booleans, float, int, long, string

- Hoạt động theo kiểu lưu trữ cũng như truy xuất thông qua cặp giá trị key/value

- Dữ liệu vẫn được bảo toàn ngay cả khi ứng dụng bị đóng hoàn toàn

- Các dữ liệu được lưu trữ và truy xuất qua từng phiên (Session) tương tác của ứng dụng với người dùng

- Lưu trữ và truy xuất trạng thái ứng dụng

- Sử dụng đối tượng của lớp SharedPreferences thông qua phương thức:

- Tạo đối tượng SharedPreferences: sử dụng phương thức getSharedPreferences()

SharedPreferences sharedPre = getSharedPreferences(PREFS_NAME,mode); Trong đó:

 PREFS_NAME: tên của sharedPreference cần tạo

 Mode: kiểu ghi dữ liệu

 MODE_PRIVATE: mode ghi mặc định, chỉ có duy nhất ứng dụng tạo ra tập tin được phép truy cập vào

 MODE_WORLD_READABLE: cho phép các ứng dụng khác truy cập vào

 MODE_WORLD_WRITEABLE: cho phép các ứng dụng khác truy cập và sửa đổi

 MODE_MULTI_PROCESS: cho phép nhiều tiến trình trên ứng dụng cùng truy xuất vào cùng một thời điểm

- Bổ sung thông tin cho đối tượng SharedPreferences: thông qua đối tượng Editor và put tùy theo dữ liệu

- Tạo đối tượng Editor từ phương thứ edit() của Preference

- Các giá trị lưu trữ được truy xuất thông qua phương thức get:

SharedPreferences.Editor editor = sharedPre.edit(); editor.putBoolean(“isTrue”, true); editor.putFloat(“lastFloat”, 1f); editor.putInt(“number”, 2); editor.putLong(“aNumber”, 3l); editor.putString(“textEntryValue”, “Not Empty”);

//Sau cùng, để lưu SharedPreference dùng lệnh commit() editor.commit();

- Các định dạng mở tập tin khi truy xuất Preference:

 MODE_WORLD_READABLE (Deprecated in API 17)

 MODE_WORLD_WRITEABLE (Deprecated in API 17)

- Các giá trị lưu trữ được truy xuất thông qua phương thức get:

To retrieve data from SharedPreferences in Android, utilize the appropriate get method for each data type For example, you can obtain a boolean value using `boolean isTrue = sharedPre.getBoolean("isTrue", false);`, a float with `float lastFloat = sharedPre.getFloat("lastFloat", 0f);`, an integer with `int number = sharedPre.getInt("number", 1);`, and a long value using `long aNumber = sharedPre.getLong("aNumber", 0);`.

String stringPreference = sharedPre.getString(“textEntryValue”, “”);

- Giá trị mặc định: là giá trị sẽ được trả về mặc định khi get không trả về được value thích hợp từ key truyền vào o Ví dụ:

//Nếu không tìm thấy giá trị tương ứng với từ khóa “number” truyền vào thì Default

Bộ nhớ thiết bị

- Lưu dữ liệu riêng trên bộ nhớ thiết bị

- Khi ứng dụng được cài đặt, hệ thống cung cấp 1 vùng bộ nhớ trong dành cho việc lưu trữ dữ liệu cho mỗi ứng dụng riêng (sandbox)

- Khi người dùng gỡ bỏ ứng dụng, vùng bộ nhớ này sẽ được xóa

- Chỉ có ứng dụng mới có thể truy xuất được bộ nhớ của ứng dụng đó

- Đường dẫn các tập tin được lưu trữ: data/data//files

- Phương thức truy xuất: getFilesDir - File

- Tạo và lưu trữ file vào bộ lưu trữ trong

- Gọi openFileOutput() với tên file và chế độ truy cập file

- Ghi lên file sử dụng phương thức write()

- Đóng stream với phương thức close()

- Đọc file từ bộ lưu trữ trong

- Gọi openFileInput() với tên file cần đọc

- Đọc nội dụng từ file sử dụng phương thức read()

- Đóng stream với phương thức close()

FileOutputStreamfos openFileOutput(FILENAME,Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();

Mỗi thiết bị Android đều hỗ trợ bộ nhớ ngoài, cho phép người dùng lưu trữ và truy xuất dữ liệu dễ dàng, cả trực tiếp trên thiết bị và thông qua kết nối USB với máy tính Điều này có nghĩa là người dùng có thể sử dụng thẻ SD để lưu trữ các tệp tin một cách thuận tiện.

- Lưu trữ dữ liệu public trên bộ nhớ ngoài

- Bộ lưu trữ ngoài bao gồm hai dạng:

 Bộ nhớ thiết bị (non-removable)

 Bộ nhớ ngoài (sd-card, usb…)

- Cần xin cấp quyền để truy xuất bộ nhớ này: android.permission.WRITE_EXTERNAL_STORAGE

- Ứng dụng được cấp phát bộ nhớ ngoài để lưu trữ dữ liệu, mặc định không thể truy xuất như tập tin Media

- Địa chỉ lưu trữ: /mnt/sdcard/Android//files

 getExternalFilesDirs(String) – File[] (API 19 - KITKAT)

 ContextCompat.getExternalFilesDirs(String) – File[] (Support Library)

- Cấu hình cài đặt ứng dụng trên bộ nhớ trong hoặc ngoài thông qua cặp thẻ

- Dữ liệu được lưu trữ trên bộ lưu trữ ngoài có thể được thay đổi bởi người dùng, có thể đồng bộ với máy tính cá nhân

- Trước khi làm việc với bộ lưu trữ ngoài cần kiểm tra trạng thái của nó trước khi thực hiện các thao tác

- Truy xuất trạng thái bộ nhớ ngoài thông qua phương thức getExternalStorageState trong đối tượng Environment

- Các thông số được trả về bao gồm:

 MEDIA_SHARED o MEDIA_BAD_REMOVAL

- Ví dụ: kiểm tra trạng thái bộ lưu trữ ngoài public boolean isExternalStorageWritable() {

String state = Environment.getExternalStorageState(); if( Environment.MEDIA_MOUNTED.equals(state)) return true; return false;

- Một số phương thức hỗ trợ duyệt tập tin trong bộ nhớ:

- Một số thư mục dùng chung:

các điều khiển hiển thị danh sách

Adapter đóng vai trò quan trọng trong việc kết nối giữa các đối tượng điều khiển dạng danh sách (AdapterView) và dữ liệu nền, cung cấp các phương thức truy xuất và quản lý dữ liệu Nó cho phép điều chỉnh giao diện, quản lý số lượng chỉ mục trên AdapterView, cũng như thực hiện truy vấn và sắp xếp dữ liệu Ngoài ra, Adapter còn chịu trách nhiệm tạo ra các View con từ tập dữ liệu hiện có.

AdapterView là các thành phần điều khiển dạng tập hợp, cho phép hiển thị thông tin cơ bản dưới dạng danh sách và quản lý từng mục thông tin một cách riêng biệt.

Các dạng Adapter

- Bao gồm các lớp thực thi giao thức Adapter:

- Các phương thức xử lý quan trọng trên Adapter:

 getView(int position, View convertView, ViewGroup parent) – View

- BaseAdpater là lớp adpater cơ sở cho các Adapter thường dùng khác như ArrayAdapter, CursorAdapter, SimpleAdapter…

- - Ví dụ: o Tạo một ArrayAdapter chứa các dữ liệu chuỗi

String arr[]={"One","Two","Three","Four"};

ArrayAdapter(this,android.R.layout.simple_list_item_1, arr)); o Trong đó: android.R.layout.simple_list_item_1 : là layout mặc định do Android xây dựng sẵn cho

Để sử dụng với các giao diện phức tạp như ImageView hoặc nhiều TextView, bạn nên ghi đè phương thức getView(int, View, ViewGroup) để trả về kiểu giao diện mong muốn.

SimpleCursorAdapter là một lớp Adapter dùng để hiển thị dữ liệu từ Cursor lên các điều khiển như ListView và GridView Để hoạt động hiệu quả, Cursor cần phải có tên định danh cho các cột; nếu không, quá trình sẽ không thể thực hiện.

CÁC ĐIỀU KHIỂN DANH SÁCH

AbsListView là một đối tượng điều khiển giúp hiển thị danh sách các danh mục với thông tin cơ bản, cho phép người dùng thực hiện nhiều thao tác khác nhau trên từng danh mục Đối tượng này bao gồm hai chế độ hiển thị khác nhau.

- Thuộc tính XML quan trọng:

 choiceMode: none | singleChoice | multipleChoice | multipleChoiceModal

- Một số Interface đã được khai báo sử dụng :

ListView là một điều khiển nâng cao giúp hiển thị dữ liệu theo dạng danh sách từng dòng Để hoạt động hiệu quả, ListView cần sử dụng một đối tượng Adapter, đóng vai trò quản lý và hỗ trợ việc hiển thị dữ liệu một cách mạch lạc.

 ArrayAdapter được hiểu như cái modem mạng Nó giúp ListView có thể “đọc và hiểu” dữ liệu từ mảng dữ liệu để hiện lên giao diện

ArrayAdapter là lớp kế thừa từ BaseAdapter, cho phép sử dụng một mảng các đối tượng tùy ý Lớp này mặc định nhận Id tham chiếu đến một TextView duy nhất, giúp hiển thị dữ liệu một cách hiệu quả.

Các bước để tạo một ListView o

Bước 1: Đưa dữ liệu cần hiển thị lên ListView vào một mảng hoặc danh sách

(ArrayList, mảng thông thường, mảng đối tượng,…)

Bước 2: Tạo một ListView trên giao diện

Bước 3: Tạo một đối tượng ArrayAdapter để liên kết giữ ListView và mảng hoặc danh sách dữ liệu

- Các xử lý trên ListView o Cách lấy ListView thông qua Id của ListView o Cách tạo ArrayAdapter và đưa dữ liệu từ mảng vào ArrayAdapter

ArrayAdapter[Tên mảng adapter]

(this,android.R.layout.simple_list_item_1, [tenMangDuLieu]);

- Dữ liệu từ mảng chứa dữ liệu sẽ được gắn vào ArrayAdapter, ArrayAdapter sẽ gắn vào ListView

- Giải thích ý nghĩa các đối số trong phương thức ArrayAdapter:

 Đại diện cho context của Activity hiện tại, bạn có thể viết

 MainActivity.this (nếu bạn viết như thế này thì ở bất kỳ vị trí nào nó cũng hiểu là context của MainActivity)

 Đối số thứ 2: android.R.layout.simple_list_item_1

 Là layout Listview mà được Android xây dựng sẵn Nó được lưu trong SDK/ platforms/ android-api(x)/ data/ res/ layout/ simple_list_item_1.xml

Là mảng chứa dữ liệu cần hiển thị lên ListView

- Thuộc tính XML quan trọng:

- Một số phương thức quan trọng:

 setAdapter(Class Extends )

Ví dụ: Tạo ListView hiển thị danh sách tên các quốc gia

Chúng ta tạo mảng dữ liệu để hiển thị trên ListView bằng cách sử dụng một tập tin XML Để thực hiện điều này, hãy tạo một tập tin mới có tên list_data.xml trong thư mục /res/values và thêm nội dung cần thiết vào đó.

Bước 2: Tạo một ListView trên giao diện

- Kéo vào một ListView trong thẻ tab Composite hoặc khai báo 1 cặp thẻ

trong file giao diện xml:

Bước 3:Đưa dữ liệu vào mảng, tạo đối tượng ArrayAdapter, đưa dữ liệu từ mảng vào ArrayAdapter, hiển thị nội dung lên ListView

- Chúng ta vào Activity để thao tác như sau:

String[] countries = getResources().getStringArray(R.array.countries);

//lấy listview thông qua id của listview

ListView lvCountry=(ListView)findViewById(R.id.lvCountry);

//Tạo đối tượng ArrayAdapter v{ đưa dữ liệu từ mảng v{o ArrayAdapter

ArrayAdapter adapter = new ArrayAdapter

(this,android.R.layout.simple_list_item_1, countries);

//đổ dữ liệu lên listview lvCountry.setAdapter(adapter);

Bước 4:Thiết lập sự kiện cho ListView

Sau khi dữ liệu được hiển thị trên ListView, chúng ta cần thiết lập sự kiện khi người dùng nhấn vào từng dòng của ListView Để thực hiện điều này, ta sử dụng phương thức setOnItemClickListener cho ListView, ví dụ: lvCountry.setOnItemClickListener(new OnItemClickListener() {

@Override public void onItemClick(AdapterView adapterView, View v, int position,long id) {

//Ghi Log vị trí của Item được click v{o trên ListView

Log.d("ListView","onItemClick-POS:"+position+ "+ID+"+id); }

Another approach is to set up events for the ListView by having the Activity inherit from the ListActivity class, allowing it to function as a list-type Activity: public class ListViewActivity extends ListActivity {

@Override protected void onCreate(Bundle savedInstanceState)

String[] countries =getResources().getStringArray(R.array.countries); setListAdapter(new ArrayAdapter

(this,android.R.layout.simple_list_item_1,android.R.id.text1,countries)); getListView().setOnItemClickListener(new OnItemClickListener() {

@Override public void onItemClick(AdapterView parent, View view, int position, long id) {

Log.d("ListView","onItemClick- POS :" +position+"+ ID : " +id);

GridView tương tự như ListView nhưng có khả năng hiển thị dữ liệu dưới dạng lưới Để quản lý và hiển thị dữ liệu, GridView cũng yêu cầu một đối tượng Adapter.

Hình 5.2 Ví dụ về Custom GridView

- Gridview cũng dựa vào Adapter để gắn kết các dữ liệu bên dưới

String[] adobe_products getResources().getStringArray(R.array.adobe_products);

GridView gvAdobe = (GridView) findViewById(R.id.gvAdobe);

ArrayAdapter adapter = new ArrayAdapter

(ListViewActivity.this,android.R.layout.simple_list_item_1, adobe_products); gvAdobe.setAdapter(adapter);

GridView cho phép thiết lập số cột, giúp dữ liệu được hiển thị dưới dạng hình ống (mảng, list một chiều) Dựa vào thuộc tính numColumns trong layout, GridView tự động ngắt hàng, tạo nên sự sắp xếp hợp lý cho các phần tử.

- Thuộc tính XML quan trọng:

 numColumns: integer strecthMode: none | spacingWidth | columnWidth | spacingWidthUniform

- Một số phương thức quan trọng:

- Spinner là đối tượng điều khiển hiển thị một danh mục ở một thời điểm, người dùng có thể lựa chọn một trong nhiều danh mục để hiển thị

- Bao gồm hai chế độ hiển thị pop-up lựa chọn (spinnerMode): oDialog o Dropdown

Hình 5.6 Hai chế độ hiển thị dữ liệu vời Spinner - Thuộc tính XML quan trọng: ospinnerMode: dialog | dropdown o prompt: string opopupBackground: drawable | color o gravity o entries: string-array

- Một số phương thức quan trọng: o setAdapter(SpinnerAdapter) o setPrompt(CharSequence) – setPrompt(int resId) (Dialog Mode) o setPopupBackgroundResource(int) o setPopupBackgroundDrawable(Drawable)

- Ví dụ: xây dựng Spinner:

// X}y dựng Adapter thông qua dữ liệu t{i nguyên v{ giao diện mẫu

SpinnerAdapter adapter = new ArrayAdapter.createFromResource(this, R.array.countries, android.R.layout.simple_dropdown_item_1line);

Spinner spinner = (Spinner)findViewById(R.id.spinner);

// Thiết lập Adapter cho điều khiển spinner.setAdapter(adapter);

Trong thực tế, khi làm việc với các ứng dụng Android có sử dụng ListView, việc điều chỉnh layout để phù hợp với yêu cầu của khách hàng là rất quan trọng Để thực hiện điều này, chúng ta cần tạo Custom Layout cho ListView Do đó, việc học cách tạo Custom Layout là cần thiết.

Layout cho ListView là cần thiết và thực thế

- Sự khác nhau giữa ListView thông thường và ListView có layout được điều chỉnh lại là ở việc khởi tạo Adapter

- Sau khi đã có ListView trên giao diện, chúng ta có thể tạo Custom Layout cho

Bước 1:Tạo thêm một layout cho một item của ListView

Bước 2: Tạo lớp Custom Adapter kế thừa từ lớp ArrayAdapter

Bước 3:Tạo một lớp dùng để quản lýdữ liệu

Bước 4: Hiển thị dữ liệu lên ListView

Hình 5.7 Minh họa Custom ListView.

Sau đây là ví dụ về cách tạo Custom Layout cho ListView (lấy ví dụ ở phần III.1) - Tạo layout trong Activity như sau:

The RelativeLayout is defined with XML attributes, specifying a full-width and full-height layout that includes padding on all sides It utilizes the dimensions set in the `dimen` resource file for vertical and horizontal margins Additionally, it is associated with the MainActivity of the application, as indicated by the tools context attribute.

- Tạo layout cho một item của ListView gọi là list_row.xml

VietNam android:layout_height="match_parent" android:orientation="horizontal" android:padding="10dp" >

The provided XML code snippet defines two TextView components in an Android layout The first TextView, identified by the ID "tvEnName," is configured to display text in a medium appearance with a color code of "#357B6A." The second TextView, with the ID "tvViName," is also set to wrap its content but does not have a specified text value Both components are designed to enhance the user interface by presenting text dynamically within the application.

- Custom lại Adapter bằng cách tạo một class kế thừa từ class ArrayAdapter gọi là CountryAdapter public class CountryAdapter extends ArrayAdapter {

ArrayList countries; public CountryAdapter(Context context, int resId,

ArrayList countries) { super(context, resId, countries); this.context context; this.resId = resId; this.countries = countries;

@Override public View getView(int position, View convertView, ViewGroup parent)

getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(resId, null);

TextView tvEnName = (TextView) view.findViewById(R.id.tvEnName);

TextView tvViName = (TextView) view.findViewById(R.id.tvViName);

ImageView imgvFlag = (ImageView) view.findViewById(R.id.imgvFlag); Country c = countries.get(position); if (c != null) { tvEnName.setText(c.getEnName()); tvViName.setText(c.getViName()); imgvFlag.setImageResource(c.getImg_id());

- Xây dựng đối tượng Country: public class Country { private String enName; private String viName; private int img_id; public String getEnName() { return enName;

} public void setEnName(String enName) { this.enName = enName;

} public void setViName(String viName) { this.viName = viName;

} public int getImg_id() { return img_id;

} public void setImg_id(int img_id) { this.img_id = img_id;

} public Country(String enName, String viName, int img_id) { this.enName = enName; this.viName = viName; this.img_id = img_id;

// TODO Auto-generated constructor stub

- Đối tượng kế thừa từ EditText

- Cho phép xây dựng dữ liệu mẫu hỗ trợ người dùng hoàn chỉnh quá trình nhập liệu trên EditText

- Thực hiện xây dựng AutoCompleteTextView:

- Khai báo dữ liệu mẫu

- Khai báo giao diện hiển thị cho dữ liệu

- Xây dựng Adapter thông qua phương thức khởi tạo tương ứng với dữ liệu và giao diện hiển thị

- Thiết lập Adapter cho đối tượng AutoCompleteTextView

- Ví dụ xây dựng AutoCompleteTextView:

// Khởi tạo dữ liệu mẫu private static final String[] COUNTRIES = new String[] {

“VietNam”, “Belgium”, “France”, “Italy”, “Germny”, “Spain”};

// X}y dựng Adapter thông qua dữ liệu mẫu v{ giao diện mẫu

ArrayAdapter adapter = new ArrayAdapter (this, android.R.layout.simple_dropdown_item1line, COUNTRIES);

AutoCompleteTextView editCountry = (AutoCompleteTextView) findViewById(R.id.editCountry); // Thiết lập Adapter cho điều khiển editCountry.setAdapter(adapter);

- Đối tượng kế thừa từ đối tượng AutoCompleteTextView

- Cho phép xây dựng dữ liệu mẫu hỗ trợ người dùng hoàn chỉnh quá trình nhập liệu trên EditText

- Dữ liệu được hỗ trợ hoàn chỉnh nhiều lần, cách nhau bằng một Tokenizer

- Thực hiện xây dựng MultiAutoCompleteTextView:

- Khai báo dữ liệu mẫu

- Khai báo giao diện hiển thị cho dữ liệu

- Xây dựng Adapter thông qua phương thức khởi tạo tương ứng với dữ liệu và giao diện hiển thị

- Thiết lập Adapter cho đối tượng MultiAutoCompleteTextView - Thiết lập đối tượng Tokenizer

- Ví dụ xây dựng MultiAutoCompleteTextView:

// Khởi tạo dữ liệu mẫu private static final String[] COUNTRIES = new String[] {“VietNam”, “Belgium”, “France”, “Italy”, “Germny”, “Spain”};

// X}y dựng Adapter thông qua dữ liệu mẫu v{ giao diện mẫu ArrayAdapter adapter = new ArrayAdapter (this, android.R.layout.simple_dropdown_item1line, COUNTRIES);

MultiAutoCompleteTextView editCountry = (MultiAutoCompleteTextView) findViewById(R.id.editCountry); // Thiết lập Adapter cho điều khiển editCountry.setAdapter(adapter);

// Thiết lập Tokenizer editCountry.setTokenize(new

Giao diện với Fragment

Fragment được giới thiệu lần đầu trong phiên bản Android 3.0 Honeycomb, nhưng nhờ vào gói Android Support Library, nó có thể được sử dụng trên các phiên bản Android từ 1.6 trở lên.

Fragment là một thành phần được nhúng trong Activity, cho phép thực hiện tương tác và có vòng đời riêng biệt Nó cũng hỗ trợ việc trao đổi thông tin với Activity và các Fragment khác, mang lại sự linh hoạt trong việc phát triển ứng dụng.

Fragment là yếu tố quan trọng giúp xây dựng giao diện linh hoạt, cho phép tối ưu hóa trải nghiệm người dùng trên các thiết bị có kích thước màn hình khác nhau, từ điện thoại đến máy tính bảng Việc sử dụng Fragment giúp thích ứng với từng loại thiết bị, kích thước và độ phân giải, mang lại giao diện phù hợp và hiệu quả.

Hình 5.1 Xây dựng giao diện ứng dụng trên điện thoại với Fragment

- Tính linh động của Fragment cho phép chúng ta bố cục lại các phần giao diện của một ứng dụng theo cách họp lý nhất

Hình 5.2 Xây dựng giao diện ứng dụng trên máy tính bảng với Fragment

Main Fragment không bị giới hạn trong một Activity cụ thể, cho phép tái sử dụng nhiều lần Điều này mang lại sự linh hoạt trong việc xây dựng giao diện, giúp người dùng dễ dàng thêm hoặc xóa các thành phần trong các cửa sổ khác nhau.

Trong bộ Android SDK, có một số lớp con từ lớp Fragment giúp đóng gói và thực thi các Fragment thường dùng Một số lớp tiêu biểu có thể kể đến như sau:

DialogFragment là một loại Fragment cho phép hiển thị dưới dạng hộp thoại trên Activity Người dùng có thể tùy chỉnh giao diện của DialogFragment thông qua các phương thức có sẵn trong lớp Fragment.

- ListFragment – dạng Fragment tích họp sẵn điều khiển ListView v các phương thức dùng để thực kết nối dữ liệu

- WebViewFragment –dùng để hiện các kết nối và hiển thị nội dung trêng we trên đối tượng WebView

- Để tạo mới đối tượng Fragment ta cần tạo lớp kế thừa từ lớp Fragment, khai báo các điều khiển và thực thi các chức năng

Khi làm việc với Fragment, chúng ta thường tạo giao diện bằng cách gắn các điều khiển, nhưng cũng có thể cung cấp giao diện trực tiếp từ XML giống như với Activity thông qua phương thức setContentView() Các thuộc tính quan trọng cần lưu ý khi làm việc với Fragment bao gồm cách thiết lập và quản lý giao diện.

 class: (Pakage Name + Class Name)

 name: (Pakage Name + Class Name)

 layout_width – layout_height: Dimen

- Ở đây, t có thể dùng phương thức onCre teView() để thực hiện điều tương tự public class MyFragment extends Fragment{

- Ví dụ: giao diện Fragment trong XML: fragment_layout.xml:

The provided XML fragment defines an Android layout for an `ImageFragment` class, specifying its ID, tag, width, height, and margin attributes This configuration ensures that the fragment occupies the entire available space while adhering to defined margin settings.

- Sử dụng trong M inActivity.j v như một l yout ình thường: setContentView(R.layout.fragment_layout);

Chúng ta có thể tạo giao diện bằng mã Java thông qua đối tượng ViewGroup, nhưng cách hiệu quả hơn là sử dụng tập tin giao diện XML và gán nó vào Fragment.

Không giống như Activity, Fragment không cần phai khai báo trong Manifest bởi vì

Fragment chỉ tồn tại khi nhúng nó vào một Activity v vòng đời sống cũng phụ thuộc Activity này

Vòng đời của một Fragment được quản lý tương tự như một Activity, bao gồm các phương thức khởi tạo, bắt đầu, phục hồi trạng thái, tạm dừng, đóng và hủy Các phương thức từ lớp Activity cũng được sử dụng để kết nối và hủy kết nối Fragment với Activity, cũng như khởi tạo và hủy khởi tạo các điều khiển trên Fragment Điều này giúp thông báo về việc hoàn thành khởi tạo Activity chứa Fragment, và có thể tham khảo lược đồ để hiểu rõ hơn.

Hình 5 Vòng đời của Fragment

Hầu hết các phương thức trong Fragment tương tự như các phương thức quản lý vòng đời của Activity đã được thảo luận trong chương 3 Chúng đóng vai trò quan trọng trong việc xác định cách thức hoạt động của Fragment và cách mà Fragment được gắn vào một Activity.

Vòng đời của một Fragment bắt đầu khi nó được gắn vào một Activity và kết thúc khi nó bị gỡ bỏ Hai sự kiện quan trọng trong quá trình này được giám sát bởi hai phương thức là onAttach và onDetach.

Phương thức quản lý sẽ được kích hoạt khi Fragment hoặc Activity chuyển sang trạng thái tương tác Tuy nhiên, phương thức onDetach có thể không được gọi nếu Activity chứa Fragment bị hủy mà chưa hoàn thành vòng đời của nó.

Phương thức onAttach đã được gọi trước khi giao diện Fragment được khởi tạo, tức là trước khi Fragment và Activity được khởi tạo Thông thường, phương thức này được sử dụng để tạo tham chiếu đến Activity nhằm chuẩn bị cho các xử lý khởi tạo khác.

Creating a Fragment is accomplished through the onCreate method and concluded with the onDestroy method When used within an Activity, it is advisable to initialize the Fragment in the Activity's onCreate method.

 Truy xuất biến Bundle trong phương thức onSaveInstanceState

 Truyền các thông tin cần lưu trữ vào biến Bundle

 Thực hiện khai báo Fragment

 Cho phép nhúng Fragment vào Activity

 Dùng phương thức ddToB BackStack (String T g) trong đối tượng quản lý Fragment để được Fragment vào Stack

 Có thể truy xuất lại đối tượng Fragment thông qua Tag, hoặc khi phím

“Bock” trên thiết bị được nhấn.

Xây dựng và sử dụng Fragment

8.1 Thực hiện xây dựng Fragment:

- Khai báo lớp kế thừa từ lớp Fragment

- Gọi phương thức onCreateView thực hiện tạo giao diện cho Fragment

To create a Fragment and its interface in Android, you can define a class like `ImageFragment` that extends `Fragment` Within this class, the `onCreateView` method is implemented to inflate the layout using the `LayoutInflater`, which loads the specified XML layout resource (e.g., `R.layout.fragment_main`) The method then returns the inflated view, allowing it to be displayed within the application.

- Sử dụng Fragment trong Activity, bao gồm hai cách:

+Thực hiện tham chiếu Fragment từ giao diện XML của Activity

+ Kh i áo đối tư ng FragmentManger, cho phép nhúng Fragment vào Activity từ JavaCode

- Main Activity sẽ có một Fragment Manager dùng để qu n lý các Fragment chứa trong nó Để sử dụng ta cần gọi phương thức getFragmentManager

- Đối tương này sẽ cung cấp một số phương thức như thêm, gỡ bỏ và cập nhật Fragment vào Activity, quản lý các phiên làm việc của Fragment

Cách đơn giản nhất để thêm một Fragment vào Activity là khai báo thẻ Fragment trong tập tin giao diện của Activity đó Fragment được coi như một đối tượng trong View Group khi được gắn vào Layout Phương pháp này thường được sử dụng để định nghĩa một tập hợp các giao diện tĩnh cho các màn hình có kích thước khác nhau.

Để thay đổi giao diện ứng dụng dựa trên trạng thái, phương pháp hiệu quả nhất là sử dụng giao diện động thông qua FragmentTransaction.

Lớp FragmentTransaction hỗ trợ việc thêm, gỡ bỏ hoặc thay thế các Fragment trên Activity trong quá trình ứng dụng thực thi, cho phép xây dựng giao diện hợp lý dựa trên các tương tác của người dùng Để nâng cao trải nghiệm người dùng, các chuyển động giữa các phiên làm việc của Fragment Transaction được sử dụng và lưu trữ trong stack để tái sử dụng.

Mỗi phiên làm việc của FragmentTransaction được khởi tạo bằng phương thức beginTransaction Các hoạt động của Fragment được xác định qua các phương thức add, remove hoặc replace Sau đó, người dùng có thể tùy chỉnh các chuyển động hoặc cách thức hoạt động trong stack trước khi thực hiện phương thức commit để thêm Transaction vào không gian.

//Thiết lập add,remove hoặc replace, addToBackStack…

//Thiết lập các Animation cho Fragment

//Cuối cùng gọi phương thức commit() frTransaction.commit()

- Ví dụ, để thực hiện thêm một Fragment mới đơn giản ta chỉ cần chỉ định Fragment cần thêm vào đối tượng sẽ chứa Fragment này

FragmentTransaction frTransaction = frManager.beginTransaction(); frTransaction.add(R.id.ui_container, new MyFragment()); frTransaction.commit()

- Đối với các phương thức remove và replace t cũng thực hiện tương tự

To perform fragment transactions in Android, there are two methods available: one involves using the setTransaction method and passing the appropriate parameters provided in the FragmentTransaction class.

- Ví dụ: frTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OP EN);

Phương thức setCustomAnimations cho phép chúng ta tạo các chuyển động cho Fragment thông qua các tập tin XML Phương thức này yêu cầu hai tham số: một cho khi Fragment được thêm vào và một cho khi Fragment được gỡ bỏ.

- Ví dụ: frTransaction.setCustomAnimations(android.R.animatior.fade_in, android.R.animator.fade_out);

Trong lớp Fragment, phương thức getActivity cho phép truy cập vào các đối tượng của Activity mà chúng được nhúng vào Điều này giúp lấy về các View cần tương tác ngay trong lớp Fragment.

TextView textView = (TextView) getActivity().findViewById(R.id.fragEdit);

Mặc dù lớp FragmentManager thường được sử dụng để giao tiếp giữa Fragment và Activity, nhưng một phương pháp hiệu quả hơn là xây dựng một Interface, trong đó Activity đóng vai trò như một thành phần trung gian, giúp các Fragment không phụ thuộc vào Activity mà chúng được nhúng vào Thông thường, kết nối Interface được thực hiện trong phương thức onAttach của Fragment Hãy xem xét ví dụ sau để hiểu rõ hơn về cách thực hiện.

- Xây dựng Interface public interface OnNewItemAddedListener{ public void

- Thực hiện lấy Activity l m trung gi n trong phương thức onAttach

@Override public void onAttach(Activity activity){ super.onAttach(activity); try{ onNewItemAddedListener = (OnNewItemAddedListener) activity;

Throw new ClassCastExeption(activity.toString() + “ must implement onNewItemAddedListener.”);

- Thực thi Interface trong Activity

@Override public void onNewItemAdded(String newItem){

Câu hỏi và bài tập thực hành

1 Trình bày bộ quản lý Asset và Shared Preferences

2 Trình bày các điều khiển danh sách

3 Xây dựng giao diện với Fragment

4 Trình bày các bước xây dựng và sử dụng Fragment

5 Thiết kế giao diện cho fragment

1 Trình bày bộ quản lý Asset và Shared Preferences, tham khảo mục 1 ở bài 5 của giáo trình

2 Trình bày các điều khiển danh sách, tham khảo mục 3 ở bài 5 của giáo trình

3 Xây dựng giao diện với Fragment, tham khảo mục 7 ở bài 5 của giáo trình

4 Trình bày các bước xây dựng và sử dụng Fragment, tham khảo mục 8 ở bài 5 của giáo trình

5 Thiết kế giao diện cho fragment

In the res/layout directory, we create a new layout resource file named activity_top, utilizing ConstraintLayout to design the interface for this layout.

 Nội dung file activity_top.xml sẽ như sau:

The provided XML code defines an EditText element in an Android layout, specifically for capturing a user's first name It has a width of 252dp and a height of 49dp, with a top margin of 36dp The input type is set to accept text for a person's name, and it displays "First name" as the default text The layout constraints ensure that the EditText is centered horizontally and aligned to the top of the parent view.

The provided XML code snippet defines an EditText component for an Android application, specifically designed for user input of a last name It specifies attributes such as width, height, margin, and input type, ensuring the field is user-friendly and appropriately positioned within the layout The placeholder text "Last Name" guides users on the expected input, enhancing the overall user experience.

The provided XML code snippet defines a button in an Android layout with the ID "button_ok." This button has a width and height that wrap its content, a top margin of 48dp, and displays the text "Ok." It is constrained to align with the parent's start and end, while being positioned below another element identified by "lastname."

Và đây là giao diện của nó:

In the java/com.example.myapplication.ui.main directory, we create a fragment folder to house our fragment handling classes Within this folder, we establish a Java class named TopFragment.

The provided code snippet is part of an Android application, specifically within the `TopFragment` class located in the `com.example.myapplication.ui.main.fragment` package This class extends the `Fragment` class and includes essential UI components such as `EditText` for first and last names, and a `Button` for user interaction The `onCreateView` method is overridden to inflate the fragment's layout, allowing for a structured user interface in the main activity of the application.

Ngày đăng: 17/12/2023, 10:08