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.