PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG MỤC LỤC

Similar documents
HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

Tình huống 1: PPPoE với Username và Password

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Tạo Project với MPLAB

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Tài liệu hướng dẫn: Stored Procedure

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Chương 5. Network Layer 19/09/2016 1

BELGIUM ONLINE APPOINTMENT

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

CẤU TRÚC DỮ LIỆU NÂNG CAO

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

SIMULATE AND CONTROL ROBOT

Google Search Engine. 12/24/2014 Google Search Engine 1

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

TỔNG QUAN VỀ.NET VÀ C#

Bài tập lớn số 1. Giả lập bộ định thời

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

Dọn "rác" Windows 7 vào dịp cuối năm

STACK và QUEUE. Lấy STACK

Hướng dẫn cài đặt FPT

Nhấn nút New để tạo 1 biến mới Trang 17

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

MỤC LỤC. Giáo trình Thiết kế web Trang 1

1 Bước 1: Test thử kit LaunchPad.

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

I. Hướng Dẫn Đăng Nhập:

GV: Phạm Đình Sắc or

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Entity Framework (EF)

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

Tìm hiểu Group Policy Object và các ví dụ

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

Lecture 12. Trees (1/2) Nội dung bài học:

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG NÂNG CAO

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

PHÁT TRIỂN ỨNG DỤNG WEB

BẢO MẬT TRONG SQL SERVER

Parallels Cloud Server 6.0

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

SIEMENS INDUSTRIAL NETWORKS

MA NG MA Y TI NH (Computer Networks)

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

Bài 10: Cấu trúc dữ liệu

Câu 1. Thiết bị nào sau đây dùng để kết nối mạng? a)ram b)rom c)router d)cpu Câu 2. Hệ thống nhớ của máy tính bao gồm: a) Bộ nhớ trong, Bộ nhớ ngoài

[ASP.NET] MVC Framework và ví dụ minh họa

LÂ P TRI NH WEB ASP.NET

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

FCAPS. nhìn từ quan điểm ITIL. Công cụ ManageEngine và ứng dụng khung ITIL trong các tổ chức, doanh

BÀI LAB ĐỔI TÊN DOMAIN

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Cấu hình Router FTTH ---X---

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN: AN NINH MẠNG

SMS Live Hướng dẫn sử dụng

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

TÌM HIỂU WINDOWS SERVER UPDATE SERVICE TRONG WINDOWS SERVER 2008

Mô hình dữ liệu quan hệ (Relational data model)

LINQ TO SQL & ASP.NET

Time Picker trong Android

Bài 7: Các cấu trúc điều khiển

CHỦ NHIỆM ĐỀ TÀI: ThS. Đỗ Đình Trang

Các virus đầu tiên xuất hiện trong hệ điều hành của máy tính Apple II

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Các kiểu định địa chỉ họ MSC-51

3 cách Backup Profile trong Windows 7

Rà soát pháp luật Việt Nam với các cam kết của Hiệp định thương mại tự do Việt Nam - EU về Mua sắm công. Phòng Thương mại và Công nghiệp Việt Nam

Transcription:

MỤC LỤC BÀI 1. GIỚI THIỆU VỀ ANDROID VÀ CÀI ĐẶT MÔI TRƯỜNG PHÁT TRIỂN... 4 1.1. Giới thiệu... 4 1.2. Lịch sử phát triển hệ điều hành Android... 5 1.3. Kiến trúc hệ điều hành Android... 7 1.4. Các thành phần cơ bản của một ứng dụng Android... 9 1.5. Android Application Lifecycle... 17 1.6. Cài đặt Android Studio... 17 1.7. Thiết bị ảo (AVD - Android Virtual Device)... 30 1.8. Debugging trên Android Studio... 34 1.9. Website hữu ích dành cho người lập trình... 34 BÀI 2. CHƯƠNG TRÌNH HELLO WORLD... 35 2.1. Tạo ứng dụng Android đầu tiên... 35 2.2. Cấu trúc một ứng dụng Android... 39 2.3. Chạy ứng dụng trên AVD... 41 2.4. Chạy ứng dụng trên Mobile Phone... 44 2.5. Một số phím tắt hữu dụng trong lập trình Android... 45 BÀI 3. LÀM VIỆC VỚI LAYOUT... 46 3.1. Giới thiệu về XML... 46 3.1.1. XML là gì?... 46 3.1.2. Cú pháp XML... 46 3.2. Giới thiệu về Layout... 47 3.3. Cách tạo Layout trong một dự án Android... 48 3.4. Frame Layout... 50 3.5. Linear Layout... 52 3.6. Table Layout... 53 3.7. Relative Layout... 57 3.8. Absolute Layout... 59 BÀI 4: THẢO LUẬN/BÀI TẬP 01: ANDROID LAYOUT... 61 1

BÀI 5. ACTIVITY VÀ INTENT... 61 5.1. Khái niệm Activity... 61 5.2. Cách tạo Activity và kết nối với Layout... 62 5.3. Các kiểu xử lý sự kiện trong Android... 68 5.4. Truyền dữ liệu giữa các Activity... 72 BÀI 6. LÀM VIỆC VỚI TOAST, DIALOG VÀ NOTIFICATION... 77 6.1. Giới thiệu... 77 6.2. Toast... 77 6.3. Alert Dialog... 78 6.4. Promt Dialog... 79 BÀI 7. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1)... 82 7.1. Giới thiệu View... 82 7.2. Nhóm điều khiển TextView... 83 7.3. Nhóm điều khiển Button... 84 7.4. Nhóm điều khiển TextFields... 85 7.5. Điều khiển CheckBox... 86 7.6. Điều khiển RadioButton... 90 7.7. Điều khiển Tab... 95 BÀI 8: THẢO LUẬN/BÀI TẬP 02: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1)... 101 BÀI 9. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2)... 101 9.1. Điều khiển TimePicker... 101 9.2. Điều khiển TimePickerDialog... 101 9.3. Điều khiển DatePicker... 102 9.4. Điều khiển DatePickerDialog... 102 BÀI 10: THỰC HÀNH 01: ỨNG DỤNG HELLO WORLD... 103 BÀI 11. SPINNER, LISTVIEW VÀ GRIDVIEW... 103 11.1. Điều khiển Spinner... 103 11.2. Điều khiển ListView... 105 11.3. Điều khiển GridView... 108 2

BÀI 12: THỰC HÀNH 02: ANDROID LAYOUT... 109 BÀI 13: THẢO LUẬN/BÀI TẬP 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2)... 109 BÀI 14: THỰC HÀNH 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) 109 BÀI 15. LÀM VIỆC VỚI MENU... 109 15.1. Option menu... 109 15.2. Context menu... 114 BÀI 16: THỰC HÀNH 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) 120 BÀI 17: THẢO LUẬN/BÀI TẬP 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2)... 120 BÀI 18: THỰC HÀNH 05: SPINNER, LISTVIEW, GRIDVIEW... 120 BÀI 19. LẬP TRÌNH CSDL VỚI SQLITE (1)... 120 19.1. Giới thiệu SQLite... 120 19.1.1. SQLite là gì?... 120 19.1.2. Có sử dụng được các câu lện SQL trong SQLite hay không?... 120 19.1.3. Có thể sử dụng C# để thao tác với CSDL SQLite hay không?... 120 19.1.4. Tạo cơ sở dữ liệu SQLite bằng cách nào?... 121 19.2. Cách tạo và lưu trữ CSDL SQLite trong một project Android Studio... 125 19.3. Các bước làm việc với SQLite trong Android... 127 BÀI 20: THỰC HÀNH 06: LÀM VIỆC VỚI MENU VÀ CONTEXT MENU... 128 BÀI 21: THẢO LUẬN/BÀI TẬP 05: LẬP TRÌNH CSDL VỚI SQLITE... 128 BÀI 22: THỰC HÀNH 07: LẬP TRÌNH CSDL VỚI SQLITE... 128 BÀI 23. LẬP TRÌNH CSDL VỚI SQLITE (2)... 128 23.1. Các đối tượng làm việc với CSDL SQLite... 128 23.2. Thao tác với CSDL SQLite... 128 BÀI 24: THỰC HÀNH 08: LẬP TRÌNH CSDL VỚI SQLITE (2)... 144 BÀI 25: THẢO LUẬN/BÀI TẬP 06: LẬP TRÌNH CSDL VỚI SQLITE (2)... 144 3

BÀI 1. GIỚI THIỆU VỀ ANDROID VÀ CÀI ĐẶT MÔI TRƯỜNG PHÁT TRIỂN 1.1. Giới thiệu Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy tính bảng. Ban đầu, Android được phát triển bởi Tổng công ty Android, với sự hỗ trợ tài chính từ Google và sau này được chính Google mua lại vào năm 2005. Android ra mắt vào năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở: một hiệp hội gồm các công ty phần cứng, phần mềm, và viễn thông với mục tiêu đẩy mạnh các tiêu chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android được bán vào tháng 10 năm 2008. Android có mã nguồn mở và Google phát hành mã nguồn theo Giấy phép Apache. Chính mã nguồn mở cùng với một giấy phép không có nhiều ràng buộc đã cho phép các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết được điều chỉnh và phân phối Android một cách tự do. Ngoài ra, Android còn có một cộng đồng lập trình viên đông đảo chuyên viết các ứng dụng để mở rộng chức năng của thiết bị, bằng một loại ngôn ngữ lập trình Java có sửa đổi.vào tháng 10 năm 2012, có khoảng 700.000 ứng dụng trên Android, và số lượt tải ứng dụng từ Google Play, cửa hàng ứng dụng chính của Android, ước tính khoảng 25 tỷ lượt. Những yếu tố này đã giúp Android trở thành nền tảng điện thoại thông minh phổ biến nhất thế giới, vượt qua Symbian vào quý 4 năm 2010, và được các công ty công nghệ lựa chọn khi họ cần một hệ điều hành không nặng nề, có khả năng tinh chỉnh, và giá rẻ chạy trên các thiết bịcông nghệ cao thay vì tạo dựng từ đầu. Kết quả là mặc dù được thiết kế để chạy trên điện thoại và máy tính bảng, Android đã xuất hiện trêntv, máy chơi game và các thiết bị điện tử khác. Bản chất mở của Android cũng khích lệ một đội ngũ đông đảo lập trình viên và những người đam mê sử dụng mã nguồn mở để tạo ra những dự án do cộng đồng quản lý. Những dự án này bổ sung các tính năng cao cấp cho những người dùng thích tìm tòi hoặc đưa Android vào các thiết bị ban đầu chạy hệ điều hành khác. 4

1.2. Lịch sử phát triển hệ điều hành Android Tổng công ty Android (Android, Inc.) được thành lập tại Palo Alto, California vào tháng 10 năm 2003 bởi Andy Rubin (đồng sáng lập công ty Danger), Rich Miner (đồng sáng lập Tổng công ty Viễn thông Wildfire), Nick Sears (từng là Phó giám đốc T-Mobile) và Chris White (trưởng thiết kế và giao diện tại WebTV) để phát triển, theo lời của Rubin, "các thiết bị di động thông minh hơn có thể biết được vị trí và sở thích của người dùng". DÙ những người thành lập và nhân viên đều là những người có tiếng tăm, Tổng công ty Android hoạt động một cách âm thầm, chỉ tiết lộ rằng họ đang làm phần mềm dành cho điện thoại di động. Trong năm đó, Rubin hết kinh phí. Steve Perlman, một người bạn thân của Rubin, mang cho ông 10.000 USD tiền mặt nhưng từ chối tham gia vào công ty. Google mua lại Tổng công ty Android vào ngày 17 tháng 8 năm 2005, biến nó thành một bộ phận trực thuộc Google. Những nhân viên của chủ chốt của Tổng công ty Android, gồm Rubin, Miner và White, vẫn tiếp tục ở lại công ty làm việc sau thương vụ này. Vào thời điểm đó không có nhiều thông tin về Tổng công ty, nhưng nhiều người đồn đoán rằng Google dự tính tham gia thị trường điện thoại di động sau bước đi này. Tại Google, nhóm do Rubin đứng đầu đã phát triển một nền tảng thiết bị di động phát triển trên nền nhân Linux. Google quảng bá nền tảng này cho các nhà sản xuất điện thoại và các nhà mạng với lời hứa sẽ cung cấp một hệ thống uyển chuyển và có khả năng nâng cấp. Google đã liên hệ với hàng loạt hãng phần cứng cũng như đối tác phần mềm, bắn tin cho các nhà mạng rằng họ sẵn sàng hợp tác với các cấp độ khác nhau. Ngày càng nhiều suy đoán rằng Google sẽ tham gia thị trường điện thoại di động xuất hiện trong tháng 12 năm 2006. Tin tức của BBC và Nhật báo phố Wall chú thích rằng Google muốn đưa công nghệ tìm kiếm và các ứng dụng của họ vào điện thoại di động và họ đang nỗ lực làm việc để thực hiện điều này. Các phương tiện truyền thông truyền thống lẫn online cũng viết về tin đồn rằng Google đang phát triển một thiết bị cầm tay mang thương hiệu Google. Một vài tờ báo còn nói rằng trong khi 5

Google vẫn đang thực hiện những bản mô tả kỹ thuật chi tiết, họ đã trình diễn sản phẩm mẫu cho các nhà sản xuất điện thoại di động và nhà mạng. Tháng 9 năm 2007, InformationWeek đăng tải một nghiên cứu của Evalueserve cho biết Google đã nộp một số đơn xin cấp bằng sáng chế trong lĩnh vực điện thoại di động. Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở (Open Handset Alliance), một hiệp hội bao gồm nhiều công ty trong đó có Texas Instruments, Tập đoàn Broadcom, Google, HTC, Intel,LG, Tập đoàn Marvell Technology, Motorola, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel và T-Mobile được thành lập với mục đích phát triển các tiêu chuẩn mở cho thiết bị di động. Cùng ngày, Android cũng được ra mắt với vai trò là sản phẩm đầu tiên của Liên minh, một nền tảng thiết bị di động được xây dựng trên nhân Linux phiên bản 2.6. Chiếc điện thoại chạy Android đầu tiên được bán ra là HTC Dream, phát hành ngày 22 tháng 10 năm 2008. Biểu trưng của hệ điều hành Android mới là một con rôbốt màu xanh lá cây do hãng thiết kế Irina Blok tại California vẽ. Từ năm 2008, Android đã trải qua nhiều lần cập nhật để dần dần cải tiến hệ điều hành, bổ sung các tính năng mới và sửa các lỗi trong những lần phát hành trước. Mỗi bản nâng cấp được đặt tên lần lượt theo thứ tự bảng chữ cái, theo tên của một món ăn tráng miệng; ví dụ như phiên bản 1.5 Cupcake (bánh bông lan nhỏ có kem) tiếp nối bằng phiên bản 1.6 Donut (bánh vòng). Phiên bản mới nhất là 4.2 Jelly Bean (kẹo dẻo). Vào năm 2010, Google ra mắt loạt thiết bị Nexus một dòng sản phẩm bao gồm điện thoại thông minh và máy tính bảng chạy hệ điều hành Android, do các đối tác phần cứng sản xuất. HTC đã hợp tác với Google trong chiếc điện thoại thông minh Nexus đầu tiên, Nexus One. Kể từ đó nhiều thiết bị mới hơn đã gia nhập vào dòng sản phẩm này, như điện thoại Nexus 4 và máy tính bảng Nexus 10, lần lượt do LG và Samsung sản xuất. Google xem điện thoại và máy tính bảng Nexus là những thiết bị Android chủ lực của mình, với những tính năng phần cứng và phần mềm mới nhất của Android. Liên minh các thiết bị cầm tay: Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở rộng (Open Handset Alliance), một côngxoocxiom bao gồm nhiều công ty trong đó có Texas Instruments, Tập đoàn Broadcom, Google, HTC, Intel, LG, Tập đoàn Marvell Technology, Motorola, Nvidia,Qualcomm, Samsung Electronics, Sprint Nextel và T-Mobile được thành lập với mục đích phát triển các tiêu chuẩn mở cho thiết bị di động. Cùng với sự thành lập của OHA, họ cũng giới thiệu sản phẩm Android đầu tiên. Nó là một thiết bị di động có hệ điều hành dựa trên nhân Linux phiên bản 2.6. 6

Ngày 9 tháng 12 năm 2008, thêm 14 thành viên mới gia nhập dự án Android được công bố, gồm có ARM Holdings, Atheros Communications, Asustek Computer Inc, Garmin Ltd,Softbank, Sony Ericsson, Toshiba Corp, và Vodafone Group Plc. Một số phiên bản hệ điều hành Android: 1.3. Kiến trúc hệ điều hành Android Kiến trúc Android gồm 4 phần chính, mô hình dưới đây sẽ cho ta cái nhìn tổng quan về kiến trúc Android. Nhân của Android được phát triển dựa vào Kernel Linux 2.6. Mỗi tầng trong kiến trúc Android hoạt động dựa vào tầng bên dưới nó. 7

Kernel Linux layer: Dựa trên Kernel Linux version 2.6 bởi nó cung cấp các trình điều khiển các thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, bảo mật,... như sau: - Security system - Memory management - Process management - Network stack - Driver model. Libraries: Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer phát triển ứng dụng android thông qua tầng Android Framework. Có thể kể ra đây một số thư viện quen thuộc với các lập trình viên như: - Media Libraries mở rộng từ PacketVideo s OpenCORE. Hỗ trợ nhiều định dạng video và image phổ biến: MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG. - Surface Manager quản lý việc hiển thị và kết hợp đồ họa 2D và 3D. - LibWebCore dùng webkit engine cho việc render trình duyệt mặc định của HDH Android browser và cho dạng web nhúng (như HTML nhúng). Thư viện đồ họa 2D và 3D. 8

- SQLite quản lý database của ứng dụng. Runtime Android: - Gồm một tập hợp các thư viện Java Core. - Máy ảo Dalvik thực thi các file định dạng.dex (Dalvik Excutable). - Mỗi ứng dụng Android chạy trên tiến trình riêng của máy ảo Dalvik. Dalvik được viết để chạy nhiều máy ảo cùng một lúc một cách hiệu quả trên cùng một thiết bị. Application Framework: Google xây dựng cho các developer để phát triển các ứng dụng của họ trên Android chỉ bằng cách gọi các API. - View UI - để xây dựng layout của ứng dụng bao gồm: list view, text field, button, dialog, form - Content Providers - cho phép các ứng dụng truy cập dữ liệu từ các ứng dụng khác hoặc để chia sẻ dữ liệu của riêng ứng dụng. - Resource Manager - cung cấp cách thức truy cập đến non-code resources như các asset, graphic, image, music, video - Notification Manager - cho phép tất cả các ứng dụng hiển thị thông báo của mình trên hệ điều hành. - Activity Manager - quản lý vòng đời của các ứng dụng. Applications: Là các ứng dụng mà lập trình viên phát triển như Browser, Media... 1.4. Các thành phần cơ bản của một ứng dụng Android 1.4.1. Activity: Một activity thể hiện một giao diện đồ họa người dùng. Ví dụ một activity có thể biểu diễn một danh sách các menu item để người dùng có thể chọn và có thể hiển thị ảnh cùng với tiêu đề. Một ứng dụng gửi tin nhắn văn bản có thể có một hoạt động là hiển thị một danh sách các liên hệ để gửi tin nhắn tới, hoạt động thứ hai là viết tin nhắn tới liên hệ được chọn, các hoạt động khác nữa là xem lại tin nhắn cũ hay thay đổi cài đặt. Mặc dù chúng làm việc cùng nhau để tạo thành một giao diện người dùng, mỗi activity độc lập với những cái khác. Mỗi activity là một lớp con của lớp cơ sở Activity. Một ứng dụng có thể gồm chỉ một activity hay nhiều activity. Thông thường, một trong số các activity được đánh dấu như là activity đầu tiên phải được trình diễn tới người dùng khi ứng dụng được khởi động. Chuyển từ một activity sang activity khác bằng cách cho activity hiện thời khởi động activity kế tiếp. 9

Mỗi activity đưa ra một cửa sổ mặc định để hiển thị giao diện. Thông thường, cửa sổ sẽ lấp đầy màn hình, nhưng nó có thể nhỏ hơn màn hình và nằm trên các cửa sổ khác. Một activity có thể sử dụng cửa sổ bổ sung - ví dụ như một pop-up dialog gọi cho một đáp ứng người dùng ở giữa của activity, hay một cửa sổ biểu diễn những cho người dùng với thông tin quan trọng khi họ chọn một item cụ thể trên màn hình. Nội dung trực quan của cửa sổ được cung cấp bởi một cây phân cấp các đối tượng view dẫn xuất từ lớp View. Mỗi view điều khiển một khoảng hình chữ nhật cụ thể bên trong cửa sổ. View cha chứa và tổ chức bố cục cho các view con. Các view con vẽ trong hình chữ nhật mà chúng điều khiển và đáp ứng lại các hành động người dùng trực tiếp ở khoảng trống này. Do đó, các view là nơi mà các tương tác của activity với người dùng diễn ra. Ví dụ một view có thể hiển thị một hình ảnh nhỏ và khởi tạo một hoạt động khi người dùng nhấn vào hình ảnh đó. Android có một số view đã xây dựng sẵn mà bạn có thể sử dụng gồm có các buttons, text view, editext, scroll bars, menu items, check boxes Lớp cơ sở Activity định nghĩa một loạt các sự kiện mà điều chỉnh vòng đời của một hoạt động. Class Activity định nghĩa các sự kiện sau đây: - oncreate(): Được gọi khi hoạt động được tạo ra lần đầu tiên - onstart(): Được gọi khi hoạt động trở nên hữu hình so với người dùng - onresume(): Được gọi khi hoạt động bắt đầu tương tác với người sử dụng - onpause(): Được gọi để dừng các hoạt động hiện tại và nối lại các hoạt động trước đó - onstop(): Được gọi khi hoạt động không còn hiển thị với người dùng - ondestroy(): Được gọi trước khi hoạt động bị phá hủy bởi hệ thống (bằng tay hoặc bằng hệ thống để bảo tồn bộ nhớ) - onrestart(): Được gọi khi hệ thống đã được dừng lại và khởi động lại một lần nữa. Vòng đời hoạt động của Activity - Toàn bộ thời gian sống của một activity xảy ra giữa lời gọi hàm oncreate() và ondestroy(). Activity của bạn nên thực hiện thiết đặt toàn cục global setup như định nghĩa layout trong hàm oncreate(), và trả lại toàn bộ tài nguyên trong phương thức ondestroy(). Ví dụ, nếu một activity có một tuyến đang chạy ngầm để download dữ liệu, nó có thể tạo ra tuyến đó trong phương thức oncreate() và dừng tuyến trong phương thức ondestroy(). - Thời gian sống thật (visible lifetime) của một activity xảy ra giữa lời gọi phương thức onstart() và onstop(). Trong suốt thời gian này, người dùng có thể nhìn thấy activity trên màn hình và tương tac với chúng.ví dụ, 10

onstop() được gọi khi một activity mới bắt đầu.giữa hai phương thức này, bạn có thể quản lý các nguồn tài nguyên cần thiết để hiển thị activity tới người dùng.ví dụ, bạn đăng ký một BroadcastReceiver trong onstart() để giám sát thay đổi tác động tới giao diện của, và hủy đăng ký trong phương onstop() khi người dùng không thấy giao diện hiển.activity xuất hiện và ẩn với người dùng - Thời gian chờ foreground lifetime) của một activity xảy ra giữa hai lời gọi onresume() và onpause(). Trong suốt thời gian này, activity là nền cho các activity khác trên màn. Một activity có thể thường xuyên chuyển trạng thái thành trạng thái chờ và hoạt ví dụ, onpause() được gọi khi thiết bị phần cứng ở trạng thái ngủ (sleep) hoặc một hộp thoại xuất hiện. Bởi vì trạng thái này có thể xảy ra thường xuyên nên mã lệnh trong hai phương thức này nên được viết cẩn thận để tăng tốc độ chuyển giữa các chế độ. 1.4.2. Services: Một service không có giao diện trực quan, nó chạy trên nền trong một khoảng thời gian không xác định. Ví dụ một service có thể chơi nhạc nền, hay nó nạp dữ liệu 11

trên mạng hay tính toán cái gì đó và cung cấp kết quả cho activity cần đến nó. Mỗi service mở rộng từ lớp cơ sở Service Một ví dụ cổ điển là media player chơi các bài hát từ một danh sách. Ứng dụng player có thể có một hay hai activity cho phép người dùng chọn bài hát và bắt đầu chơi. Tuy nhiên, music playback không tự nó được xử lý bởi một activity bởi vì người dùng sẽ mong muốn chơi tiếp nhạc khi họ rời khỏi player và làm cái gì đó khác. Để tiếp tục chơi nhạc, media player activity có thể khởi động một service chạy trên nền. Hệ thống sẽ giữ cho music playback service chạy thậm chí khi activity khởi động nó rời khỏi màn hình. Trong khi kết nối, bạn có thể giao tiếp với dịch vụ thông qua giao diện mà service đó trưng ra. Ví dụ như trong music service, giao diện này có thể cho phép người dùng pause, rewind, stop và restart lại playback. Giống như các activity và các thành phần khác khác, service chạy trong thread chính của tiến trình ứng dụng. Vì thế chúng không thể chặn những thành phần khác hay giao diện người dùng, chúng thường tạo ra các thead khác cho các nhiệm vụ hao tốn thời gian. 1.4.3. Content Provider: 12

Content providers quản lý truy cập tới dữ liệu. Chúng đóng gói dữ liệu, và cung cấp cơ chế cho phép định nghĩa bảo mật dữ liệu. Content providers là giao diện chuẩn kết nối dữ liệu trong một tiến trình cùng với mã nguồn chạy trong các tiến trình khác. Khi bạn muốn kết nối tới dữ liệu trong content provider, bạn sử đối tượng ContentResolver trong ứng dụng Context để giao tiếp với provider như một máy khách. Đối tượng ContentResolver giao tiếp với đối tượng, một thể hiện của lớp triên khai từ giao diện ContentProvider. Đối tượng provider nhận dữ liệu yêu cầu từ clients, xử lý yêu cầu và trả lại kết quả. Ban không cần phát triển provider của riêng bạn nếu không muốn chia sẻ dữ liệu với các ứng dụng khác. Tuy nhiên, bạn cần provider của mình để cung cáp những gợi ý cho tìm kiếm trong ứng dụng của bạn. Bạn luôn cần provider vì nếu bạn muốn sao chép và dán dữ liệu phức tạp hoặc các tệp từ ứng dụng của bạn sang ứng dụng khác. Android tự nó đã bao gồm content providers để quản lý dữ liệu như audio, video, images, và các thông tin liên hệ của bạn. Bạn có thể nhìn thấy một vài thông tin được liệt kê bằng cách sử gói android.provider.các provider này có thể kết nối tới các ứng dụng Android khác với một số hạn chế nhất đinh. Một số chủ đề quan trọng của Content Provider: - Content Provider Basics: Làm thế nào để truy cập dữ liệu trong một content provider khi dữ liệu được tổ chức dạng bảng. - Creating a Content Provider: Làm thế nào để tạo content provider của riêng mình. - Calendar Provider: Làm thế nào để truy cập Calendar Provider, là một phần của Android platform. - Contact Provider: Làm thế nào truy cập tới thông tin trong danh sách Contact. 1.4.4. Broadcast Receive: Một Broadcast Rreceiver là một thành phần không làm gì ngoài việc nhận và đáp lại các thông báo broadcast. Nhiều broadcast khởi đầu trong mã hệ thống - ví dụ như thông báo múi giờ thay đổi, pin yếu, ảnh đã được chụp, hay người dùng đã thay đổi ngôn ngữ Các ứng dụng có thể tạo ra các broadcast, chẳng hạn để ứng dụng khác biết được một số dữ liệu đã được tải về thiết bị và sẵn sàng cho việc sử dụng chúng. 13

Một ứng dụng có thể có một số Broadcast Receiver để đáp lại bất cứ thông báo nào mà nó cho là quan trọng. Tất cả các receiver mở rộng từ lớp cơ sở BroadcastReceiver. Broadcast Receiver không hiển thị một giao diện người dùng. Tuy nhiên chúng có thể bắt đầu một activity để đáp lại thông tin mà chúng nhận, hay chúng có thể sử dụng NotificationManager để cảnh báo người dùng. Notifications có thể lấy sự chú ý của người dùng bằng nhiều cách như lóe sáng đèn sau, rung, tạo ra âm thanh,... Chúng thường tạo một biểu tượng trong thanh trạng thái, nhờ đó người dùng có thể mở để lấy thông điệp. 1.4.5. Intents và Intent filter: Ba thành phần cơ bản của một ứng dụng activities, services, and broadcast receivers các thành phần này được kích hoạt thông qua các thông điệp được gọi là intents. Thông điệp Intent là cơ sở cho việc truy xuất giữa các thành phần trong một hoặc các ứng dụng khác nhau. Một đối tượng Intent là một cấu trúc dữ liệu bị động giữ một mô tả trừu tượng của một hành động thực thi. Có một vài cơ chế cho việc gửi intent tới từng thành phần: - Một đối tượng Intent được thông qua Context.startActivity() hoặc Activity.startActivityForResult() để khởi động một activity hoặc lấy một activity đã tồn tại để làm một việc gì đó. (Cũng có thể sử dụng Activity.setResult() để trả thông tin tới activity được gọi bằng phương thức startactivityforresult().) - Một đối tượng Intent được sử dụng thông qua phương thức Context.startService() để khởi tạo một service hoặc gửi một yêu cầu mới tới một service khác. Tương tự, một intent có thể được gửi thông qua phương thức Context.bindService() để tạo một kết nối giữa các thành phần đang gọi và một service. - Đối tượng Intent được gửi tới các phương thức (như Context.sendBroadcast(),Context.sendOrderedBroadcast(), hoặc Context.sendStickyBroadcast()) được gửi tới toàn bộ các service đang lắng nghe. Trong mỗi trường hợp, Android tìm các activity, service phù hợp hoặc thiết đặt broadcast receivers để trả lời tới intent, khởi tạo chúng nếu cần. Broadcast intents chỉ được gửi tới broadcast receivers, không bao giờ tới activities hoặc services. Một intent thông qua phương thức startactivity() chỉ được gửi tới một activity, không bao giờ tới một service hoặc broadcast receiver. 14

To inform the system which implicit intents they can handle, activities, services, and broadcast receivers can have one or more intent filters. Each filter describes a capability of the component, a set of intents that the component is willing to receive. It, in effect, filters in intents of a desired type, while filtering out unwanted intents but only unwanted implicit intents (those that don't name a target class). An explicit intent is always delivered to its target, no matter what it contains; the filter is not consulted. But an implicit intent is delivered to a component only if it can pass through one of the component's filters. Để thông báo cho hệ thống ngầm ý đồ mà họ có thể xử lý, activity, service, broadcast receivers có thể có một hoặc nhiều bộ lọc. Mỗi bộ lọc mô tả một khả năng của các thành phần, một tập hợp các intent mà thành phần đó là sẵn sàng nhận., Các bộ lọc các loại intents mong muốn, trong khi lọc sẽ loại bỏ những intent 1.4.6. Process và Thread: Process: Mỗi ứng dụng là một tiến trình có tài nguyên và không gian bộ nhớ riêng. Trong một tiến trình có thể có một hoặc nhiều tuyến. Thread: Thông thường dùng Thread để xử lý các code xử lý nặng, hoặc mất thời gian có thể gây chậm chương trình hoặc giao diện bị block. Thread khá thông dụng và trong Android dùng lớp Thread của Java. Mặc định, mỗi ứng dụng chạy trong một process và code được thực thi trong thread chính của process đó. Nếu code xử lý quá lâu, không kịp phản hồi lại các sự kiện người dùng trong 5 giây thì sẽ xuất hiện dialog Application is not responding và người dùng có thể force close ứng dụng ngay lập tức. Dù không bị đóng ứng dụng thì việc ứng dụng bị chậm là khó chấp nhận. Code minh họa triển khai một Thread: 15

hread thread = new Thread() { @Override public synchronized void start() { // Khởi tạo các đối tượng cần thiết tại đây super.start(); @Override public void run() { // code xử lý chính của thread trong này super.run(); read.start(); //bắt đầu thread 16

1.5. Android Application Lifecycle PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG 1.6. Cài đặt Android Studio 1.6.1. Chuẩn bị các công cụ để cài đặt môi trường phát triển (lập trình) Có nhiều công cụ để tạo ra một sản phẩm Android. Vấn đề là bạn chọn công cụ nào? - Sử dụng Visual Studio (với ngôn ngữ C# mà bạn quen thuộc) - Sử dụng Eclipse (Sử dụng ngôn ngữ Java) - Sử dụng Android Studio (Sử dụng ngôn ngữ Java) Trong khuôn khổ của môn học thì các bài học và demo sẽ được thực hiện trên Android Studio. Tuy nhiên có thể một số máy cấu hình không mạnh chạy Eclipse hay ADT sẽ phù hợp hơn là Android Studio vì vậy trong bài học này mình sẽ hướng dẫn nhanh cài đặt Eclipse hay ADT. Còn để cài đặt công cụ lập trình Android trên Visual Studio các bạn chỉ cần Google với từ khóa: "lập trình android trên visual studio" là xong 17

1.6.2. Cài đặt Android Studio Trước hết download bộ cài đầy đủ Android Studio tại link (không phân biệt OS 32 hay 64 bit): http://developer.android.com/sdk Sau khi tải về thành công, bạn chạy tập tin android-studio-bundle, hộp thoại Welcome to Setup Android Studio sẽ xuất hiện: 18

Nhấn Next để tiếp tục. Nếu hệ thống không phát hiện ra JDK trong máy tính của bạn, một hộp thoại yêu cầu chỉ rõ đường dẫn hoặc cài đặt JDK xuất hiện. Nếu đã có JDK, bạn vui lòng trỏ đường dẫn đến nơi cài đặt. Sau đó nhấn Next. Chưa có hãy nhấn vào link xanh và download về. Hộp thoại lựa chọn cấu hình cài đặt sẽ mở ra Bạn vui lòng check như hình trên để tránh thiếu sót về sau. Sau đó nhấn Next để tiếp tục. Hộp loại thông báo các điều khoản và một số lưu ý khi sử dụng Android Studio xuất hiện 19

Nhấn I Agree để tiếp tục. Hộp thoại yêu cầu chọn nơi cài đặt Android Studio và Android SDK xuất hiện. Bạn nên để đường dẫn mặc định như trên, sau đó nhấn Next để tiếp tục quá trình cài đặt. Hộp thoại chọn Start Menu xuất hiện, chọn Android Studio và nhấn vào Installl để tiếp tục quá trình cài đặt 20

Chờ đợi quá trình cài đặt Khi quá trình cài đặt hoàn tất, nhấn Next để tiếp tục. 21

Hộp thoại cuối cùng của quá trình cài đặt xuất hiện Nhấn check vào Start Android Studio, và Finish. Trong quá trình khởi động, nếu có thông báo thiếu JDK, bạn vui lòng cài JDK 7 bản x64 và khởi động lại Android Studio. 22

Ở lần khởi động đầu tiên, một hộp thoại import bản Android Studio cũ xuất hiện, nếu bạn cài đặt mới, vui lòng chọn như hình dưới. Nhấn OK và tiếp tục. Ở lần đầu tiên, bạn sẽ phải update một vài thứ cho quá trình làm việc sau này. Vui lòng chờ đợi cho đến khi hoàn tất. Đợi một lúc và nhấn tiếp Finish. Quá trình download file bắt đầu. 23

Khi hoàn tất quá trình download, nhấn Finish để kết thúc. Vậy là bạn đã hoàn thành quá trình cái đặt Khi cài đặt thành công Android Studio thì Android Studio tạo sẵn chúng cho chúng ta máy ảo rồi. Bạn có thể khởi động máy ảo này ngay hoặc chỉnh sửa lại thông số trước khi chạy máy ảo. Tuy nhiên nếu máy ảo không chạy được và báo lỗi hoặc khi chạy một ứng dụng Android Studio báo lỗi: Điều này có nghĩa máy tính của bạn chưa bật tính năng hỗ trợ chạy máy ảo Android. Để khắc phục cần làm như sau: 24

Bạn mở Android SDK Manager lên - theo như đường dẫn ở đầu bài là: D:\Android\sdk, tìm tới folder extras\intel\hardware_accelerated_execution_manager Sau đó chọn cài đặt file intelhaxm-android.exe. Nếu hộp thoại sau xuất hiện: Điều này có nghĩa máy tính của bạn đang bị xung đột giữa các công nghệ ảo hóa với nhau, mà trong trường hợp này là Hyper-V của Microsoft. Để tắt Hyper-V, 25

bạn vào Control Panel > Program and Features > Turn Windows feature on or off và tiến hành tắt Hyper-V như hình bên dưới: Sau đó bạn khởi động lại máy và tiến hành chạy lại file cài đặt Intel HAXM. Hộp thoại thông báo cài đặt Intel HAXM xuất hiện. Nhấn Next để tiếp tục. 26

Cấu hình nên để mặc định của hệ thống và nhấn Next. Nhấn Install và chờ đợi quá trình cài đặt. 27

thành công. Nhấn Finish để kết thúc quá trình cài đặt. Bây giờ bạn có thể build lại project 28

Quản lý Android SDK Manager: Để quản lý SDK Manager (các bộ thư viện mà chúng ta dùng lập trình) chúng ta vào: Tools Android SDK Manager hoặc nhấn biểu tượng SDK Manager ngoài Toolbar. Install. Chúng ta muốn lập trình trên API nào thì chúng ta check chọn và nhấn 29

1.7. Thiết bị ảo (AVD - Android Virtual Device) Máy ảo Android dùng để chạy các ứng dụng Android trong trường hợp bạn không có thiết bị Android thật để chạy. Để tạo máy ảo Android bạn có thể làm theo thứ tự: Vào Menu Tool Android AVD Manager hoặc nhấn vào biểu tượng AVD manager trên Toolbar AVD Manager hiện lên các máy ảo hiện có của Android Studio. Để tạo một máy ảo mới bạn chỉ cần nhấn vào Create Vitual Device... và làm theo hướng dẫn: 30

31

32

33

1.8. Debugging trên Android Studio Nhiều người chuyển từ J2SE hoặc J2ME sang Android sẽ ngạc nhiên vì câu lệnh debug kinh điển System.out.println() không còn in ra trên cửa sổ Console nữa. Google đã thay thế nó bằng Logcat, một cửa sổ ghi lại toàn bộ hoạt động của hệ điều hành. Để mở Logcat, trước tiên các bạn chọn Window Open Perspective Debug. Nếu ko thấy option Debug thì chọn Other và tìm Debug trong cửa sổ mới hiện ra. Sau đó chọn tab Debug mới xuất hiện ở góc trên bên phải của Eclipse (xem hình). Theo kinh nghiệm của mình thì tốt nhất là Maximize Logcat ra luôn cho dễ quan sát. Cảm nhận ngày xưa khi mới sử dụng Logcat là rối và khó dùng. Nhưng càng về sau mình càng quen và thấy nó tiện hơn Console nhiều, vì Console chỉ đưa ra thông báo do chúng ta gọi, còn Logcat thì đưa cả luôn những thông báo của hệ điều hành, giúp chúng ta nắm được hệ điều hành đang làm gì, gọi đến cái gì, khởi chạy những gì 1.9. Website hữu ích dành cho người lập trình Một số website dành cho người lập trình Android: - Android developer website: http://developer.android.com - Java2S: http://www.java2s.com/code/android/catalogandroid.htm - Google: Google is all - Ebook: Android Advanced Tutorial 34

BÀI 2. CHƯƠNG TRÌNH HELLO WORLD 2.1. Tạo ứng dụng Android đầu tiên Khởi động Android Studio, trong hộp thoại Welcome to Android Studio, chọn Start a new Android Studio project để tạo 1 project mới. Hộp thoại đặt tên ứng dụng và tên domain xuất hiện. 35

Trong hộp thoại này: - Application name: là tên của ứng dụng. - Company Domain: là tên domain của công ty. Kết hợp với tên của ứng dụng để tạo ra package. Cái này sử dụng để upload ứng dụng của bạn lên store. - Pakage name: Tên của gói ứng dụng của bạn. Dùng để phân biệt khi với các gói khác trên store. - Project location: Nơi lưu trữ ứng dụng của bạn (thường mình để khác ổ C). Sau khi nhập xong thông tin (bao gồm tên ứng dụng, domain và nơi lưu project), nhấn Next để tiếp tục. Hộp thoại chọn device mà bạn muốn phát triển ứng dụng xuất hiện. Bạn chọn như hình trên nếu muốn phát triển ứng dụng trên phone và tablet. Sau đó nhấn Next để tiếp tục. 36

hiện. Chọn Blank Activity và nhấn Next. Hộp thoại nhập thông tin của Activity xuất Trong hộp thoại này - Activity Name: Tên lớp lưu giữ mã nguồn. - Layout Name: Tên file XML làm giao diện cho Activity Name. - Title: Tên tiêu đề, sẽ hiển thị khi kích hoạt activity trên device. - Menu Resource Name: Tên file xml để tạo menu cho phần mềm. 37

Sau khi nhập đầy đủ thông tin, nhấn Finish để kết thúc. Chờ building project. Quá trình tạo project đến đây là kết thúc. Giao diện ứng dụng HelloWorld khi mới tạo ra: 38

2.2. Cấu trúc một ứng dụng Android PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG Về cơ bản giao diện một Project trong Android có thể chia làm 6 vùng cơ bản theo chức năng: Vùng 1: Hiển thị cấu trúc của một ứng dụng Android Chức năng một số thư mục/ file trong cấu trúc này: - manifests: là file xml lưu trữ các thông tin cấu hình của ứng dụng. file này tương tự file web.config trong lập trình web. Một ứng dụng Android muốn truy cập Internet, làm việc với SD card cần phải được cấu hình trong manifests. 39

o tab application: định nghĩa thành phần của ứng dụng sử dụng. o android:icon: trỏ đến file ảnh icon của ứng dụng. Ví dụ trong hình trên icon đang sử dụng có tên là ic_launcher được đặt trong thư mục drawable (tùy thuộc loại màn hình mà ứng dụng sẽ load file có tên ic_launcher trong thư mục drawable- tương ứng (như đã mô tả ở trên) o android:label: nhãn của ứng dụng, trỏ đến thành phần có tên app_name trong file string.xml. o android:theme: định nghĩa kiểu giao diện ứng dụng, trỏ đến thành phần có tên AppThêm trong file stypes.xm. o tag Activity: định nghĩa các activity của ứng dụng. Trong bài kế tiếp sau sẽ nói kỹ về tag này và các thành phần trong tag này. o android:name: tên của Activity khởi tạo chạy ứng dụng. Trong ứng dụng bài 2, Activity này có tên là MainActivity, thực chất là một file java. Chúng ta sẽ đi kỹ hơn về Activity trong những bài kế tiếp. - Thư mục java: Thư mục này chứa các source nguồn của ứng dụng. Bạn có thể thêm bao nhiêu package và các class java vào trong các package này tùy thích. - Thư mục res\drawable: Lưu trữ các file ảnh có cùng nội dung nhưng có độ phân giải và kích thước khác nhau, phục vụ cho mục đích hiển thị trên các loại màn hình có kích thước và độ phân giải khác nhau sao cho trông ứng dụng luôn hiển thị giống nhau trên các loại màn hình này. Chúng ta sẽ đi sâu tìm hiểu về các thư mục này trong các bài học kế tiếp - Thư mục res\layout: Lưu trữ layout của ứng dụng dưới định dạng xml. Chúng ta sẽ đi sâu tìm hiểu các loại layout trong bài học kế tiếp. 40

- Thư mục res\menu: Lưu trữ các loại menu của ứng dụng dưới định dạng xml. Chúng ta sẽ đi sâu vào tìm hiểu các loại menu trong những bài học kế tiếp - Thư mục res\values: Lưu trữ các hằng số định nghĩa sẵn cho ứng dụng (định nghĩa màu sắc sử dụng ) Vùng 2: Là vùng hiển thị các Control mà Android hỗ trợ, cho phép bạn kéo thả trực tiếp vào vùng 3 (vùng thiết kế giao diện) để thiết kế giao diện ứng dụng. Vùng này tương tự công cụ Toolbox trong Visual Studio. Vùng 3: Là vùng giao diện thiết bị, cho phép các Control kéo thả vào đây. Đây chính là vùng thiết kế giao diện ứng dụng. Ở vùng số 3 này nó có 2 tab: Design và Text ở góc trái dưới cùng. - Tab Design là tab mà bạn đang nhìn và thao tác với nó, cho phép thiết kế giao diện bằng cách kéo thả. - Tab Text là tab cho phép ta thiết kế giao diện bằng viết XML. Vùng 4: Hiển thị cấu trúc Layout và các điều khiển đã dùng thiết kế ứng dụng Android. Vùng 5: Vùng này tương tự công cụ Properties trong lập trình Windows Form. Cho phép người dùng thay đổi thuộc tính của Control trong Android. Tất nhiên chúng ta luôn có 2 các tác động vào một Control: - Thông qua công cụ Properties (sử dụng tab Design) - Thông qua tệp XML (sử dụng tab Text) Vùng 6: Công cụ Toolbar trên Android Studio cho phép người dùng thao tác nhanh với các tác vụ (chạy ứng dụng, AVD Manager, SDK Manager...) 2.3. Chạy ứng dụng trên AVD Mẹo: Để đỡ mất thời gian khi chạy ứng dụng Android HelloWorld hay tất cả các ứng dụng Android về sau, chúng ta khởi động Máy ảo trước khi chạy ứng dụng và cứ để đó trong suốt thời gian bạn làm việc với Android Studio để chạy các ứng dụng. Để khởi động máy ảo AVD chỉ cần vào AVD Manager chọn máy ảo cần làm việc và khởi động. 41

Sau đó để chạy ứng dụng chúng ta có thể sử dụng một trong 3 cách: - Nhấn biểu tượng Run trên thanh Toolbar - Vào menu Run/Run App (nhấn Shift + F10) - Vào menu Run/Run (nhấn Alt + Shift + F10) 42

Màn hình ra như sau (ở đây mình đã khởi động sẵn máy ảo fitutehy rồi): Nhấn OK và kết quả như sau: 43

2.4. Chạy ứng dụng trên Mobile Phone Để chạy ứng dụng trên máy thật (cụ thể ở đây mình dùng điện thoại SamSung Galaxy S3 GT9300) bạn chỉ cần kết nối máy tính với điện thoại của bạn bằng một cab USB. Để chạy ứng dụng trên máy thật (SamSung Galaxy S3 GT9300) bạn chỉ cần nhấn nút Run và lựa chọn thiết bị mô phỏng (ở đây do mình chưa tắt máy ảo fitutehy nên nó hiển thị nên cả 2 thiết bị sẵn sàng chờ mô phỏng: một thiết bị thật và một thiết bị ảo): Chú ý: Khi kết nối điện thoại với cáp và chạy ứng dụng Android, nếu Android Studio không nhận ra thiết bị của bạn thì có thể do điện thoại của bạn chưa kích hoạch chế độ USB debugging. Để kích hoạch chế độ này trên điện thoại của bạn chúng ta có thể làm như sau: - Với các phiên bản Android thấp hơn 4.0 ta sẽ vào Settings Applications Development sau đó kích hoạt USB debugging - Với các phiên bản Android caos chúng ta sẽ vào Setting Developer options sau đó kích hoạt USB debugging 44

2.5. Một số phím tắt hữu dụng trong lập trình Android - Ctrt + Y ( tương đương Shift + Delete): Xóa 1 dòng tại con trỏ. - Ctrl + F11: quay ngang màn hình AVD. - Ctrl + Space: hiển thị bảng Suggestion (tương tự C#). - Ctrl + Alt + L: định dạng lại code cho chuẩn (đẹp). - Ctrl + /: Comment, uncomment một dòng. - Ctrl + Shift + /: comment, uncomment một đoạn code. - Ctrl + G: đưa con trở đến 1 dòng nào đó, rất hữu ích với 1 file dài. - Ctrl + F9: Build ứng dụng - Shift + F10: Buid và chạy ứng dụng. 45

BÀI 3. LÀM VIỆC VỚI LAYOUT 3.1. Giới thiệu về XML 3.1.1. XML là gì? XML viết tắt của chữ extensible Markup Language (ngôn ngữ nâng cấp có thể mở rộng) là một bộ qui luật về cách chia một tài liệu ra làm nhiều phần, rồi đánh dấu và ráp các phần khác nhau lại để dễ nhận diện chúng. Tổ hợp Web toàn cầu W3C gọi XML là "một cú pháp thông dụng cho việc biểu thị cấu trúc trong dữ liệu". Dữ liệu có cấu trúc tham chiếu đến dữ liệu được gán nhãn cho nội dung, ý nghĩa, hoặc công dụng. XML có cấu trúc giống như HTML tuy nhiên HTML sử dụng những thẻ được định nghĩa trước (trong một tài liệu html không thể sử dụng thẻ do người dùng định nghĩa), còn trong trang XML hoàn toàn có thể sử dụng những thẻ do người dùng định nghĩa. 3.1.2. Cú pháp XML Một trang XML phải tuân thủ các quy luật sau: - Một trang XML phải bắt đầu bằng XML. - Phải có một root (gốc) Element duy nhất, gọi là Document Element, nó chứa tất cả các Elements khác trong tài liệu. - Mỗi Child Element phải nằm trọn bên trong Element cha của nó. - Mỗi opening Tag phải có một closing Tag giống như nó (Nếu Tag nào không chứa gì ở giữa thì phải chấm dứt bằng "/>", thí dụ như <BR/>, <HR/> ). opening Tag và closing Tag phải được đánh vần y như nhau, chữ hoa hay chữ thường. - Các Tag không được xen kẽ nhau (thí dụ như <Class>TK12<Lop>TK12</Class></Lop> là bất hợp lệ vì <Lop> nằm trong Tag Class). - Giá trị Attribute trong XML phải được gói giữa một cặp ngoặc kép. 46

3.2. Giới thiệu về Layout Layout định nghĩa cấu trúc cho một giao diện người dùng, mỗi một layout cho phép người dùng thiết kế giao diện ứng dụng trên nó. Mỗi một Layout trong Android tương ứng là một Form trong lập trình Windows Form C#. một giao diện (trang) người dùng = giao diện + code cho giao diện đó Trong C#: Trong Android Studio: file giao diện và code cho giao diện đó được đặt ở hai nơi khác nhau. Các bạn có thể xem trong hình. Chúng ta có thể xem và thiết kế giao diện người dùng (giao diện Layout) theo 2 cách (tùy theo việc người dùng chọn Tab Design hoặc tab Text ở vùng 3): - Giao diện đồ họa - Giao diện dạng cấu trúc tệp XML 47

- Một số loại Layout cơ bản trong Android Studio: - FrameLayout - LinearLayout - TableLayout - RelativeLayout - AbsoluteLayout Chú ý: Một trang giao diện người dùng không nhất thiết chỉ sử dụng 1 loại Layout mà có thể sử dụng nhiều loại Layout kết hợp với nhau để tạo giao diện. 3.3. Cách tạo Layout trong một dự án Android Mỗi Layout giống như một Form trong lập trình NET. Tất cả các Layout được chứa trong thư mục layout của dự án Android. Để tạo một Layout chúng ta làm như sau: Bước 1: Nhấn chuột phải (right click) vào thư mục Layout chọn New chọn Layout resource file 48

Bước 2: Đặt tên Layout trong mục File name và chọn kiểu Layout trong mục Root element (kiểu Frame Layout, Table Layout ) 49

Bước 3: Layout bạn tạo sẽ được hiển thị ra thư mục layout của ứng dụng Android. 3.4. Frame Layout - Đặc điểm: Frame Layout là loại Layout cơ bản nhất, đặc điểm của nó là chúng ta chỉ khi gắn các control vào một trong các Frame con của Frame Layout (Frame Layout chia Layout thành 9 frame con). Nếu chúng ta đưa hai điều khiển vào cùng một frame thì điều khiển sau sẽ đè lên điều khiển trước. 50

- Ví dụ: Một thiết kế sử dụng Frame Layout <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i living in Hung Yen" android:id="@+id/radiobutton2" android:layout_gravity="right center_vertical" /> <RadioButton android:layout_height="wrap_content" android:text="i lived in Hung Yen" android:textsize="8pt" android:id="@+id/radiobutton3" android:layout_gravity="left bottom" /> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i live in Hung Yen" android:id="@+id/radiobutton4" 51

android:layout_gravity="right bottom" /> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="present Simple" android:id="@+id/textview" android:layout_gravity="center_horizontal top" /> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i lives in Hung Yen" android:id="@+id/radiobutton" android:layout_gravity="left center_vertical" /> </FrameLayout> 3.5. Linear Layout - Đặc điểm: Layout này cho phép sắp xếp các control theo hai hướng trên giao diện: Hướng từ trái qua phải (khi chúng ta đặt thuộc tính android:orientation="horizontal"): tất cả các điều khiển chứa trên một dòng và sắp xếp từ trái qua phải. Hướng từ trên xuống dưới (khi chúng ta đặt thuộc tính android:orientation="vertical"): mỗi một điều khiển được chứa trên một dòng và sắp xếp lần lượt từ trên xuống dưới. Tại mỗi dòng này ta có thể căn lề mỗi điều khiển Trái, giữa hoặc phải - Ví dụ: android:orientation="horizontal" 52

android:orientation="vertical" android:orientation="vertical" và căn lề các điều khiển 3.6. Table Layout TableLayout là sự mở rộng của LinearLayout. Cấu trúc kiểu hiển thị này là các điều khiển con được đặt các hàng và các cột. Dưới đây là ví dụ: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:layout_height="wrap_content" android:text="first Name:"/> <EditText android:layout_height="wrap_content" android:text="barack"/> </TableRow> <TableRow> <TextView 53

android:layout_height="wrap_content" android:text="last Name:"/> <EditText android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> Để sử dụng TableLayout, bạn tạo một thể hiện của lớp TableLayout và đặt TableRow bên trong nó. Các phần tử TableRow chứa các điều khiển của bảng. Dưới đây là ảnh minh họa Do các nội dung của một TableLayout được định nghĩa bởi các hàng và các cột, Android quyết định số của các cột trong bảng bằng việc tìm kiếm hàng cùng với các ô (cells). Ví dụ, hình bên dưới tạo một bảng cùng với hai hàng, trong đó một hàng có hai ô và một hàn có ba ô. Trong trường hợp này Android tạo một bảng cùng với hai hàng và ba cột. 54

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:layout_height="wrap_content" android:text="first Name:"/> <EditText android:layout_height="wrap_content" android:text="barack"/> </TableRow> <TableRow> <TextView android:layout_height="wrap_content" android:text="last Name:"/> <EditText android:layout_height="wrap_content" android:text="hussein"/> <EditText android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> Bạn có thể sử dụng lớp android.widget.view để tạo ra bảng như ví dụ trên. Trong mã lệnh bên dưới, chúng ta sẽ tạo một bảng có hàng đầu tiên là một EditText. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchcolumns="0,1,2"> <EditText android:text="full Name:"/> 55

<TableRow> <TextView android:layout_height="wrap_content" android:text="barack"/> <TextView android:layout_height="wrap_content" android:text="hussein"/> <TextView android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> - Sử dụng android:padding Bạn có thể cần khoảng trắng bên trong các nội dung của một ô hoặc một điều khiển. Android SDK hỗ trợ thông qua thuộc tính android:padding, thuộc tính này thiết lập khoảng cách giữa điều khiển của bạn và đường bao của điều khiển chứa nó. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:layout_height="wrap_content" android:text="one" android:padding="40px" /> </LinearLayout> 56

Các đơn vị được Android hỗ trợ: - Pixels: được định nghĩa là px - Inches: được định nghĩa là in - Millimeters: được định nghĩa là mm - Divice-independent pixels: được định nghĩa là dip hoặc dp - Scale pixels: được định nghĩa là sp 3.7. Relative Layout Một kiểu layout khá thú vị là RelativeLayout. Như tên của nó, layout này triển khai một cơ chế hiển thị nơi các điều khiển trong khung chứa nằm tương đối với các điều khiển khác. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/usernamelbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="username: " android:layout_alignparenttop="true" /> <EditText android:id="@+id/usernametext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/usernamelbl" /> <TextView android:id="@+id/pwdlbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/usernametext" android:text="password: " /> 57

<EditText android:id="@+id/pwdtext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/pwdlbl"/> <TextView android:id="@+id/pwdhintlbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/pwdtext" android:text="password Criteria... " /> <TextView android:id="@+id/disclaimerlbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:text="use at your own risk... " /> </RelativeLayout> 58

Như hiển thị ở trên, giao diện người dùng giống như một login form đơn giản. Nhãn username được đạt ở trên cùng của khung chứa vì chúng ta thiết đặt android:layout_alignparenttop là true. Tương tự, hộp text nhập username được đặt phía dưới username label vì chúng ta thiết đặt android:layout_bellow. Ô nhập mật khẩu xuất hiện bên dưới username vì chúng ta thiết đặt thuộc tính android:layout_alignparentbottom là true. 3.8. Absolute Layout Dạng layout này cho phép người dùng đặt chính xác vị trí của các điều khiển trong khung chứa. <AbsoluteLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/> <TextView android:layout_height="wrap_content" android:text="username:" android:layout_x="50px" android:layout_y="50px" /> <EditText android:layout_height="wrap_content" android:layout_x="160px" android:layout_y="50px" /> <TextView android:layout_height="wrap_content" android:text="password:" android:layout_x="50px" android:layout_y="100px" /> <EditText 59

android:layout_height="wrap_content" android:layout_x="160px" android:layout_y="100px" /> </AbsoluteLayout> Bên cạnh đó, chúng ta cũng có thể sử dụng dạng layout này một cách tự động trong mã lệnh như ví dụ sau: public void oncreate(bundle icicle){ super.oncreate(icicle); ImageView img = new ImageView(this); imgsetimageresource(r.drawable.myimage); AbsoluteLayout al = new AbsoluteLayout(this); mcontentview.addview(img, new AbsoluteLayout.LayoutParams( 50, // width 50, //height 0, //left 0); //top setcontentview(al); 60

BÀI 4: THẢO LUẬN/BÀI TẬP 01: ANDROID LAYOUT BÀI 5. ACTIVITY VÀ INTENT 5.1. Khái niệm Activity Đơn giản chúng ta có thể hiểu một Activity là một file mã nguồn Java viết để xử lý hành vi cho một Layout. Trong ví dụ HelloWorld ở trên thì file MainActivity được tạo ra để xử lý cho layout activity_main.xml (trong thư mục layout) Mã nguồn cơ bản của file Main Activity khi mới được tạo ra: Trong đó chúng ta chú ý: 61

- Phương thức OnCreate (đánh dấu mục số 1): Tương tự như phương thức Form_Load của một Form trong lập trình Windows Form. Phương thức này sẽ được thực thi khi Layout chạy. - Dòng lệnh SetContentView (R.Layout.activity_main): thiết lập Layout nào được gọi (được hiển thị). - Các phương thức OnCreateOptionsMenu và onopntionsitemselected: xử lý về Menu. Nếu ứng dụng không làm việc với menu thì có thể xóa đi cũng được. Để thêm một Activity vào ứng dụng chúng ta chỉ cần right click vào thư mục package của ứng dụng và chọn New Java class 5.2. Cách tạo Activity và kết nối với Layout Một ứng dụng Android không chỉ có duy nhất một Layout (Form) mà có nhiều Layout, vậy làm thế nào để tạo nhiều Layout, tạo nhiều Activity, và kết nối Activity với Layout. Đây cũng chính là vấn đề mà rất nhiều lập trình Android mới thắc mắc và muốn tìm hiểu. Trong C# thì làm điều đó rất đơn giản, còn Android thì hơi phức tạp hơn một chút. Để minh họa cho điều này chúng ta làm một ví dụ minh họa: Yêu cầu: thiết kế ứng dụng Android bao gồm 3 Layout, layout chính có giao diện như sau: 62

Layout chính bao gồm hai Button. Khi nhấn vào Button INTENT 1 và Button INTENT 2 thì hiển thị Layout 1 và layout 2 lần lượt có giao diện sau: Tại Layout 1 và Layout 2 khi nhấn vào Button BACK LAYOUT MAIN thì quay trở lại layout chính ở trên. Giải quyết: để làm điều này chúng ta thực hiện lần lượt 4 bước như sau: - Bước 1: Tạo dự án Android Studio (tùy bạn đặt tên) sau đó tạo 3 layout lần lượt có tên main.xml, layout1.xml, layout2.xml và 3 Activity lần lượt có tên như sau MainActivity, layout1activity, layout2activity (MainActivity viết cho main.xml, layout1activity viết cho layout1, layout2activity viết cho layout2). 63

- Bước 2: Thiết kế giao diện cho các Layout main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="activity INTENT" android:id="@+id/textview" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="intent 1" android:id="@+id/btintent1" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="intent 2" 64

android:id="@+id/btintent2" android:layout_gravity="center_horizontal" /> </LinearLayout> Layout1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="layout 1" android:id="@+id/textview2" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back layout main" android:id="@+id/btback" android:layout_gravity="center_horizontal" /> </LinearLayout> Layout2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="layout 2" android:id="@+id/textview2" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back layout main" android:id="@+id/btback" android:layout_gravity="center_horizontal" /> </LinearLayout> 65

- Bước 3: Viết code cho các Activity PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG MainActivity public class MainActivity extends ActionBarActivity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // Button btn1 = (Button) findviewbyid(r.id.btintent1); Button btn2 = (Button) findviewbyid(r.id.btintent2); //Button1 btn1.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { Intent in = new Intent(v.getContext(), layout1activity.class); startactivity(in); ); //Button2 btn2.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { Intent in = new Intent(v.getContext(), layout2activity.class); startactivity(in); ); layout1activity public class layout1activity extends ActionBarActivity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout1); // Button btn = (Button) findviewbyid(r.id.btback); btn.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { Intent in = new Intent(v.getContext(), MainActivity.class); startactivity(in); ); 66

layout2activity public class layout2activity extends ActionBarActivity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout2); // Button btn = (Button) findviewbyid(r.id.btback); btn.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { Intent in = new Intent(v.getContext(), MainActivity.class); startactivity(in); ); - Bước 4: Khai báo Activity trong AndroidManifest.xml (bước này rất quan trọng) xem hai dòng lệnh trong khung. AndroidManifest.xml Nếu không có dòng lệnh trên sau khi nhấn Button chương trình sẽ báo lỗi: 67

5.3. Các kiểu xử lý sự kiện trong Android Trong C# việc viết sự kiện cho các điều khiển đơn giản hơn so với Android. Ví dụ: Chúng ta có một Form: Để viết sự kiện cho Button Test chúng ta chỉ việc double click vào Button, Visual Studio sẽ tự động sinh cho chúng ta sự kiện click của Button đó trên file code. private void bttest_click(object sender, EventArgs e) { Còn trong Android chúng ta không làm được như vậy. Có nhiều cách để viết sự kiện cho một điều khiển trong Android, ở đây mình giới thiệu 2 cách hay dùng nhất: 68

- Onclick in XML - Inline anonymous listener Để minh họa cho 2 cách viết trên chúng ta chỉ cần lấy ví dụ đơn: Thiết kế giao diện như bên dưới, khi nhấn vào Button thì hiển thị một MessageBox có nội dung "KHOA CNTT - ĐHSPKT HƯNG YÊN". Cấu trúc Project: Mã nguồn MainActivity và activity_main.xml ban đầu: activity_main.xml <RelativeLayout> <Button android:layout_height="wrap_content" android:text="it - UTEHY" android:id="@+id/btdemo" 69

android:layout_margintop="126dp" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" /> </RelativeLayout> MainActivity 5.3.1. Onclick in XML: Viết một phương thức riêng minh họa cho sự kiện của điều khiển (ở đây là Button, các điều khiển khác tương tự). Sau đó gọi phương thức này trong thuộc tính của điều khiển ở file XML Layout. - Bước 1: Viết phương thức minh họa sự kiện của Button (viết trong MainActivity): - Bước 2: gọi phương thức này trong thuộc tính của điều khiển ở file XML Layout (activity_main.xml) 70

Kết quả khi chạy ứng dụng trên máy ảo: 5.3.2. Inline anonymous listener: Chúng ta chỉ cần viết một phương thức trong sự kiện oncreate và không phải viết ra phương thức riêng và cũng không cần thiết lập sự kiện onclick trong tập xml layout. 71

Bỏ dòng lệnh: OnClickandroid:onClick="OnClickButton" Tùy theo thói quen của người lập trình mà người lập trình có thể chọn theo Onclick in XML hay Inline anonymous listener 5.4. Truyền dữ liệu giữa các Activity Để truyền dữ liệu giữa các các Activity chúng ta có thể sử dụng Intent. Để hiểu rõ hơn các bạn có thể tham khảo ví dụ sau: Yêu cầu: Viết chương trình tính tổng hai số, kết quả được hiển thị trên Layout khác Các bạn có thể tham khảo hướng dẫn sau: - Cấu trúc ứng dụng: - Layout Main: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:id="@+id/tablerow1" android:gravity="center" 72

android:layout_height="wrap_content" > <TextView android:id="@+id/textview1" android:layout_height="wrap_content" android:text="tổng HAI SỐ" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:id="@+id/tablerow2" android:layout_height="wrap_content" > <TextView android:id="@+id/textview2" android:layout_height="wrap_content" android:text="sô a:" /> <EditText android:id="@+id/txta" android:layout_height="wrap_content" android:ems="10" /> </TableRow> <TableRow android:id="@+id/tablerow3" android:layout_height="wrap_content" > <TextView android:id="@+id/textview3" android:layout_height="wrap_content" android:text="số b:" /> <EditText android:id="@+id/txtb" android:layout_height="wrap_content" android:ems="10" > 73

<requestfocus /> </EditText> </TableRow> <TableRow android:id="@+id/tablerow4" android:gravity="center" android:layout_height="wrap_content" > <Button android:id="@+id/btok" android:onclick="dangnhap" android:layout_height="wrap_content" android:text="ok" /> </TableRow> </TableLayout> package com.example.hoangquocviet.intent; import android.content.intent; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.edittext; public class MainActivity extends ActionBarActivity { EditText txta, txtb; Button btnok; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // txta = (EditText) findviewbyid(r.id.txta); txtb = (EditText) findviewbyid(r.id.txtb); btnok = (Button) findviewbyid(r.id.btok); // btnok.setonclicklistener(new View.OnClickListener() { 74

public void onclick(view arg0) { //Tạo Intent để mở ResultActivity Intent myintent = new Intent(MainActivity.this, layout2_activity.class); //Khai báo Bundle Bundle bundle = new Bundle(); int a = Integer.parseInt(txta.getText().toString()); int b = Integer.parseInt(txtb.getText().toString()); //đưa dữ liệu riêng lẻ vào Bundle bundle.putint("soa", a); bundle.putint("sob", b); //Đưa Bundle vào Intent myintent.putextra("mypackage", bundle); //Mở Activity ResultActivity startactivity(myintent); ); - Layout 2: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="kết QUẢ" android:id="@+id/textview" android:layout_gravity="center_horizontal" /> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:id="@+id/tvkq" android:background="#fc1213" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back" android:id="@+id/btback" 75

android:layout_gravity="center_horizontal" /> </LinearLayout> package com.example.hoangquocviet.intent; import android.content.intent; import android.os.bundle; import android.support.v7.app.actionbaractivity; import android.view.view; import android.widget.button; import android.widget.textview; /** * Created by Hoang Quoc Viet on 26-02-2016. */ public class layout2_activity extends ActionBarActivity { TextView tvketqua; Button btnback; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout2); btnback=(button) findviewbyid(r.id.btback); tvketqua=(textview) findviewbyid(r.id.tvkq); //lấy intent gọi Activity này Intent callerintent=getintent(); //có intent rồi thì lấy Bundle dựa vào MyPackage Bundle packagefromcaller= callerintent.getbundleextra("mypackage"); //Có Bundle rồi thì lấy các thông số dựa vào soa, sob int a=packagefromcaller.getint("soa"); int b=packagefromcaller.getint("sob"); int kq=a+b; tvketqua.settext(kq+""); // btnback.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { finish(); ); 76

BÀI 6. LÀM VIỆC VỚI TOAST, DIALOG VÀ NOTIFICATION 6.1. Giới thiệu Toast Notification và Alert Dialog trong Android dùng để xuất ra một thông báo nào đó hay bạn cũng có thể dùng để kiểm tra một điều gì khi lập trình ứng dụng cho Android. Các tiền trình của ứng dụng vẫn sẽ tiếp tục làm việc khi Toast và Alert Dialog hiện ra thông báo. 6.2. Toast - Toast là gì?: Toast là một dạng thông báo ngắn mặc định là chuỗi hiện lên trong một khoảng thời gian ngắn sau đó sẽ đóng lại. Toast có thể được tạo và hiển thị trong Activity hoặc trong Servive. - Khi nào nên sử dụng Toast: Bạn có thể sử dụng trong trường hợp hiển thông báo trong các mục thiết lập thông số cấu hình, hay đơn giản chỉ là hiển thị lên để xem thông tin tạm thời nào đó (giống như để kiểm tra một vấn đề sảy ra chẳng hạn). ví dụ: - Cú pháp tạo Toast: Cách 1: Toast toast=toast.maketext(youractivity.this, Hiển thị gì thì ghi ở đây, Toast.LENGTH_SHORT); toast.show(); Cách 2: Toast.makeText(YourActivity.this, Hiển thị gì thì ghi ở đây, Toast.LENGTH_SHORT).show(); Có 2 giá trị mặc định (ta nên sử dụng 2 giá trị này, không nên gõ con số cụ thể vào): hằng số Toast.LENGTH_SHORT hiển thị trong 2 giây, Toast.LENGTH_LONG hiển thị trong 3.5 giây. 77

6.3. Alert Dialog - Alert Dialog là gì?: Là một dạng của thông báo và cho phép người dùng tương tác, ví dụ: khi nhấn nút Cancel, chương trình sẽ hiển thị Alert Dialog hỏi xem có chắc chắn muốn xóa hay không? Bấm No thì không, bấm Yes thì tắt chương trình. //Viết ra phương thức riêng // Alert Dialog public void AlertDialog(View v) { // Dialog AlertDialog.Builder al = new AlertDialog.Builder(this); al.settitle("message"); // al.seticon(); al.setmessage("are you sure you want to exit?"); // Yes al.setpositivebutton("có", new DialogInterface.OnClickListener() { @Override public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub finish(); ); // No al.setnegativebutton("không", new DialogInterface.OnClickListener() { @Override public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel(); ); al.create().show(); - Ý nghĩa của các hàm : o settitle : thiết lập tiêu đề cho Dialog o setmessage: Thiết lập nội dung cho Dialog 78

o seticon : để thiết lập Icon o setpositivebutton, setnegativebutton thiết lập hiển thị Nút chọn cho Dialog (ở đây bạn không quan tâm Nút chấp nhận hay Nút hủy nó thuộc PositiveButton hay NegativeButton vì đó là tùy thuộc bạn chọn. Chú ý là ở đối số thứ 2 của các hàm này sẽ là DialogInterface. OnClickListener chứ không phải View. OnClickListener o create() để tạo Dialog o show() để hiển thị Dialog. 6.4. Promt Dialog Tương tự như JavaScripts, Android hỗ trợ Promt dialog cho phép người dùng Tạo Message tương tác với người dùng qua hộp thoại. Để hiển thị Promt Dialog chúng ta có thể tham khảo đoạn code sau: // Input Dialog public void PromtDialog (View v) { int a,b; // final EditText result = (EditText) findviewbyid(r.id.edtinput); final EditText input = new EditText(this); // Hiển thị MessageBox AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setmessage("promtdialog"); alert.setview(input); // alert.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input.gettext() + ""; result.settext(value); a=integer.parseint(value); ); alert.create().show(); // Để hiểu rõ hơn về Promt Dialog chúng ta có thể tham khảo bài toán sau: Cho Layout có giao diện như sau: 79

Yêu cầu: Viết code thực hiện các công việc sau: - Khi Layout được Load thì hiển thị hai InputDialog cho phép người dùng nhập vào giá trị của a, b của phương trình bậc nhất một ẩn ax + b = 0. - Khi người dùng nhấn OK thì lấy giá trị trong InputDialog gán cho hai hệ số a, b tương ứng. - Giải phương trình và hiển thị kết quả lên màn hình (dưới dạng Alert Dialog). Hướng dẫn: // Input Dialog int a, b; public void InputDialog(View v) { final EditText result = (EditText) findviewbyid(r.id.edtinput); final EditText input = new EditText(this); // Hiển thị MessageBox nhập a AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setmessage("nhập hệ số a: "); alert.setview(input); alert.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input.gettext() + ""; a = Integer.parseInt(value); ); alert.create().show(); // Hiển thị MessageBox nhập b final EditText input2 = new EditText(this); AlertDialog.Builder alert2 = new AlertDialog.Builder(this); alert2.setmessage("nhập hệ số b:"); alert2.setview(input2); alert2.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input2.gettext() + ""; b = Integer.parseInt(value); 80

); alert2.create().show(); //Tính nghiệm //Sinh viên tự làm nốt PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG 81

BÀI 7. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) 7.1. Giới thiệu View Các Control trong Android Studio được chia làm các Tab riêng biệt theo chức năng của Control (tương tự Visual Studio) Các control và view cơ bản sử dụng nhiều trong Android: - Nhóm điều khiển TextView: hiển thị một nhãn hay chuỗi ký tự. - Nhóm điều khiển Button: nút nhấn cho phép người dùng thao tác các chức năng sử dụng. 82

- Nhóm điều khiển EditText: cho phép người dùng nhập / hiển thị nội dung (ký tự, chuôi, số ). - CheckBox: có chức năng cho phép người dùng tích vào các mục muốn lựa chọn. - RadioButton: cũng là một dạng lựa chọn cho người dùng nhưng việc lựa chọn là chọn một trong số các RadioButton, khi lựa chọn thì các RadioButton khác sẽ không được lựa chọn. - ListView: hiển thị danh sách theo chiều dọc của layout (danh sách có thể là các dòng text hoặc hình ảnh + text v.v). - GridView: tương tự như ListView nhưng các thành phần bên trong được xắp xếp theo 2 chiều, giống như các ô lưới (các thành phần bên trong giống như ListView). - ImageView: dùng để hiển thị một hình ảnh nào đó. - ImageButton: dùng để hiển thị button dưới dạng hình ảnh như nút back, exit - ProgressBar: hiển thị thanh xử lý như download, loading v.v - RatingBar: thanh bình chọn theo sao, có thể tạo ra nhiều sao tùy người dùng. - Spinner: hiển thị lựa chọn, xổ xuống 1 danh sách các lựa chọn cho người dùng. 7.2. Nhóm điều khiển TextView - Chức năng: nhóm điều khiển TextView bao gồm 4 điều khiển (Plain TextView, Large Text, Medium Text, Small Text) có chức năng như Label trong C#. Cho phép hiển thị thông tin mà không chỉnh sửa được. - Một số thuộc tính thường dùng: o layout:width : chiều rộng của control (Tính theo trục Ox từ góc trên bên trái qua phải).có 3 thuộc tính: wrap_content (Co dãn theo nội dung control), match_parent (tự dãn ra cho đầy với control chứa nó parent), fill_parent (cũng tương tự như match_parent) o layout_heigth: Chiều dài của control (Tính theo trục Oy từ góc trên bên trái xuống dưới). Có 3 thuộc tính như layout:width o text: nội dung của Textview o texcolor: màu chữ (hệ màu 16) o background: màu nền cho textview (hệ màu 16) o id: Tương tự như thuộc tính name trong C#, đây sẽ là tên controls để gọi trong code @+id/tên 83

o Gravity: căn chỉnh nội dung trong textview Giá trị : Center, left, right, bottom. o textstyle: style cho nội dung: Bold(đậm), Italic (nghiêng),. o textsize: kích thước của chữ o paddingleft(top-right-bottom): khoảng cách so với parent - Một số phương thức: o settext: gán nội dung cho TextView o gettext: lấy nội dung của TextView - Ví dụ: điều khiển TextView thiết kế trong tệp xml Layout 7.3. Nhóm điều khiển Button - Chức năng: Nhóm điều khiển Button bao gồm 2 điều khiển (Button, Small Button) có chức năng tương tự như Button trong C#, dùng làm nút nhấn để thực hiện các chức năng của ứng dụng. - Một số thuộc tính thường dùng: Các thuộc tính giống như điều khiển TextView. - Một số phương thức thường dùng: o settextcolor: thiết lập mầu chữ. o setbackgroundcolor: thiết lập mầu nền Button - Một số sự kiện thường dùng: o OnClick: xảy ra khi người dùng nhấn vào Buton. Việc viết sự kiện cho Button đã được giới thiệu ở bài trước - Bài tập: Trên thực tế Button của Android nhìn rất thô, vì vậy người dùng thường phải custom cho đẹp hơn. Sinh viên tự tìm hiểu cách custom button 84

7.4. Nhóm điều khiển TextFields - Chức năng: Bao gồm nhiều điều khiển khác nhau có chức năng nhập liệu giống như Textbox (sự khác nhau của những điều khiển này ở chỗ bàn phím hiện ra khi focus vào các text fields) - Một số thuộc tính thường dùng: Các thuộc tính cũng tương tự như Textview, chỉ có một số điểm khác biệt sau: o Hint: phần text gợi ý cho người dùng trước khi nhập liệu o inputtype: cho phép nhập một số dạng: Password, Email, Phone.(tương ứng với trong phần control kéo thả cũng có 1 số loại thường dùng được google để sẵn). 85

o textautocorrect : Tự động sửa đúng chính tả, giả sử bạn nhập teh thì nó sẽ tự động sửa thành the - Ví dụ: Tạo một ứng dụng bao gồm tất cả các điều khiển Text Fields sau đó chạy ứng dụng để thấy sự khác nhau khi Focus vào mỗi Text Fields 7.5. Điều khiển CheckBox - Chức năng: dùng cho việc xử lý đa lựa chọn. - Một số thuộc tính thường dùng: o Checked: true/false đặt trạng thái cho checkbox - Một số phương thức thường dùng: o setchecked: thiết lập trạng thái cho checkbox setchecked (true): check setchecked (false): bỏ check o ischecked: kiểm tra xem trạng thái được check hay không. Trả về một trong hai trạng thái True/False - Một số sự kiện thường dùng: o CheckedChanged: xảy ra khi người dùng check vào CheckBox viết sự kiện này theo ít nhất 2 cách (tương tự Button ở trên) 86

o Click: gần tương tự sự kiện CheckedChanged - Ví dụ minh họa: Thiết kế ứng dụng đặt xuất trong cửa hàng KFC có giao diện như sau: Khi người dùng nhấn nút Đặt hàng thì hiển thị số tiền mà người dùng phải trả. Hướng dẫn: Thiết kế giao diện và viết code như dưới: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main"> <TableRow android:gravity="center" android:id="@+id/tablerow1" android:layout_height="wrap_content" > <TextView android:layout_gravity="center" android:id="@+id/textview1" android:layout_height="wrap_content" android:text="menu KFC" android:textalignment="center" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:id="@+id/tablerow2" android:layout_height="wrap_content" > <CheckBox 87

android:id="@+id/cbcanhgaran" android:layout_height="wrap_content" android:text="cánh gà rán - 89.000 (VNĐ)" /> </TableRow> <TableRow android:id="@+id/a1" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbduigaran" android:layout_height="wrap_content" android:text="đùi gà rán - 92.000 (VNĐ)" /> </TableRow> <TableRow android:id="@+id/cbco1mbo" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbcombo" android:layout_height="wrap_content" android:text="combo -156.000 (VNĐ)" /> </TableRow> <TableRow android:id="@+id/tablerow3" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbthucanphu" android:layout_height="wrap_content" android:text="thức ăn phụ - 34.000 (VNĐ)" /> </TableRow> <TableRow android:gravity="center" android:id="@+id/tablerow4" 88

android:layout_height="wrap_content" > <Button android:id="@+id/btok" style="?android:attr/buttonstylesmall" android:layout_height="wrap_content" android:text="đặt hàng" android:onclick="tongtien" /> </TableRow> <TableRow android:gravity="center" android:layout_gravity="center" android:id="@+id/tablerow5" android:layout_height="wrap_content" > <TextView android:layout_gravity="center" android:id="@+id/tvtong" android:layout_height="wrap_content" android:text="tổng tiền: " android:textappearance="?android:attr/textappearancelarge" /> </TableRow> </TableLayout> MainActivity package com.example.hoangquocviet.checkbox; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.checkbox; import android.widget.textview; public class MainActivity extends ActionBarActivity { @Override 89

protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //Phương thức tính tổng public void TongTien(View v) { int Tong = 0; //Khai báo điều khiển CheckBox cbcanh, cbdui, cbcom, cbkhac; TextView tv; // cbcanh = (CheckBox) findviewbyid(r.id.cbcanhgaran); cbdui = (CheckBox) findviewbyid(r.id.cbduigaran); cbcom = (CheckBox) findviewbyid(r.id.cbcombo); cbkhac = (CheckBox) findviewbyid(r.id.cbthucanphu); tv = (TextView) findviewbyid(r.id.tvtong); // if (cbcanh.ischecked()) { Tong = Tong + 89000; if (cbdui.ischecked()) { Tong = Tong + 92000; if (cbcom.ischecked()) { Tong = Tong + 156000; if (cbkhac.ischecked()) { Tong = Tong + 34000; // tv.settext(tong + ""); 7.6. Điều khiển RadioButton - Chức năng: dùng cho việc xử lý đơn lựa chọn. Android thường sử dụng loại điều khiến này để cho người dùng chọn một trong số các tùy chọn xác định nào đó. Điều khiển này phải sử dụng kết hợp với điều khiển RadioGroup. Nếu không sử dụng với điều khiển RadioGroup thì tại một thời điển chúng ta có thể lựa chọn tất cả các RadioButton (xem hình bên dưới): 90

- Một số thuộc tính thường dùng: o Checked: thuộc tính này nhận một trong hai giá trị true/false để đặt trạng thái cho điều khiển RadioButton. android:checked="true": Radio Button được chọn android:checked="false": Bỏ chọn Radion Button - Một số phương thức thường dùng: o setchecked: thiết lập trạng thái cho RadioButton setchecked (true): Radio Buton được check setchecked (false): Bỏ check điều khiển Radion Button o ischecked: kiểm tra xem trạng thái được check hay không. - Một số sự kiện thường dùng: o onclick: xảy ra khi click vào điều khiển RadioButton. - Ví dụ minh họa: Thiết kế một Layout có giao diện như sau: 91

Khi người dùng chọn một phương án trả lời nào thì hiển thị ra một thông báo bạn đã chọn phương án tương ứng: Hướng dẫn: english.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView 92

android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="present simple" android:id="@+id/textview2" android:layout_gravity="center_horizontal"/> <RadioGroup android:id="@+id/radiogroup1" android:layout_height="wrap_content" > <RadioButton android:layout_height="wrap_content" android:text="i lives in Hung Yen" android:onclick="clickevent" android:id="@+id/rbanswera" /> <RadioButton android:layout_height="wrap_content" android:text="i living in Hung Yen" android:onclick="clickevent" android:id="@+id/rbanswerb" /> <RadioButton android:layout_height="wrap_content" android:text="i lived in Hung Yen" android:id="@+id/rbanswerc" android:onclick="clickevent" android:checked="false" /> <RadioButton android:layout_height="wrap_content" android:text="i live in Hung Yen" android:onclick="clickevent" android:id="@+id/rbanswerd" /> </RadioGroup> </LinearLayout> MainActivity public class MainActivity extends ActionBarActivity { @Override 93

protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.english); public void ClickEvent(View v) { boolean b = ((RadioButton) v).ischecked(); // AlertDialog.Builder al=new AlertDialog.Builder(this); al.setmessage("radiobutton"); // switch (v.getid()) { case R.id.rbAnswerA: al.setmessage("you selected Answer A"); break; case R.id.rbAnswerB: al.setmessage("you selected Answer B"); break; case R.id.rbAnswerC: al.setmessage("you selected Answer C"); break; case R.id.rbAnswerD: al.setmessage("you selected Answer D"); break; al.create().show(); 94

7.7. Điều khiển Tab - Chức năng: giống điều khiển Tab Control trong C# cho phép ứng dụng Android làm việc trên nhiều tab khác nhau. - Một số khái niệm: o Tab=Tab Host = Tab Widgets + FrameLayout. Tab Host: Là Container chính chứa các Tab buttons và Tab contents Tab Widget: Để định dạng cho các Tab buttons : Nhãn, Icon (mỗi Tab trong TabWidget được gọi là TabSpec) FrameLayout: Là Container để chứa các layout cho Tab contents, ta chỉ có thể dùng FrameLayout cho Tab contents, không thể dùng các loại Layout khác - Ví dụ minh họa: Ví dụ minh họa: thiết kế trang đăng kí gồm 2 Tab có giao diện như bên dưới. Trong đó: o Tab 1: Form đăng kí tài khoản o Tab 2: Hiển thị các tài khoản đã được đăng kí (chỉ bao gồm ListView) 95

o Hướng dẫn: giải quyết yêu cầu trên theo 3 bước sau: Bước 1: Tạo ứng dụng Android Studio có cấu trúc như sau (3 layout và 1 Activity) Bước 2: Thiết kế các Layout có giao diện như sau main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TabHost 96

android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tabhost" android:layout_gravity="center_horizontal"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content"></tabwidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/tab1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include layout="@layout/tab1" /> </LinearLayout> <LinearLayout android:id="@+id/tab2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ></LinearLayout> <LinearLayout android:id="@+id/tab3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include layout="@layout/tab2" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout> 97

tab1.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:id="@+id/tablerow1" android:gravity="center" android:layout_height="wrap_content" > <TextView android:id="@+id/textview1" android:layout_height="wrap_content" android:text="đăng NHẬP" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:id="@+id/tablerow2" android:layout_height="wrap_content" > <TextView android:id="@+id/textview2" android:layout_height="wrap_content" android:text="tên ĐN:" /> <EditText android:id="@+id/txttendn" android:layout_height="wrap_content" android:ems="10" /> </TableRow> <TableRow android:id="@+id/tablerow3" android:layout_height="wrap_content" > 98

<TextView android:id="@+id/textview3" android:layout_height="wrap_content" android:text="mật khẩu:" /> <EditText android:id="@+id/txtmk" android:layout_height="wrap_content" android:ems="10" > <requestfocus /> </EditText> </TableRow> <TableRow android:id="@+id/tablerow4" android:gravity="center" android:layout_height="wrap_content" > <Button android:id="@+id/button1" android:onclick="login" android:layout_height="wrap_content" android:text="ok" /> </TableRow> </TableLayout> tab2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> 99

- Bước 3: Viết code gọi trong Activity MainActivity package com.example.hoangquocviet.tabcontrol; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.widget.button; import android.widget.tabhost; public class MainActivity extends ActionBarActivity { TabHost tb; Button bt; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // tb=(tabhost)findviewbyid(r.id.tabhost); tb.setup(); // TabHost.TabSpec tspec; tspec=tb.newtabspec("t1"); tspec.setcontent(r.id.tab1); tspec.setindicator("login"); tb.addtab(tspec); // tspec=tb.newtabspec("t2"); tspec.setcontent(r.id.tab2); tspec.setindicator("list"); tb.addtab(tspec); // tb.setcurrenttab(0); 100

BÀI 8: THẢO LUẬN/BÀI TẬP 02: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) BÀI 9. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) 9.1. Điều khiển TimePicker - Chức năng: điều khiển cho phép lựa chọn thời gian (giờ, phút). - Một số phương thức thường dùng: o getcurrenthour o getcurrentminute o setcurrenthour o setcurrentminute - Một số sự kiện thường dùng: o OnClick - Ví dụ minh họa: sinh viên tự viết. 9.2. Điều khiển TimePickerDialog - Chức năng: giống như điều khiển TimePicker nhưng điều khiển này chỉ được hiển thị khi được gọi đỡ tốn diện tích hơn so với điều khiển TimePicker Thường dùng điều khiển này hơn. - Một số sự kiện thường dùng: o OnTimeSet - Ví dụ minh họa: sinh viên tự viết. 101

9.3. Điều khiển DatePicker Gần giống với điều khiển TimerPicker, sinh viên tự nghiên cứu và tham khảo ví dụ giáo viên gửi. 9.4. Điều khiển DatePickerDialog Gần giống với điều khiển TimePickerDialog, sinh viên tự nghiên cứu và tham khảo ví dụ giáo viên gửi. Bài tập tổng hợp: Xây dựng ứng dụng quản lý công việc đơn giản: 102

BÀI 10: THỰC HÀNH 01: ỨNG DỤNG HELLO WORLD BÀI 11. SPINNER, LISTVIEW VÀ GRIDVIEW 11.1. Điều khiển Spinner - Chức năng: tương tự combobox trong C#. Cho phép người dùng lựa chọn từ một danh sách có sẵn được hiển thị ra khi người dùng nhấn chọn vào Combobox. - Một số sự kiện thường dùng: o ItemSelected: khi người dùng nhấn chọn 1 phần tử trong Spinner. - Ví dụ minh họa: o Yêu cầu giao diện: Thiết kế một layout có giao diện như sau: o Yêu cầu chức năng: Khi người dùng nhấn chọn một phần tử trong Spinner thì hiện thị phần tử chọn xuống TextView bên dưới. o Hướng dẫn: spinner.xml Layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview1" android:layout_gravity="center" android:layout_height="wrap_content" android:text="spinner" 103

android:textappearance="?android:attr/textappearancelarge" /> <Spinner android:id="@+id/spdemo" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#b4c3f2" /> <TextView android:id="@+id/textview2" android:layout_height="wrap_content" android:text="textview" /> </LinearLayout> MainActivity (file code) package com.example.hoangquocviet.spinner; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.spinner; import android.widget.textview; public class spinner1activity extends Activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.spinner1); //Khai báo mảng dữ liệu làm nguồn cho Spinner final String arr[] = { "Đặng Vân Anh", "Nguyễn Văn Quyết", "Nguyễn Minh Tiến"; //Lấy đối tượng Spinner và TextView Spinner spin = (Spinner) findviewbyid(r.id.spdemo); final TextView selection=(textview) findviewbyid(r.id.textview2); //Gán Data source (arr) vào Adapter ArrayAdapter<String> adapter = new ArrayAdapter<String> ( this, android.r.layout.simple_spinner_item, arr ); //Hiển thị danh sách cho Spinner 104

adapter.setdropdownviewresource (android.r.layout.simple_list_item_single_choice); //Thiết lập adapter cho Spinner spin.setadapter(adapter); //Viết sự kiện cho Spinner (Inline anonymous listener) spin.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() { @Override public void onitemselected(adapterview<?> parent, View view, int position, long id) { // TODO Auto-generated method stub selection.settext(arr[position]); ); @Override public void onnothingselected(adapterview<?> parent) { 11.2. Điều khiển ListView - Chức năng: Điều khiển ListView dùng hiển thị danh sách dữ liệu. - Một số sự kiện thường dùng: o ItemClick: xảy ra khi người dùng nhấn chọn 1 phần tử trong ListView. - Hiển thị dữ liệu vào ListView: Chúng ta có nhiều cách lấy dữ liệu đưa vào ListView: o Mảng dữ liệu (ví dụ: mảng String[] thông thường). o Dữ liệu được lưu trong tệp xml. o Lấy từ CSDL SQLite, tệp text. o - Chú ý: Cách hiển thị dữ liệu (các bước hiển thị dữ liệu) từ một nguồn dữ liệu (Mảng dữ liệu ) lên Spinner, ListView, GridView là hoàn toàn giống nhau. - Ví dụ minh họa 1: Thiết kế ứng dụng Android có giao diện như sau: 105

o Yêu cầu: Dữ liệu được lấy từ một mảng dữ liệu có sẵn. Khi người dùng nhấn vào một phần từ dưới ListView thì hiển thị chỉ số và giá trị của phần từ chọn lên TextView phía trên. o Hướng dẫn: các bạn có thể tham khảo code dưới đây: MainActivity @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.giaodien); //1. Khởi tạo dữ liệu cho mảng arr (còn gọi là data source) final String arr[]={"nguyễn Văn Quyết","Lê Thị Thu Hương"; //final String arr[]=getresources().getstringarray(r.array.mang);//mảng lấy từ file xml //2. Lấy đối tượng Listview dựa vào id ListView lv=(listview) findviewbyid(r.id.lvdemo); final TextView tv=(textview)findviewbyid(r.id.tvtest); //3. Gán Data source vào ArrayAdapter ArrayAdapter<String>adapter=new ArrayAdapter<String> (this,android.r.layout.simple_list_item_1, arr); //4. Đưa Data source vào ListView lv.setadapter(adapter); //5. Sự kiện lv.setonitemclicklistener( new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> arg0, View arg1,int arg2,long arg3) { //đối số arg2 là vị trí phần tử trong Data Source (arr) tv.settext("position :"+arg2+";value ="+arr[arg2]); ); 106

- Ví dụ minh họa 2: Thiết kế ứng dụng Android có giao diện như sau: o Yêu cầu: Lấy dữ liệu từ EditText đưa vào ListView Xóa dữ liệu từ ListView o Hướng dẫn: Các bạn tham khảo code dưới: MainActivity //KHAI BÁO CÁC BIÊN TOÀN CỤC (BÊN NGOÀI ON-CREATE) EditText txtten; Button btn; ListView lv; ArrayList<String>arrList=null; ArrayAdapter<String> adapter=null //VIẾT TRONG FORM_LOAD (ON CREATE) txtten=(edittext) findviewbyid(r.id.txthoten); lv=(listview) findviewbyid(r.id.listview1); //1. Tạo ArrayList object arrlist=new ArrayList<String>(); //2. Gán Data Source (ArrayList object) vào ArrayAdapter adapter=new ArrayAdapter<String> (this,android.r.layout.simple_list_item_1,arrlist); //3. gán Adapter vào ListView lv.setadapter(adapter); btn=(button) findviewbyid(r.id.btok); //4. Xử lý sự kiện nhấn nút Nhập btn.setonclicklistener(new View.OnClickListener() { public void onclick(view arg0) { arrlist.add(txtten.gettext()+""); adapter.notifydatasetchanged(); ); //5. Xử lý sự kiện chọn một phần tử trong ListView lv.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick( 107

AdapterView<?> arg0,view arg1, int arg2,long arg3) { ); 11.3. Điều khiển GridView - Chức năng: hiển thị danh sách dữ liệu theo hàng và cột - Một số thuộc tính thường dùng: o android:numcolumns="3": hiển thị số cột trong GridView. - Một số sự kiện thường dùng: - Chú ý: o onitemclick: xảy ra khi người dùng nhấn chọn 1 phần tử trong GridView. o Việc lấy dữ liệu làm nguồn cho Spinner, ListView, GridView tương tự nhau. o Việc thêm, sửa, xóa dữ liệu trong Spinner, ListView, GridView tương tự nhau sử dụng ArrayList. - Ví dụ minh họa: hiển thị dữ liệu lên GridView MainActivity //Dùng mảng 1 chiều hoặc ArrayList để lưu một số dữ liệu final String arr[]={"dell","hp","mac","samsung","acer","asus"; //Tối tượng này dùng để hiển thị phần tử được chọn trong GridView final TextView selection=(textview)findviewbyid(r.id.tvdienthoai); final GridView gv=(gridview) findviewbyid(r.id.gridview1); //Gán DataSource vào ArrayAdapter ArrayAdapter<String>da=new ArrayAdapter<String> ( this,android.r.layout.simple_list_item_1, arr ); //gán Datasource vào GridView gv.setadapter(da); //Thiết lập sự kiện cho GridView, gv.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { //Hiển thị phần tử được chọn trong GridView lên TextView selection.settext(arr[arg2]); ); 108

BÀI 12: THỰC HÀNH 02: ANDROID LAYOUT BÀI 13: THẢO LUẬN/BÀI TẬP 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 14: THỰC HÀNH 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) BÀI 15. LÀM VIỆC VỚI MENU 15.1. Option menu 15.1.1. Chức năng: Dùng thiết kế các tùy chọn cho một ứng dụng Android. Menu khá hữu ích trong lập trình Android. 15.1.2. Cách hiển thị Menu: Làm thế nào để hiển thị Menu trong Android? - Đối với máy ảo: bạn chỉ việc nhấn vào Nút Menu: - Đối với máy thật: Tùy theo dòng máy. Ví dụ với Samsung Galaxy S3 của mình bạn chỉ việc nhấn vào nút menu bên trái: 109

15.1.3. Ví dụ minh họa: - Yêu cầu: Thiết kế ứng dụng có giao diện đơn giản bên dưới: Khi người dùng nhấn vào Button Menu trên máy ảo (hoặc máy thật) sẽ hiển thị menu có 3 menu con (Đỏ, Vàng, Xanh), khi nhấn vào mỗi menu con hiển thị ra MessageBox tương ứng. - Chú ý: các giá trị menu trong Android được lưu trữ trong tệp xml. Được lưu trong thư mục menu của ứng dụng Android Studio. - Hướng dẫn thực hiện: 110

o Bước 1: Tạo dự án Android Studio có cấu trúc như sau: o Bước 2: Tạo menu. Tạo tệp xml trong thư mục và đặt tên là main.xml (như bên trên) theo các bước Nhấn chuột phải vào thư mục menu trong ứng dụng Android và chọn như hình bên dưới: 111

Nội dung tệp main.xml khi mới được tạo ra Tạo 3 mục menu (hay nhiều mục menu tùy theo ứng dụng của các bạn) bằng các thẻ item như bên dưới - Bước 3: Gọi các menu hiển thị: Tạo file xml menu như ở mục 2 là chưa đủ, nếu bây giờ chạy ứng dụng và nhấn mục menu trên máy ảo cũng không hiển thị các menu Đỏ, Vàng, Xanh như yêu cầu. Để gọi các menu chúng ta cần 112

viết phương thức oncreateoptionsmenu (phương thức này được mặc định tạo ra khi bạn tạo một Project Android) - Bước 4: Viết code việc xử lý khi nhấn vào mỗi menu (Nhấn vào Đỏ, Vàng, Xanh). Chúng ta chỉ cần viết trong phương thức onoptionsitemselected (phương thức này được mặc định tạo ra khi bạn tạo một Project Android) MainActivity package com.example.hoangquocviet.menu; import android.app.alertdialog; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; public class MainActivity extends ActionBarActivity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); @Override public boolean oncreateoptionsmenu(menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; @Override public boolean onoptionsitemselected(menuitem item) { AlertDialog.Builder al=new AlertDialog.Builder(this); al.settitle("menu"); switch(item.getitemid()) { 113

case R.id.itemDo: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu ĐỎ!"); break; case R.id.itemVang: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu VÀNG!"); break; case R.id.itemXanh: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu XANH!"); break; al.create().show(); return super.onoptionsitemselected(item); 15.2. Context menu 15.2.1. Chức năng: ContextMenu hay menu ngữ cảnh là menu được hiển thị ra khi ta nhấn và giữ vào một điều khiển (trong lập trình Windows thì để hiển thị ContextMenu chúng ta chỉ cần nhấn chuột phải vào một đối tượng nào đó). 15.2.2. Ví dụ minh họa: - Yêu cầu: Thiết kế ứng dụng Android có giao diện như sau: Khi người dùng nhấn (và giữ) button CONTEXT MENU thì hiển thị Context Menu có giao diện như sau: 114

Khi người dùng nhấn vào Menu Xanh, Đỏ, Vàng thì thay đổi mầu chữ (TextColor) của Button CONTEXT MENU thành mầu tương ứng (Màu xanh, đỏ, vàng). - Hướng dẫn: o Bước 1: Tạo dự án Android Studio có cấu trúc như sau: 115

o Bước 2: Thiết kế giao diện cho ứng dụng (Layout activity_main.xml) activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btcontextmenu" android:layout_gravity="center" android:layout_width="302dp" android:layout_height="wrap_content" android:text="context Menu" /> <TextView android:id="@+id/tvcontext" android:layout_gravity="center" android:gravity="center" android:layout_width="278dp" android:layout_height="wrap_content" android:text="hoàng QUỐC VIỆT" android:textappearance="?android:attr/textappearancelarge" /> </LinearLayout> o Bước 3: Thiết kế các mục menu (tương tự bước 2 ở mục option menu) menu\manu_main.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".mainactivity"> <item android:id="@+id/itemxanh" android:title="xanh"></item> <item android:id="@+id/itemdo" android:title="đỏ"></item> <item android:id="@+id/itemvang" android:title="vàng"></item> </menu> 116

o Bước 4: Định nghĩa giá trị màu (values\contextmenuvalues.xml). Để định nghĩa các giá trị màu trong Android chúng ta làm như sau: nhấn chuột phải vào thư mục values và chọn như hình bên dưới: Nội dung file contextmenuvalues.xml ban đầu: 117

dưới: Định nghĩa các màu bằng thẻ color trong tệp contextmenuvalues.xml như bên o Bước 5: Gọi các menu hiển thị: Tạo file xml menu như ở bước 3 là chưa đủ, nếu bây giờ chạy ứng dụng và nhấn và giữ button CONTEXT MENU thì cũng không hiển thị các menu Đỏ, Vàng, Xanh như yêu cầu. Để hiển thị được các menu chúng ta cần viết trong phương thức oncreatecontextmenu o Bước 6: Viết code việc xử lý khi nhấn vào mỗi menu (Nhấn vào Đỏ, Vàng, Xanh. Chúng ta chỉ cần viết trong phương thức oncontextitemselected. MainActivity package com.example.hoangquocviet.contextmenu; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.contextmenu; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.textview; public class MainActivity extends ActionBarActivity { Button btncontext; TextView tvcontextdemo; 118

@Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // btncontext = (Button) findviewbyid(r.id.btcontextmenu); tvcontextdemo = (TextView) findviewbyid(r.id.tvcontext); // registerforcontextmenu(btncontext); registerforcontextmenu(tvcontextdemo); // @Override public void oncreatecontextmenu(contextmenu menu, View v, ContextMenu.ContextMenuInfo menuinfo) { //super.oncreatecontextmenu(menu, v, menuinfo); getmenuinflater().inflate(r.menu.menu_main, menu); @Override public boolean oncontextitemselected(menuitem item) { switch (item.getitemid()) { case R.id.itemDo: btncontext.settextcolor(getresources().getcolor(r.color.do)); break; case R.id.itemVang: btncontext.setbackgroundcolor(getresources().getcolor(r.color.vang)); break; case R.id.itemXanh: btncontext.settextcolor(getresources().getcolor(r.color.xanh)); break; return super.oncontextitemselected(item); 119

BÀI 16: THỰC HÀNH 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 17: THẢO LUẬN/BÀI TẬP 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 18: THỰC HÀNH 05: SPINNER, LISTVIEW, GRIDVIEW BÀI 19. LẬP TRÌNH CSDL VỚI SQLITE (1) 19.1. Giới thiệu SQLite 19.1.1. SQLite là gì? Nói một cách đơn giản SQLite là phần mềm quản lý cơ sở dữ liệu (DBMS) tương tự như Mysql, PostgreSQL... Đặc điểm của SQLite là gọn, nhẹ, đơn giản. Chương trình gồm 1 file duy nhất vỏn vẹn chưa đến 500kB, không cần cài đặt, không cần cấu hình hay khởi động mà có thể sử dụng ngay. Dữ liệu database cũng được lưu ở một file duy nhất. Không có khái niệm user, password hay quyền hạn trong SQLite database. SQLite không thích hợp với những hệ thống lớn nhưng ở quy mô vừa tầm thì SQLite phát huy uy lực và không hề yếu kém về mặt chức năng hay tốc độ. Với các đặc điểm trên SQLite được sử dụng nhiều trong việc phát triển, thử nghiệm v..v.. và là sự lưa chọn phù hợp cho những người bắt đầu học database. Một vài nét chính: - Cơ sở dữ liệu dạng quan hệ (RDBMS), hỗ trợ chuẩn SQL-92 - Sử dụng dưới dạng thư viện nhúng, không chạy ở theo kiểu server độc lập - Hỗ trợ các ngôn ngữ phổ biến: C, C++, C#, Basic, Perl, Python, PHP, Java... - Không cần chỉ định kiểu dữ liệu (SQLite is typeless) - Hỗ trợ UTF8 - Hỗ trợ transaction - Hỗ trợ view - Có các công cụ quản lý bằng đồ hoạ (xem chi tiết ở dưới) - Download & sử dụng miễn phí -... - Trang chủ SQLite: http://www.sqlite.org 19.1.2. Có sử dụng được các câu lện SQL trong SQLite hay không? SQLite là một CSDL vì vậy có thể sử dụng tất cả các câu lệnh SQL để thao tác trên CSDL SQLite này: Select, insert, update, delete... 19.1.3. Có thể sử dụng C# để thao tác với CSDL SQLite hay không? 120

Trả lời: Chắc chắn là được rồi. SQLite là một CSDL (giống như CSDL Access trước đâu - chỉ bao gồm 1 file), vì vậy có thể sử dụng C# (Windows Form) để thao tác với CSDL này. Làm thế nào thì bạn cứ Google là ra thôi (học tin học phải quan liện Google là bạn thân nhất của bạn) 19.1.4. Tạo cơ sở dữ liệu SQLite bằng cách nào? Có ít nhất 3 cách tạo CSDL SQLite. Mình giới thiệu từng cách theo mức độ thường xuyên sử dụng: - Cách 1: Sử dụng Add in của firefox (mình hay dùng cách này nhất) - Cách 2: Dùng công cụ SQLite Admin (phần mềm nhỏ) - Cách 3: Dùng câu lệnh SQL tạo CSDL Mình hướng dẫn cụ thể theo từng cách: - Cách 1: Sử dụng Add on của firefox (mình hay dùng cách này) sau: Các bạn có thể cài đặt Add on cho firefox để thao tác với SQLite theo các bước bên dưới. Vào Google và gõ add on sqlite (hay đại loại như vậy). Kết quả hiển thị ra như 121

Manager Sau khi cài xong, để sử dụng công cụ này chúng ta vào Tools SQLite Giao diện của công cụ SQLite Manager 122

Lưu CSDL SQLite trong ổ D. Sau khi nhấn Select Folder các bạn mở ổ D ra sẽ thấy CSDL có tên UTEHY.sqlite được lưu trong ổ D:\ 123

Đến đây thì chúng ta thiết kế các bảng CSDL như bình thường. - Cách 2: Dùng công cụ SQLite Admin Trước hết các bạn vào Google và gõ SQLite Admin, sau đó tải công cụ SQLite Administrator về máy. Đây là công cụ khá nhẹ (khoảng vài MB, chạy Portable không cần cài đặt). Giao diện của công cụ SQLite Administrator dùng để tạo CSDL: 124

Việc tạo và sử dụng công cụ này khá đơn giản. Các bạn sinh viên khoa CNTT UTEHY năm thứ 4 có thể tự tìm hiểu được. s3db CSDL được tạo ta bởi SQLite Administrator có đuôi mở rộng là.s2db hoặc - Cách 3: Dùng câu lệnh SQL Câu lệnh tạo bảng CSDL, Select, insert, update, delete...tương tự như các câu lệnh SQL thông thường mà các bạn đã được học trong môn SQL Server Câu lệnh tạo bảng CREATE TABLE [tbtaikhoan] ( [TenDangNhap] VARCHAR(20) NOT NULL PRIMARY KEY, [MatKhau] VARCHAR(20) NOT NULL, ) 19.2. Cách tạo và lưu trữ CSDL SQLite trong một project Android Studio Một câu hỏi đặt ra với các bạn mới lập trình SQLite với Android là CSDL SQLite, hay cụ thể hơi nữa là file CSDL SQLite được để ở đâu trong project Android Studio để chúng ta có thể thao tác với CSDL này phục vụ cho bài toán của chúng ta? Chúng ta cần biết đường dẫn lưu CSDL SQLite để làm gì? 125

Để thao tác với bất kì CSDL nào chúng đều cần biết "địa chỉ" của CSDL để kết nối (nói chuyện) và thao tác, với SQL Server chúng ta cần biết địa chỉ (tên) Server...vì vậy với SQLite chúng ta cần phải biết file SQLite được lưu ở đâu để còn kết nối và thao tác. Tổng quát: dù chúng ta thao tác trên mý ảo hay máy thật thì CSDL SQLite luôn được lưu trên một đường dẫn tổng quát sau trên bộ nhớ: "/data/data/tên_package/databases/tên_database" Trong đó: - Tên_Database: Tên CSDL của bạn tạo ra - Tên_Package: tên package của ứng dụng của bạn, tên package được tạo ra khi bạn tạo ứng dụng Android. Ví dụ: Chúng ta đã biết CSDL được lưu ở đâu rồi, vậy trên thực tế trong một project Android Studio thì CSDL được lưu ở đâu và làm thế nào để lưu được CSDL vào đấy mà thao tác? Trên thực tế để thao tác với SQLite trong một project Android Studio người ta làm như sau: - Bước 1: Tạo CSDL SQLite và các bảng bằng 1 trong 3 cách ở trên. - Bước 2: Copy file CSDL SQLite vào thư mục assets trong project Android Stdudio (tài nguyên lưu trong thư mục assets của project Android studio là ReadOnly nên không thao tác thêm, sửa, xóa được). - Bước 3: Sử dụng code (viết phương thức) copy file SQLite trên vào đường dẫn 126

"/data/data/tên_package/databases/tên_database" và thao tác. Mình sẽ hưỡng dẫn chi tiết từng bước ở bên dưới thông qua ví dụ cụ thể. 19.3. Các bước làm việc với SQLite trong Android Để làm việc với CSDL SQLite nói riêng hay làm việc với các CSDL nói chung (SQL Server, Access, Oracle...) chúng ta phải trải qua 3 bước: - Bước 1: Mở kết nối đến Database. - Bước 2: Thao tác với CSDL đó: lấy về tổng số bản ghi, select, insert, update, delete - Bước 3: Đóng kết nối. 127

BÀI 20: THỰC HÀNH 06: LÀM VIỆC VỚI MENU VÀ CONTEXT MENU BÀI 21: THẢO LUẬN/BÀI TẬP 05: LẬP TRÌNH CSDL VỚI SQLITE BÀI 22: THỰC HÀNH 07: LẬP TRÌNH CSDL VỚI SQLITE BÀI 23. LẬP TRÌNH CSDL VỚI SQLITE (2) 23.1. Các đối tượng làm việc với CSDL SQLite - Thư viện làm việc với CSDL SQLite trong Android: android.database.sqlite.sqlitedatabase - Các đối tượng thao tác với CSDL SQLite trong Android: trong Android để thao tác với CSDL SQLite (Tạo CSDL, mở kết nối đến CSDL, thao tác với CSDL, đóng kết nối ) chúng ta chỉ cần sử dụng đối tượng SQLiteDatabase là đủ. Một số phương thức của đói tượng này: o execsql: thực thi câu lệnh SQL. o rawquery: trả về đối tượng Cursor cho phép đọc database (tương tự đối tượng sqldatareader trong C#) 23.2. Thao tác với CSDL SQLite Mình minh họa bài phần lập trình CSDL bằng bài toán cụ thể sau: Bài toán QUẢN LÝ TÀI KHOẢN: - Yêu cầu CSDL: tạo CSDL UTEHY.sqlite bao gồm 1 bảng tbtaikhoan (TenDN, MatKhau), sau đó nhập 2 bản ghi đại diện - Yêu cầu giao diện: Thiết kế ứng dụng Android có giao diện như sau: 128

- Yêu cầu chức năng: o Khi ứng dụng được chạy thì hiển thị các bản ghi trong CSDL lên ListView. o Khi người dùng nhấn một bản ghi dưới ListView thì hiển thị thông tin tương tứng vào 2 EditText tương ứng ở trên: Tên đăng nhập và mạt khẩu. o Khi người dùng nhấn button: THÊM, SỬA, XÓA thì thực hiện các chức năng tương ứng. Hướng dẫn thực hiện: bài toán giải quyết qua 5 bước sau: - Bước 1: Tạo CSDL và tạo bảng Việc tạo CSDL và tạo bảng khá đơn giản bằng công cụ Add on trên firefox, mình cũng đã hướng dẫn rồi. Tạo CSDL UTEHY.sqlite và lưu vào trong ổ D:\. Sau đó tạo bảng tbtaikhoan (TenDN, MatKhau) 129

130

131

- Bước 2: Tạo project DatabaseDemo và thiết kế giao diện. Tạo project Android Studio và đặt tên là DatabaseDemo, cấu trúc project khi mới được tạo ra (chú ý: project mới tạo ra chưa có thư mục assets để lưu SQLite). Thiết kế ứng dụng có cấu trúc như sau: Thiết kế Layout account.xml. Cấu trúc account.xml: 132

account.xml <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchcolumns="*" > <TextView android:id="@+id/tvtaikhoan" android:layout_height="wrap_content" android:gravity="center" android:text="quản LÝ TÀI KHOẢN" android:textappearance="?android:attr/textappearancelarge" /> <TableRow android:id="@+id/tablerowtendangnhap" android:layout_height="wrap_content" > <TextView android:id="@+id/tvtendangnhap" android:layout_height="wrap_content" android:text="tên đăng nhập: " /> <EditText android:id="@+id/edttendangnhap" android:layout_height="wrap_content" android:ems="10" > <requestfocus /> </EditText> </TableRow> <TableRow android:id="@+id/tablerowmatkhau" android:layout_height="wrap_content" > <TextView android:id="@+id/tvmatkhau" android:layout_height="wrap_content" android:text="mật khẩu: " /> <EditText android:id="@+id/edtmatkhau" 133

android:layout_height="wrap_content" android:inputtype="textpassword" android:ems="10" android:layout_column="1" /> </TableRow> <LinearLayout android:layout_height="wrap_content" android:orientation="vertical" > <TableRow android:id="@+id/tablerowbutton" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:id="@+id/btthem" android:layout_height="wrap_content" android:onclick="insertdb" android:text="thêm" /> <Button android:id="@+id/btsua" android:layout_height="wrap_content" android:onclick="updatedb" android:text="sửa" /> <Button android:id="@+id/btxoa" android:layout_height="wrap_content" android:onclick="deletedb" android:text="xóa" /> </TableRow> <ListView android:id="@+id/lvdanhsachtaikhoan" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> </TableLayout> 134

- Bước 3: Copy CSDL SQLite vào thư mục assets trong project Thư mục assets không có sẵn khi project được tạo ra. Để thêm thư mục này chúng ta làm như sau: Để copy CSDL UTEHY.sqlite vào thư mục assests bạn chỉ việc file UTEHY.sqlite và nhấn Copy (Ctrl + C) sau đó nhấn chọn thư mục assets và nhấn Ctrl+V là xong: 135

- Bước 4: Viết lớp chuyên thao tác với CSDL (mình đặt tên lớp là DatabaseHandler) các bạn chú ý các phương thức viết trong lớp này. Sau bước 3 bạn có CSDL UTEHY.sqlite trong thư mục assets, bây giờ việc của chúng ta là thao tác với CSDL này. Để thao tác với CSDL người ta viết ra một lớp chuyên thao tác với CSDL này (lớp này mình đặt là DatabaseHandler) Để thêm lớp DatabaseHandler vào project chúng ta làm như sau: Nhấn chuột phải vào package của project chọn New chọn Java Class như hình vẽ: 136

DatabaseHandler package com.example.hoangquocviet.databasedemo; import android.app.alertdialog; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import android.widget.toast; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.arraylist; /** * Created by Hoang Quoc Viet on 18-07-2015. */ public class DatabaseHandler extends SQLiteOpenHelper { 137