1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng ứng dụng đa phương tiện cho Mobile sử dụng hệ điều hành Android

112 530 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 112
Dung lượng 3,77 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đối với Window Mobile là một công nghệ của Microsoft và hoàn toàn đóng đối với người dùng, nhà phát triển ứng dụng chỉ dựa hoàn toàn vào công nghệ mà Microsoft cung cấp, còn Symbian thì

Trang 1

Ngày Tháng Năm

Giảng Viên Hướng Dẫn

( Ký, ghi rõ họ và tên )

Trang 2

Ngày Tháng Năm

Giảng Viên Phản Biện

( Ký, ghi rõ họ và tên )

Trang 3

Chúng em xin chân thành cảm ơn khoa Công Nghệ Thông Tin trường Đại Học

Sư Phạm Kỹ Thuật Tp.HCM đã tạo điều kiện cho chúng em thực hiện đề tài này

Chúng em xin chân thành cảm ơn Thầy Nguyễn Trần Thi Văn đã tận tình hướng dẫn, chỉ bảo chúng em trong suốt quá trình thực hiện đề tài

Chúng em xin chân thành cám ơn quý Thầy Cô trong Khoa đã tận tình giảng dạy, trang bị cho chúng em những kiến thức quý báu trong những năm học vừa qua

Chúng con xin nói lên lòng biết ơn sâu sắc đối với Ông Bà, Cha Mẹ đã chăm sóc, nuôi dạy chúng con thành người

Xin chân thành cám ơn các anh chị và bạn bè đã ủng hộ, giúp đỡ và động viên chúng em trong thời gian học tập và nghiên cứu

Trong phạm vi khả năng cho phép, chúng em đã rất cố gắng để hoàn thành đề tài một cách tốt nhất Song, chắc chắn sẽ không tránh khỏi những thiếu sót Chúng em kính mong nhận được sự cảm thông và những ý kiến đóng góp của quý thầy cô và các bạn

Nhóm sinh viên thực hiện Châu Duy Thiện

Vũ Thùy Linh

Lê Quốc Tiến

Trang 5

MỞ ĐẦU

Từ trước tới nay, mỗi khi nhắc tới các công nghệ di động, hay các thiết bị điện tử, thì đa phần mọi người đều nghĩ tới những ứng dụng nhúng, tức là ứng dụng được viết sẵn và chỉ chạy trên nền thiết bị đó mà thôi Nhưng những năm gần đây, khi các thiết

bị điện tử, đặc biệt là các thiết bị cá nhân di động như: điện thoại, máy trợ giúp cá nhân kỹ thuật số, …ngày càng trở nên phổ biến và càng ngày càng trở nên cá nhân hóa trong mục đích sử dụng Điều này, làm nảy sinh nhiều vấn đề, trong đó, có một yêu cầu bức thiết đó là việc có thể thêm vào các thiết bị này những phần mềm ứng dụng mới, bởi vì những ứng dụng được thiết kế sẵn theo máy đã không còn đáp ứng được nhu cầu ngày càng đa dạng của người sử dụng

Chính vì điều này, mà hàng loạt những công nghệ đã ra đời nhắm đáp ứng những nhu cầu trên, như:

Công nghệ JAVA được tích hợp trên các thiết bị cầm tay, công nghệ này cho phép người dùng cài thêm những ứng dụng mới, những tiện ích mới cho thiết bị cá nhân của họ Tuy nhiên, công nghệ JAVA nhúng này, lại gặp một nhược điểm đó là quá phụ thuộc vào nền tảng phần cứng và phần cứng phải hỗ trợ thì mới thực hiện được, tức là rất hạn chế việc sử dụng phần cứng của máy, mà hầu như là không sử dụng được, trong việc viết chương trình Thí dụ: một máy điện thoại hỗ trợ công nghệ JAVA nhưng chỉ cho phép sử dụng tài nguyên hạn chế, như: cho phép truy xuất dữ liệu thể bộ nhớ nhưng không cho phép chặn cuộc gọi hay truy cập vào danh bạ của máy

Đối với những máy có sử dụng hệ điều hành như Window Mobile, Symbian… Các hệ điều hành này phần nào cũng gây ít nhiều khó khăn cho những ai có ý định xây dựng các ứng dụng trên nó Đối với Window Mobile là một công nghệ của Microsoft

và hoàn toàn đóng đối với người dùng, nhà phát triển ứng dụng chỉ dựa hoàn toàn vào công nghệ mà Microsoft cung cấp, còn Symbian thì việc cấu hình để có thể lập trình trên nó cũng vô vàn khó khăn, đặc biệt là nó sử dụng ngôn ngữ C/C++ để làm nền tảng lập trình rõ ràng là không thuận tiện trong việc phát triển ứng dụng

Xuất phát từ nhu cầu thực tế đó, Google đã mạnh dạn nghiên cứu và đưa ra một nền tảng hệ điều hành mới, đó chính là Android Một nền tảng hệ điều hành mã nguồn

mở hoàn toàn và dựa hoàn toàn vào một ngôn ngữ lập trình rất mạnh là JAVA để phát triển ứng dụng Chính vì Android hỗ trợ JAVA ngay từ trong nền tảng của nó, nên việc viết ứng dụng, ngay cả sử dụng các chức năng của phần cứng là hoàn toàn dễ dàng thông qua việc sử dụng bộ công cụ hỗ trợ lập trình được cung cấp hoàn toàn miễn phí, là Android SDK

Nhóm nghiên cứu nhận thấy, đây chính là nền tảng ứng dụng có thể phát triển trong tương lai, hoàn toàn có thể là đối trọng nặng ký của các nền tảng hệ điều hành đã

Trang 6

có trước đây, như Window Mobile, Symbian … Chính vì thế, nhóm đã chọn đề tài:

Tìm hiểu và viết ứng dụng trên nền hệ điều hành mobile Android Với hy vọng sẽ

bước đầu tìm hiểu, nắm bắt và làm chủ được công nghệ mới cho tương lai của các thiết

bị di động

Nhưng vì thời gian, cũng như năng lực của nhóm có hạn, cho nên chỉ giới hạn ở việc tìm hiểu cách thức hoạt động, nghiên cứu cơ bản các chức năng và sử dụng bộ công cụ Android SDK để thiết kế một ứng dụng mục đích nghiệm thu quá trình nghiên cứu, đó là chương trình chỉnh sửa ảnh trên điện thoại có cài hệ điều hành Android

Đề tài bao gồm 3 phần:

Phần A: Hệ điều hành android

Chương 1: Tổng quan Android và SDK

Chương 2: Applications and Activities

Chương 3: User Interfaces

Chương 4: Intents

Chương 5: Data Storage

Chương 6: Working in the Background

Phần B: Chương trình minh họa - Chương trình chỉnh sửa ảnh

Chương 7: Thiết kế chương trình

Phần C: Kết luận

Phụ lục: Hướng dẫn cài đặt, sử dụng.

Trang 7

NỘI DUNG

Phần A: Hệ điều hành android

CHƯƠNG 1: TỔNG QUAN VỀ ANDROID VÀ ANDROID SDK

1.1 Giới thiệu

1.1.1 Giới thiệu về Android

Hiện nay có rất nhiều hệ điều hành trên các thiết bị di động Nổi tiếng phải kể đến

là Window Mobile và Symbian Cả hai hệ điều hành này phần nào cũng gây ít nhiều khó khăn cho những ai có ý định xây dựng các ứng dụng trên nó Đối với Window mobile là một công nghệ của Microsoft và hoàn toàn đóng đối với người dùng, còn Symbian thì việc cấu hình để có thể lập trình trên nó cũng vô vàn khó khăn, đặc biệt nếu lựa chọn C/C++ là ngôn ngữ lập trình trên Symbian thì đúng là một thách thức Trước tình hình đó thì Google đã có một tham vọng, họ muốn việc lập trình trên chiếc điện thoại di động là dễ dàng với một ngôn ngữ nổi tiếng là JAVA, một hệ điều hành

có khả năng chạy trên nhiều dòng điện thoại Với ý định này thì vào ngày 11/11/2007, phiên bản hệ điều hành đầu tiên có tên gọi là Android của Google và chủ yếu dựa trên nhân Linux phiên bản 2.6 đã ra đời

Android được thiết kế sao cho các nhà phát triển có thể tận dụng tối đa lợi thế của thiết bị cầm tay để xây dựng nên các ứng dụng thực sự thuyết phục Android hoàn toàn

là một hệ điều hành mở Một ứng dụng có thể gọi thực hiện các chức năng lõi trong điện thoại như thực hiện cuộc gọi, gửi tin nhắn SMS, dùng camera … Các nhà phát triển có thể làm bất cứ việc gì trên thiết bị Android Bởi vì hệ thống Android giao tiếp thông qua các Intents – nó đơn giản là một chuỗi mô tả một hành động nào đó – ví dụ:

“android.provider.Telephony.SMS_RECEIVED” Với Android, các nhà phát triển còn

có khả năng chia sẻ thông tin cá nhân lên trang Web ví dụ như thông tin liên lạc, vị trí địa lí, lịch biểu…

Android còn cung cấp sẵn các dịch vụ định vị (và đây là một thế mạnh của Google) cùng với một tập các ứng dụng về “Map” với các tính năng rất ấn tượng như

dò đường, tính khoảng cách địa điểm, tìm bạn… Google còn dự định tích hợp các dịch

vụ sẵn có của hãng lên Android, trong đó phải kể đến Google Maps, dịch vụ bản đồ trực tuyến từ lâu đã rất quen thuộc với chúng ta, người dùng sẽ thực sự bị thuyết phục bởi các ứng dụng độc đáo này Ngoài ra còn có một số tính năng nổi bật khác như Animation và đồng thời cũng hỗ trợ media-playback.

Trang 8

Để có thể phát triển các ứng dụng thì không thể không nói đến máy ảo Máy ảo của Android có tên là Dalvik, chiếc máy ảo dựa trên việc đăng kí (register-based) và được thiết kế bởi Dan Bornstein và một vài kĩ sư của Google Thuật ngữ “register-based” đã nói lên sự khác biệt giữa máy ảo Android với máy ảo JAVA thông thường Tương tự như máy ảo JAVA, đây cũng chỉ là một máy ảo thông dịch, nhưng thông dịch các file có định dạng dex (Dalvik Execute) – một định dạng giúp tối ưu bộ nhớ

và khả năng lưu trữ của máy ảo – Các máy ảo JAVA ngày nay chủ yếu dựa trên ngăn xếp (Stack-based), còn máy ảo Android thì khác dựa trên việc đăng kí (Register-based), với tính chất này cho phép rút ngắn thời gian thực thi chương trình

Android cũng cung cấp một tập các giao diện dòng lệnh để ta có thể kiểm soát máy ảo mà không cần đến giao diện đồ họa Ta có thể kết nối, chuyển cổng, cấu hình mạng, gọi điện, gửi tin nhắn, tạo thẻ nhớ, dò lỗi… tất cả chỉ thông qua dòng lệnh mà không cần cài đặt thêm bất cứ một IDE nào khác Điều bất tiện ở đây là ta phải nhớ tất

cả các cú pháp cho từng nhu cầu cụ thể

Có thể nói rằng Android đã cung cấp cho chúng ta khá đầy đủ các công cụ cơ bản, giúp các nhà phát triển có thể tự xây dựng các ứng dụng cho riêng mình một cách

dễ dàng Trong tương lai có thể nói Android là một đối thủ khá nặng kí đối với Symbian và Window Mobile, vốn đã là các hệ điều hành nổi tiếng

Cấu trúc của Android

1.1.2 Giới thiệu về Android SDK

Song song với việc giới thiệu nền tảng hệ điều hành mới Android, Google cũng

đã giới thiệu cho người dùng bộ công cụ phát triển ứng dụng Android SDK cho hệ điều hành này Đây là công cụ giả lập thiết bị ảo trên máy tính để phát triển ứng dụng

Trang 9

với các hàm API hỗ trợ cho những lập trình viên lập trình trên các thiết bị di động sử dụng nền tảng Android thông qua ngôn ngữ lập trình Java.

Android SDK cung cấp đầy đủ mọi thứ cần thiết dùng để lập trình, kiểm tra và gỡ lỗi các chương trình ứng dụng Android, như:

•Android APIs: phần nhân của SDK là thư viện Android API, trong đó chứa thư viện mà các nhà phát triển dùng để tạo ra các ứng dụng Android Native (tức là các ứng dụng đã được thiết kế sẵn đóng gói cùng với hệ điều hành)

•Bộ công cụ phát triển: để chuyển mã nguồn thành các ứng dụng chạy theo chuẩn của Android Nó cũng cung cấp các công cụ để biên dịch và gỡ lỗi cho chương trình

•Bộ giả lập Android: bộ giả lập này có đầy đủ các chức năng y như là mô hình thật và nó làm việc như một thiết bị Android thực sự Vì thế, bộ giả lập này là công cụ môi trường Android tuyệt vời, dùng để thử nghiệm các ứng dụng của Android mà không phụ thuộc vào phần cứng

•Documentation: trong bộ Android SDK cung cấp sẵn một hệ thống hướng dẫn, trong đó giải thích về cách sử dụng và làm việc của tất cả các đối tượng được hỗ trợ như: các lớp chức năng, các phương thức trong các lớp đó … (với tính năng gần tương

tự như bộ MSDN của Microsoft)

•Sample code: đây là các đoạn mã mẫu và một vài ứng dụng được thiết kế hoàn chỉnh dùng để hướng dẫn về cách sử dụng của một vài và giúp các nhà phát triển ứng dụng mới tiếp cận với Android dễ dàng làm việc và tìm hiểu cách thức lập trình ứng dụng trên Android thông qua bộ SDK

Như đã nói ở trên, hệ điều hành Android là một hệ điều hành mở, nó cho phép nhà phát triển ứng dụng can thiệp vào tất cả các chức năng của hệ điều hành, thông qua bộ công cụ SDK Sau đây sẽ trình bày một số thư viện chuẩn của Android SDK cung cấp để hỗ trợ cho việc thực hiện được chức năng mong muốn theo ý của nhà phát triển:

•Gói android.os: gói này cho phép truy xuất đến các dịch vụ cơ bản của Android như tin nhắn, interprocess communication, đồng hồ …

•Gói com.google.android.maps: chứa các hàm API cấp cao để truy xuất đến ứng dụng map (bản đồ) đã được nhúng sẵn trong hệ điều hành Android Nó bao gồm MapView control, Overlay và MapController dùng để đánh dấu và điều khiển bản đồ

•Ngoài ra, còn các gói khác như app, widget, view, os, … mà nhóm sẽ trình bày như là một phần nội dung của đề tài này

1.1.3 Cài đặt

Chuẩn bị:

•Phần mềm Eclipse (phiên bản 3.2 trở lên) có thể tải trực tiếp từ trang web

Trang 10

•Bộ công cụ Android SDK phiên bản mới nhất, tới thời điểm này (4/2009) là phiên bản 1.5_r1, có thể tải từ trang web http://developer.android.com.

Ở đây nhóm thực hiện sẽ sử dụng hệ điều hành Microsoft Windows, phần mềm Eclipse và Android SDK để triển khai ứng dụng Android

Bắt đầu việc cài đặt:

Đầu tiên, bung nén chương trình eclipse vào một thư mục nào đó (thí dụ:

C:\eclipse\)

Sau đó, bung nén bộ Android SDK vào một thư mục bất kỳ (thí dụ:

D:\Android_SDK_1.5_r1\)

Bây giờ chạy chương trình eclipse.

•Vào menu Help – Software Updates …

•Chọn tab Available Software

•Chọn Add Site, nhập vào đường dẫn sau:

http://dl-ssl.google.com/android/eclipse/

•Chọn OK

•Chờ cho chương trình được cài đặt

•Sau khi cài xong, tiếp tục vào menu Window – Preferences

•Chọn tab Android, chỉ đường dẫn đến thư mục đã bung nén Android SDK ở trên (ở đây là D:\Android_SDK_1.5_r1\)

•Hoàn tất

Lưu ý:

•Cách cài đặt ở trên đòi hỏi máy tính phải được nối mạng Internet thì mới cài đặt được

Trang 11

CHƯƠNG 2: CƠ BẢN VỀ VIỆC TẠO ỨNG DỤNG TRÊN ANDROID

2.1 Các thành phần tạo nên một ứng dụng Android

Có 6 thành phần được cung cấp để tạo nên các ứng dụng Android:

•Activities: Mỗi một màn hình là một mở rộng của lớp Activity Activity dùng Views để tạo nên giao diện đồ họa người dùng, để hiển thị thông tin và đáp lại các hành động của người dùng Activity trong Android cũng tương tự như một Form trong các ứng dụng desktop truyền thống

•Services: Các service làm việc ẩn dưới ứng dụng, được sử dụng để thực hiện các xử lý thông thường khi cần và thậm chí ngay cả lúc các Activity không hoạt động hoặc ẩn đi

•Content Providers: được sử dụng để quản lý và chia sẽ cơ sở dữ liệu cho ứng dụng Chúng có thể được cấu hình để cho phép các ứng dụng khác truy xuất và ngược lại

•Intent: Một framework chuyển đổi message đơn giản Có thể sử dụng Intent để gửi tin nhắn đến toàn bộ hệ thống hoặc một Activity (Service) cụ thể Hệ thống sau đó

sẽ xác định Activity đích để thực hiện các tác vụ tương ứng

•Broadcast Receivers: Bằng cách tạo và đăng ký một Broadcast Receiver, ứng dụng Android có thể lắng nghe toàn bộ các Intent theo một chuẩn cụ thể được chỉ định Các Broadcast Receiver sẽ chạy ứng dụng một cách tự động để đáp ứng một Intent gửi đến

•Notification: Chúng gửi các tín hiệu đến người dùng mà không lấy đi focus hoặc ngắt đi các ứng dụng hiện hành của họ Chúng là một kỹ thuật được ưa chuộng

để tạo một chú ý người dùng từ bên trong một Service hoặc một Broadcast Receiver

Ví dụ khi người dùng đang nhận một tin nhắn hoặc đang nhận cuộc gọi, chúng sẽ gửi đến họ một tín hiệu bằng đèn, tạo một âm thanh hoặc hiển thị một biểu tượng nào đó.Việc tách rời sự phụ thuộc giữa các thành phần ứng dụng giúp việc chia sẽ cũng như trao đổi giữa các ứng dụng khác dễ dàng hơn, thậm chí đối với các ứng dụng third party

2.2 Giới thiệu Android Manifest

Mỗi một project có một file AndroidManifest.xml, nó định nghĩa cấu trúc và siêu

dữ liệu (metadata) cho ứng dụng

Trong file AndroidManifest.xml chứa các nút cho mỗi thành phần (Activities, Services, Content Providers và Broadcast Receivers) tạo nên ứng dụng Android và xác

Trang 12

định sự tương tác của chúng với nhau và với các ứng dụng khác thông qua Intent Filters và Permissions.

AndroidManifest cũng đưa ra các thuộc tính để chỉ định siêu dữ liệu của ứng dụng (icon hoặc theme), và thêm vào các nút cấp cao khác để thiết lập bảo mật và kiểm tra các thành phần ở trên

Manifest có một thẻ gốc <manifest> với một thuộc tính package được gán giá trị

là package của project Thường thì nó bao gồm một thuộc tính xmlns:android cung cấp một vài thuộc tính hệ thống sử dụng trong file Một node manifest cụ thể như sau:

- application: một manifest có thể chứa chỉ một node application Nó dùng các

thuộc tính để chỉ định các metadata cho ứng dụng (tiêu đề, icon, và theme) Nó cũng chứa các thẻ Activity, Service, Content Provider, và Broadcast Receiver

<application android:icon=”@drawable/icon”

android:theme=”@style/my_theme”>

[ application nodes ]

</application>

- activity: Mỗi một activity được hiển thị trong chương trình thì bắt buộc phải có

một thẻ activity, dùng android:name để chỉ định tên lớp Việc thử khởi động một Activity không được định nghĩa trong manifest sẽ làm phát sinh ngoại lệ khi chạy chương trình Mỗi một thẻ activity hỗ trợ thẻ con intent-filter để chỉ định Intent nào được chạy

<activity android:name=”.MyActivity” android:label=”@string/app_name”> <intent-filter>

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

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

</intent-filter>

</activity>

- service: cũng như một thẻ activity, phải tạo một thẻ service mới cho mỗi lớp

Service được dùng trong ứng dụng

<service android:enabled=”true” android:name=”.MyService”></service>

Trang 13

- provider: thẻ provider được dùng cho mỗi Content Provider trong ứng dụng

Content Provider được dùng cho việc quản lý và chia sẽ truy xuất dữ liệu bên trong và giữa các ứng dụng với nhau

- uses-permission: một phần trong bảo mật, thẻ uses-permission khai báo quyền

hạn mà ứng dụng có thể cần để hoạt động Các quyền được đưa ra sẽ được áp dụng cho người dùng, để chấp nhận hoặc từ chối, trong suốt quá trình cài đặt Việc phân quyền được yêu cầu trong nhiều dịch vụ native Android, đặc biệt là liên quan đến chi phí và bảo mật ( dialing, nhận SMS, hoặc sử dụng các dịch vụ định vị) Trong một ứng dụng third-party dưới đây, có thể chỉ định quyền trước khi cung cấp khả năng chia sẽ các thành phần ứng dụng

<uses-permission android:name=”android.permission.ACCESS_LOCATION”>

</uses-permission>

- permission: trước khi bạn có thể hạn chế việc truy xuất đến các thành phần ứng

dụng, cần định nghĩa một quyền bên trong manifest Sử dụng thẻ permission để định nghĩa các quyền Các thành phần ứng dụng có thể sử dụng các quyền này bằng cách

thêm vào thuộc tính android:permission.Các ứng dụng khác sau đó sẽ cần thêm một thẻ uses-permission trong file manifest của chúng trước khi sử dụng các thành phần

được bảo vệ này

Bên trong thẻ permission có thể chỉ định cấp độ truy xuất được cho phép (normal, dangerous, signature, signatureOrSystem),

- instrumentation: các lớp Instrumentation cung cấp một framework cho việc

chạy kiểm tra trên các Activity và Service lúc thực thi chương trình Chúng cung cấp các móc nối đến màn hình ứng dụng và tương tác với tài nguyên hệ thống

<instrumentation android:label=”My Test”

android:name=”.MyTestClass”

android:targetPackage=”com.paad.aPackage”>

Trang 14

Để dùng Manifest Editor trong Eclipse, right-click vào file AndroidManifest.xml

trong project của bạn và chọn Open With  Android Manifest Editor Nó đưa ra

một khung nhìn tiện lợi cho cấu trúc ứng dụng và cung cấp các shortcut link đến Application, Permissions, Instrumentation, và file XML thô

2.4 Vòng đời của ứng dụng Android

Không giống như hầu hết các môi trường truyền thống, các ứng dụng Android không có một điều khiển đến vòng đời của chúng Thay vào đó, các thành phần ứng dụng phải lắng nghe cho việc thay đổi trạng thái bên trong của ứng dụng đó và tác động trở lại một cách hợp lý

Trang 15

Như đã đề cập trước đó, mỗi một ứng dụng Android ở trong chính tiến trình của

nó, đang chạy một thể hiện riêng biệt của Dalvik Việc quản lý bộ nhớ và tiến trình của mỗi ứng dụng Android được điều khiển một cách riêng trong lúc run time

Android quản lý tài nguyên một cách chặt chẽ, nó sẽ làm bất cứ việc gì để đảm bảo cho thiết bị duy trì đáp ứng Điều này có nghĩa là các tiến trình sẽ bị hủy đi mà không có một cảnh báo nào nếu cần thiết để giải phóng tài nguyên cho các ứng dụng

có độ ưu tiên cao

2.5 Tài nguyên mở rộng

Android hỗ trợ các nguồn tài nguyên bên ngoài từ các dữ liệu đơn giản như một chuỗi, màu sắc đến các kiểu tài nguyên phức tạp hơn như ảnh, hoạt hình, và themes Với các tài nguyên bên ngoài này thì việc quản lý, duy trì và cập nhật là dễ dàng hơn Điều này cũng giúp dễ dàng khai báo các tài nguyên có thể thay đổi nhằm hỗ trợ phần cứng khác nhau và sự quốc tế hóa

2.5.1 Tạo tài nguyên

Tài nguyên của chương trình được lưu bên trong thư mục res/ Trong thư mục

này, mỗi một kiểu tài nguyên có một thư mục con chứa nó

Nếu tạo một project bằng ADT wizard, nó sẽ tạo ra một folder res chứa các thư

mục: values (chứa các chuỗi), drawable (chứa icon của ứng dụng), layout ( chứa bố cục mặc định của ứng dụng)

Có vài loại tài nguyên khác nhau, vì thế sẽ có một số folder khác nhau được tạo ra: simple values, drawables, layouts, animations, XML, styles, và tài nguyên thô Khi ứng dụng được biên dịch, các tài nguyên này sẽ được đưa vào trong gói ứng dụng.Một lớp R cũng được tạo để tham chiếu đến các tài nguyên trong ứng dụng bằng code

Các phần sau sẽ mô tả chi tiết hơn về các loại tài nguyên cụ thể và làm thế nào để tạo ra các tài nguyên đó trong ứng dụng Android

Trang 16

2.5.1.1 Simple Values

Các giá trị đơn giản bao gồm: string, color, dimesion và string array hoặc integer

array Tất cả các giá trị này đều được lưu vào các file xml trong thư mục res/values:

Trong mỗi file xml, cần chỉ định kiểu giá trị cần lưu, sử dụng các thẻ trong ví dụ dưới đây:

Các phần sau sẽ khảo sát chi tiết hơn về các kiểu dữ liệu này

Có thể dùng string resources như các tham số đầu vào cho phương thức

String.format Tuy nhiên phương thưc này không hỗ trợ định dạng văn bản như trên,

để có thể định dạng được văn bản như trên cần khai báo như sau:

<string name=”stop_message”>&lt;b>Stop&lt;/b> %1$s</string>

Trang 17

Trong phần code, dùng phương thức Html.fromHtml để chuyển một chuỗi ký tự:

String rString = getString(R.string.stop_message);

String fString = String.format(rString, “Collaborate and listen.”);

CharSequence styledString = Html.fromHtml(fString);

2.5.1.1.2 Colors

Dùng tag color để khai báo các màu Để chỉ định giá trị màu dùng ký tự # trước

giá trị màu RGB (1 hoặc 2 chữ số hex)

2.5.1.2 Styles and Themes

Style giúp cho ứng dụng có một giao diện hợp lý bằng cách chỉ định các giá trị của thuộc tính của View Hầu hết các style và theme dùng để lưu các giá trị màu và font chữ cho chương trình

Có thể thay đổi giao diện một cách khá đơn giản bằng cách chỉ định một style khác

Khai báo một thẻ style với một thuộc tính name và chứa 1 hoặc nhiều item Mỗi

item sẽ có một tên được gán cho thuộc tính name.

Trang 18

Style hỗ trợ cơ chế thừa kế, chỉ cần cung cấp giá trị cho thuộc tính parent trong thẻ style.

setContentView trong phương thức onCreate

Có thể tham chiếu một layout từ một layout resource khác Mỗi layout được lưu

trong một file xml riêng, chúng được lưu trong thư mục res/layout.

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

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical”

Trang 19

Phần này sẽ mô tả cách định nghĩa một resource có thể thay đổi theo ngôn ngữ, vùng, và phần cứng khác nhau Android sẽ tự động chọn giá trị thích hợp nhất cho một resource dựa trên phần cứng và cài đặt thiết bị hiện tại.

2.5.2.1 Sử dụng tài nguyên trong code

Truy xuất resource trong code thông qua lớp static R R là một lớp dựa trên các resource mở rộng và được tạo khi project được biên dịch Lớp R chứa các lớp con static cho mỗi kiểu resource được định nghĩa Một project mặc định bao gồm 2 lớp

// Display a transient dialog box that displays the

// error message string resource.

Toast.makeText(this, R.string.app_error,Toast.LENGTH_LONG).show();

Khi muốn có một thể hiện (instance) của resource, cần dùng đến các phương thức

hỗ trợ để rút trích từ bảng resource Bởi vì các phương thức này tìm kiếm trong bảng

resource của ứng dụng, nên các phương thức hỗ trợ này không thể là static Dùng phương thức getResource để truy xuất Resource:

Resources myResources = getResources();

Lớp Resources bao gồm các phương thức để lấy các kiểu dữ liệu và gán chúng

cho một biến

Resources myResources = getResources();

CharSequence styledText = myResources.getText(R.string.stop_message);

Drawable icon = myResources.getDrawable(R.drawable.app_icon);

int opaqueBlue = myResources.getColor(R.color.opaque_blue);

float borderWidth = myResources.getDimension(R.dimen.standard_border); Animation tranOut;

tranOut = AnimationUtils.loadAnimation(this, R.anim.spin_shrink_fade);

String[] stringArray;

stringArray = myResources.getStringArray(R.array.string_array);

int[] intArray = myResources.getIntArray(R.array.integer_array);

2.5.2.2 Tham chiếu tài nguyên này trong một tài liệu XML khác

Có thể tham chiếu đến resource trong một file XML khác Điều này đặc biệt hữu dụng cho layout và style, như vậy sẽ tạo được những sự thay đổi trên themes, các biến

Trang 20

string cục bồ và đồ họa Điều này đảm bảo tính ổn định cho bố cục hiển thị đối với các màn hình có kích thước và độ phân giải khác nhau.

Để tham chiếu đến một resource trong một file XML khác, dùng ký hiệu @ :

attribute=”@[packagename:]resourcetype/resourceidentifier”

Mặc định, Android sẽ hiểu rằng đang sử dụng một resource trong cùng package,

vì thế nếu bạn dùng một resource từ một package khác bạn cần cung cấp tên đầy đủ của package đó

Ví dụ sau đây tạo một layout sử dụng color, dimension, và string resource:

dùng lớp android.R chứ không phải chỉ dùng lớp R như những phần trước.

CharSequence httpError = getString(android.R.string.httpErrorBadUrl);

Để truy xuất tài nguyên hệ thống trong XML, cần chỉ định tên package là

Trang 21

android:textColor=”@android:color/darker_gray”

/>

2.5.2.4 Tham chiếu đến các style trong Theme hiện hành

Theme là một cách tuyệt vời đảm bảo các ứng dụng có một giao diện nhất quán Điều này sẽ tiện lợi hơn là phải định nghĩa cho mỗi style, Android cung cấp một shortcut để bạn sử dụng các style từ theme hiện hành

Để làm điều này, dùng ?android: trước resource muốn dùng:

2.6 Tổng quan về Android Activity

Để tạo một giao diện cho ứng dụng, cần thực hiện một lớp thừa kế lớp Activity,

sử dụng các View để cung cấp các tương tác với người dùng

Mỗi một Activity đại diện cho một màn hình (tương tự như khái niệm Form trong các ứng dụng Destop) Các ứng dụng phức tạp có thể có nhiều hơn một Activity

Cần tạo một Activity cho mỗi màn hình cần hiển thị Cụ thể là ít nhất một màn hình chính điều khiển các chức năng của ứng dụng, các activity khác nhằm mục đích nhập thông tin, cung cấp các khung nhìn khác nhau trên dữ liệu hoặc hỗ trợ các chức năng khác

Hầu hết các Activity được thiết kế để chiếm giữ toàn bộ màn hình, tuy nhiên có thể tạo các Activity có một nữa độ trong suốt, các Activity nổi, hoặc các dialog

public class MyActivity extends Activity {

/** Called when the activity is first created */

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

}

Trang 22

Một lớp Activity cơ bản đưa ra một màn hình rỗng chứa cửa sổ hiển thị Một Activity rỗng thì thực sự không có ích, vì vậy việc cần thực hiện đầu tiên là khai báo

bố cục cho nó bằng cách sử dụng các View và layout

Activity UI được tạo thành bởi các View View là các điều khiển giao diện người dùng, hiển thị dữ liệu và cung cấp tương tác đến người dùng Android cung cấp một số View giúp tạo một giao diện hấp dẫn

Để gắn một giao diện cho một Activity, sử dụng phương thức setContentView

trong lớp Activity được kế thừa

Để dùng một Activity cần khai báo bên trong file manifest Thêm vào một thẻ

activity mới bên trong nút application Thẻ activity này bao gồm các thuộc tính cho

siêu dữ liệu (label, icon,…) Một Activity mà không được khai báo một thẻ activity

tương ứng sẽ không được khởi chạy

Ví dụ sau mô tả cách làm thế nào để khai báo Activity đã được tạo ở phần trên:

Trang 23

CHƯƠNG 3: GIAO DIỆN NGƯỜI DÙNG

3.1 Cơ bản về thiết kế giao diện sử dụng trong Android

Android đưa ra một vài thuật ngữ mới cho việc thiết kế giao diện:

•Views: Views là lớp UI cơ bản cho các control giao diện Tất cả các control giao diện người dùng, các lớp layout đều được dẫn xuất từ lớp Views

•ViewGroups: ViewGroups được mở rộng từ lớp View và có thể chứa nhiều Views Bạn có thể tạo các control kết hợp chứa các View có mối quan hệ với nhau ViewGroups cũng được kế thừa để cung cấp các lớp quản lý bố cục như LinearLayout

•Activity: Activity tương tự như khái niệm về một cửa sồ hoặc một form trong các ứng dụng truyền thống Nó dùng để hiển thị giao diện người dùng

3.2 Giới thiệu về các loại View

Như đã đề cập ở trên, tất cả các thành phần trực quan trong Android đều được thừa

kế từ lớp View Lớp ViewGroup là một thiết kể mở rộng của View có thể chứa nhiều

thành phần View ViewGroup được dùng để xây dựng nên các component có thể dùng lại (widget) hoặc để quản lý bố cục cho các control

Hình sau mô tả mối quan hệ giữa các thành phần trên:

3.2.1 Tạo giao diện Activity với các View

Một Activity khởi động với một màn hình rỗng Để thiết lập giao diện cho màn hình

rỗng này cần gọi phường thức setContentView với tham số là một thể hiện của lớp View

Cần phải sử dụng phương thức trên để gán một UI cho ứng dụng khi định nghĩa đè lại

phương thức onCreate.

Phương thức setContentView có thể nhận một tham số là resource ID hoặc một thể

hiện của View Điều này có nghĩa là bạn có thể định nghĩa giao diện ứng dụng bằng code hoặc tham chiếu đến resource (layout)

Trang 24

Việc dùng layout resource sẽ tách riêng việc thiết kế giao diện và phần code xữ lý, cung cấp một khả năng thay đổi linh hoạt giao diện mà không thay đổi code bên trong Điều này tạo sự tùy biến phù hợp với các thiết bị phần cứng khác nhau dựa trên layout, thậm chí có thể thay đổi ngay cả lúc run-time trên cơ sở thay đổi của phần cứng.

Đoạn code sau mô tả cách thiết lập một UI sử dụng resource layout Sử dụng

phương thức findViewById để tham chiếu đến các View được định nghĩa trong một resource Ví dụ này tham chiếu đến layout main.xml nằm trong thư mục res/layout của

3.2.2 Android Widget Toolbox

Android cung cấp một bộ công cụ các View chuẩn để tạo các giao diện người dùng đơn giản Bạn có thể đơn giản hóa việc phát triển và cung cấp sự đồng nhất giữa các ứng dụng bằng cách sử dụng các control trong toolbox này

Các control thông dụng:

•TextView: là một label chỉ có tác dụng hiển thị văn bản, nó hỗ trợ hiển thị nhiều dòng, định dạng chuỗi

•EditText: Một hộp nhập văn bản có thể chỉnh sửa, hỗ trợ nhập nhiều dòng

•ListView: Tạo và quản lý một nhóm các View để hiển thị một danh sách các phần

tử Một ListView chuẩn dùng để hiển thị chuỗi giá trị của một mảng các TextView

•Spinner: Một control kết hợp, hiển thị một TextView và một ListView kết hợp dùng để chọn một item từ danh sách Nó được tạo thành từ một TextView chứa giá trị hiện tại đang được chọn kết hợp với một nút mà khi nhấn vào sẽ đưa ra một danh sách lựa chọn

•Button: Nút nhấn chuẩn

Trang 25

•CheckBox: Gồm 2 trạng thái: checked hoặc unchecked

•RadioButton: Khi đặt các radiobutton trong cùng một nhóm, chỉ có một trong các nút đó được chọn tại một thời điểm cụ thể

Andoid cũng hỗ trợ nhiều View cao cấp hơn như: date-time picker, auto-complete input box, map, gallery, và tab sheet

Tham khảo http://code.google.com/android/reference/view-gallery.html để biết chi tiết

3.3 Giới thiệu về các kiểu Layout

Layout Manager (thường được gọi là layout) là mở rộng của lớp ViewGroup, được

thiết kế để điều chỉnh vị trí của các control trên màn hình ứng dụng Layout có thể lồng nhau để tạo nên các giao diện phức tạp

Android có một số các layout đơn giản giúp xây dựng UI Việc kết hợp các layout

để tạo nên một bố cục hợp lý thì tùy thuộc vào người thiết kế

Các lớp layout cơ bản:

con vào góc trái trên của màn hình Việc thêm nhiều control sẽ chồng một cái mới lên trên cái trước đó

chiều dọc hoặc ngang Một layout theo chiều dọc sẽ có một control trên một dòng, trong khi layout theo chiều ngang chỉ có một dòng cho nhiều View Nó cho phép bạn chỉ định giá trị “weight” cho mỗi View con để điều chỉnh kích thước bên trong không gian cho phép

xứng với các control khác cũng như với đường biên của màn hình

có thể được thiết lập để co lại hoặc giản ra

đối Sử dụng lớp này sẽ đảm bảo bố cục chính xác cho các thành phần Khi dùng AbsoluteLayout không thể có được sự linh hoạt đối với các màn hình có kích thước khác nhau

Để có chi tiết đầy đủ về các layout trên, tham khảo tại:

http://code.google.com/android/devel/ui/layout.html

Sử dụng Layout

Trang 26

Phương pháp được ưa chuộng hơn là sử dụng resource bên ngoài từ file XML Một layout XML phải chứa một nút gốc Nút gốc này có thể chứa các layout và các View lồng nhau để xây dựng nên các giao diện phức tạp.

File XML sau mô tả một layout đơn giản bao gồm một TextView ở trên và một

EditText sử dụng LinearLayout bố trí theo chiều đứng:

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

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical”

Cũng có thề tạo các layout bằng code:

LinearLayout ll = new LinearLayout(this);

ll.setOrientation(LinearLayout.VERTICAL);

TextView myTextView = new TextView(this);

EditText myEditText = new EditText(this);

myTextView.setText(“Enter Text Below”);

myEditText.setText(“Text Goes Here!”);

int lHeight = LinearLayout.LayoutParams.FILL_PARENT;

int lWidth = LinearLayout.LayoutParams.WRAP_CONTENT;

ll.addView(myTextView, new LinearLayout.LayoutParams(lHeight, lWidth));

ll.addView(myEditText, new LinearLayout.LayoutParams(lHeight, lWidth));

setContentView(ll);

3.4 Tạo các View mới

Với khả năng thừa kế các View sẳn có, tạo các widget kết hợp, cũng như tạo được các control mới sẽ giúp người phát triển tinh chỉnh giao diện người dùng phù hợp với yêu cầu sử dụng

Trang 27

Khi thiết kế giao diện, điều quan trọng là phải biết cân bằng giữa thẩm mỹ và tính tiện dụng Vì vậy, việc tạo một View mới phụ thuộc vào mục đích mà người thiết kế muốn đạt đến:

•Chỉnh sửa hoặc kế thừa một control sẳn có khi nó thực sự cung cấp các chức năng

cơ bản cần thiết Việc định nghĩa đè (overriding) các handler và onDraw, người phát triển

có thể tùy biến các control mà không phải thực thi lại các chức năng của nó Ví dụ như việc tinh chỉnh một TextView để hiển thị một tập các số hệ thập phân

•Các control kết hợp từ các thành phần cơ bản Ví dụ như tạo nên một dropdown

combo box bằng cách kết hợp một TextView và một Button mà khi được nhấn sẽ hiển thị một ListView

•Tạo một control hoàn toàn mới khi cần thiết tạo ra một giao diện hoàn toàn khác

mà không thể tìm thấy bằng cách thay đổi hay kết hợp các control sẵn có lại với nhau

public class MyTextView extends TextView {

public MyTextView (Context context, AttributeSet attrs, int defStyle)

Để định nghĩa lại giao diện cũng như các ứng xử của control mới tạo, cần phải ghi

đè và thừa kế các điều khiển sự kiện (event handler) kết hợp với các hành vi muốn thay đổi

Trong ví dụ sau đây, phương thức onDraw được định nghĩa lại để thay đổi giao diện

và onKeyDown handler cũng được ghi đè.

public class MyTextView extends TextView {

public MyTextView (Context context, AttributeSet ats, int defStyle) {

super(context, ats, defStyle);

Trang 28

public void onDraw(Canvas canvas) {

[ Draw things on the canvas under the text ]

// Render the text as usual using the TextView base class

super.onDraw(canvas);

[ Draw things on the canvas over the text ]

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {

[ Perform some special processing ]

[ based on a particular key press ]

// Use the existing functionality implemented by

// the base class to respond to a key press event.

return super.onKeyDown(keyCode, keyEvent);

}

}

3.4.2 Tạo các điều khiển ghép (compound control)

Compound control là các widget có thể tái sử dụng, nó chứa nhiều control được bố

trí và có liên hệ với nhau

Khi tạo một compound control cần định nghĩa layout, hình thức và cách thức tác

động lẫn nhau giữa các View mà nó chứa Compound control được tạo thành từ việc dẫn

xuất từ lớp ViewGroup

Để tạo một compound control mới, chọn một lớp layout phù hợp nhất để xác định vị

trí cho các control, và dẫn xuất từ nó:

public class MyCompoundView extends LinearLayout {

public MyCompoundView(Context context) {

Trang 29

Với một Activity, cách được ưa chuộng hơn để thiết kế giao diện cho một

compound control là sử dụng layout resource Ví dụ sau đây mô tả việc tạo một widget

đơn giản gồm một EditText và một Button:

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

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical”

Để dùng được layout này cho widget mới cần phải định nghĩa lại contructor của nó

sử dụng phương thức inflate từ dịch vụ LayoutInflate Phương thức inflate nhận tham số

là layout resource và trả về một View

Đoạn code sau định nghĩa lớp ClearableEditText Bên trong contructor hiện thực

layout resource đã tạo ở trên và nhận tham chiếu đến các View mà nó chứa Nó cũng gọi

phương thức hookupButton để đặt chức năng clear text khi mà nút đó được nhấn.

public class ClearableEditText extends LinearLayout {

EditText editText;

Button clearButton;

public ClearableEditText(Context context) {

super(context);

// Inflate the view from the layout resource.

String infService = Context.LAYOUT_INFLATER_SERVICE;

LayoutInflater li;

li = (LayoutInflater)getContext().getSystemService(infService);

li.inflate(R.layout.clearable_edit_text, this, true);

// Get references to the child controls.

editText = (EditText)findViewById(R.id.editText);

Trang 30

Cũng có thể tạo một UI giống như trên bằng code:

public ClearableEditText(Context context) {

super(context);

// Set orientation of layout to vertical

setOrientation(LinearLayout.VERTICAL);

// Create the child controls.

editText = new EditText(getContext());

clearButton = new Button(getContext());

clearButton.setText(“Clear”);

// Lay them out in the compound control.

int lHeight = LayoutParams.WRAP_CONTENT;

int lWidth = LayoutParams.FILL_PARENT;

addView(editText, new LinearLayout.LayoutParams(lWidth, lHeight));

addView(clearButton, new LinearLayout.LayoutParams(lWidth, lHeight));

// Hook up the functionality

hookupButton();

}

Một khi đã xây dựng được giao diện cho control, điều tiếp theo là định nghĩa điều khiển sự kiện cho mỗi control con trong nó Đoạn code sau sẽ xóa nội dung của EditText khi nút được nhấn:

private void hookupButton() {

3.4.3 Tạo các Widget và các Control tùy chỉnh

Bằng cách tạo ra chính các control của mình, người phát triển có thể tạo được một giao diện mang tính duy nhất phù hợp với yêu cầu của người dùng Để tạo các control

mới, chúng cần phải được thừa kế từ lớp View hoặc SurfaceView.

Lớp View cung cấp một đối tượng Canvas và một số phương thức vẽ cũng như các

lớp Paint, để tạo một giao diện trực quan Người thiết kế có thể định nghĩa lại các sự kiện

Trang 31

người dùng như cảm ứng trên màn hình, nhấn phím để tạo nên sự tương tác Trong những trường hợp mà không đòi hỏi việc vẽ lại cũng như đồ họa 3D thì lớp cơ sở View có giải pháp hiệu quả.

Trong khi đó, lớp SurfaceView cung cấp một đối tượng canvas hỗ trợ việc vẽ từ một luồng xử lý nền và sử dụng openGL cho đồ họa 3D Đây là một lựa chọn tuyệt với cho

các điều khiển đòi hỏi đồ họa cao, cần phải cập nhật liên tục hoặc hiển thị các đồ họa phức tạp, như game 3D

Trong phần này sẽ giới thiệu các control dựa trên lớp View, để biết thêm về lớp SurfaceView tham khảo các phần sau

3.4.3.1 Tạo một giao diện trực quan

Lớp View được đặt trưng bởi một hình vuông kích thước 100 x 100 pixel Để thay đổi kích thước của control và hiển thị một giao diện hấp dẫn, cần ghi đè lại phương thức

onMeasure và onDraw:

Bên trong onMeasure, View mới sẽ tính toán chiều rộng và chiều cao mà nó sẽ chiếm giữ Phương thức onDraw là nơi để người thiết kế tạo ra giao diện cho control đó.

public class MyView extends View {

// Constructor required for in-code creation

public MyView(Context context) {

super(context);

}

// Constructor required for inflation from resource file

public MyView (Context context, AttributeSet ats, int defaultStyle) {

super(context, ats, defaultStyle );

}

//Constructor required for inflation from resource file

public MyView (Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onMeasure(int wMeasureSpec, int hMeasureSpec) {

int measuredHeight = measureHeight(hMeasureSpec);

int measuredWidth = measureWidth(wMeasureSpec);

// MUST make this call to setMeasuredDimension

// or you will cause a runtime exception when

// the control is laid out.

setMeasuredDimension(measuredHeight, measuredWidth);

}

private int measureHeight(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

Trang 32

int specSize = MeasureSpec.getSize(measureSpec);

[ Calculate the view height ]

return specSize;

}

private int measureWidth(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

[ Calculate the view width ]

return specSize;

}

@Override

protected void onDraw(Canvas canvas) {

[ Draw your visual interface ]

}

}

Phải gọi phương thức setMeasureDimension trong phương thức onMeasure nếu

không control được tạo sẽ phát sinh một ngoại lệ khi nó được dùng

3.4.3.1.1 Vẽ control

Phương thức onDraw là nơi để người thiết kế tạo nên một bề mặt hoàn toàn mới của control Việc vẽ này thực hiện trên tham số của phương thức onDraw, thông qua đối tượng Canvas.

Android cung cấp một số công cụ để vẽ trên Canvas sử dụng các biến kiểu Paint Lớp Canvas bao gồm các phương thức hỗ trợ để vẽ các đối tượng 2D đơn giản như các

hình tròn, đường, hình chữ nhật, text, và image Đồng thời nó cũng hỗ trợ các phép biến đổi như quay, di chuyển, điều chỉnh kích thước

Một trong những kỹ thuật quan trọng nhất cho việc viết code Android hiệu quả là

tránh việc tạo và hủy các đối tượng liên tục Các đối tượng trong phương thức onDraw sẽ

được tạo và hủy mỗi lần màn hình được làm tươi Vì thế các đối tượng sử dụng trong phương thức này nên có phạm vi lớp và khởi tạo chúng trong contructor

Đoạn code sau hiển thị một text đơn giản ở giữa control:

@Override

protected void onDraw(Canvas canvas) {

// Get the size of the control based on the last call to onMeasure.

int height = getMeasuredHeight();

int width = getMeasuredWidth();

// Find the center

int px = width/2;

int py = height/2;

// Create the new paint brushes.

Trang 33

// NOTE: For efficiency this should be done in

// the widget’s constructor

Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mTextPaint.setColor(Color.WHITE);

// Define the string.

String displayText = “Hello World!”;

// Measure the width of the text string.

float textWidth = mTextPaint.measureText(displayText);

// Draw the text string in the center of the control.

canvas.drawText(displayText, px-textWidth/2, py, mTextPaint);

}

3.4.3.1.2 Điều chỉnh kích thước control

Định nghĩa lại phương thức onMeasure để điều chỉnh kích thước của control

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int measuredHeight = measureHeight(heightMeasureSpec);

int measuredWidth = measureWidth(widthMeasureSpec);

setMeasuredDimension(measuredHeight, measuredWidth);

}

private int measureHeight(int measureSpec) {

// Return measured widget height.

}

private int measureWidth(int measureSpec) {

// Return measured widget width.

}

Hai tham số widthmeasureSpec và heightMeasureSpec trước khi được sử dụng phải được mã hóa thông qua getMode và getSize của lớp MeasureSpec.

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

Phụ thuộc vào giá trị mode mà giá trị size có thể là không gian maximum có thể

(AT_MOST) hoặc kích thước chính xác (EXACTLY) mà control đó có thể hiển thị Một

khi mode là UNSPECIFIED thì sẽ không có giá trị nào cho size.

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int measuredHeight = measureHeight(heightMeasureSpec);

int measuredWidth = measureWidth(widthMeasureSpec);

setMeasuredDimension(measuredHeight, measuredWidth);

}

Trang 34

private int measureHeight(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

// Default size if no limits are specified.

int result = 500;

if (specMode == MeasureSpec.AT_MOST) {

// Calculate the ideal size of your

// control within this maximum size.

// If your control fills the available

// space return the outer bound.

result = specSize;

} else if (specMode == MeasureSpec.EXACTLY) {

// If your control can fit within these bounds return that value.

result = specSize;

}

return result;

}

private int measureWidth(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

// Default size if no limits are specified.

int result = 500;

if (specMode == MeasureSpec.AT_MOST) {

// Calculate the ideal size of your control

// within this maximum size.

// If your control fills the available space

// return the outer bound.

result = specSize;

} else if (specMode == MeasureSpec.EXACTLY) {

// If your control can fit within these bounds return that value.

onKeyDown: Được thực hiện khi có bất kỳ phím thiết bị nào được nhấn, bao gồm

phím D-pad, bàn phím, hang-up, call, back, và cả nút camera

Trang 35

onKeyUp: Được gọi khi người dùng thả phím ra sau khi nhấn xuống.

onTrackballEvent: Được gọi khi trackball được di chuyển.

onTouchEvent: Thực hiện khi màn hình cảm ứng được nhấn hoặc được thả.

@Override

public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {

// Return true if the event was handled.

return true;

}

@Override

public boolean onKeyUp(int keyCode, KeyEvent keyEvent) {

// Return true if the event was handled.

return true;

}

@Override

public boolean onTrackballEvent(MotionEvent event ) {

// Get the type of action this event represents

int actionPerformed = event.getAction();

// Return true if the event was handled.

return true;

}

@Override

public boolean onTouchEvent(MotionEvent event) {

// Get the type of action this event represents

int actionPerformed = event.getAction();

// Return true if the event was handled.

thị khi người dùng nhấn nút Menu.

Android cũng hỗ trợ menu ngữ cảnh, nó được gán vào bất kỳ View nào bên trong một Activity Một menu ngữ cảnh được hiển thị khi người dùng nhấn nút D-pad, trackball, hoặc nhấn vào màn hình cảm ứng khoảng 3 giây

Activity và menu ngữ cảnh hỗ trợ submenu, checkbox, radio button, shortcut key,

và icon

Trang 36

3.5.1 Giới thiệu về Menu trong Android

Các menu truyền thống trên các thiết bị di động thì đa phần khó dùng Vì thề Android đưa ra một số tính năng cho việc sử dụng menu trong một màn hình có kích thước hạn chế

Các loại menu trong android:

nút Menu được nhấn Nó hiển thị icon và text cho các menu item hoặc các submenu Icon menu hỗ trợ tạo tối đa 6 menu item, và các menu item này không thể hiển thị checkbox, radio button, hay shortcut key

Menu hiển thị một danh sách có thể cuộn được các menu item, và các menu item này không thể chứa các icon mà chỉ có thể chứa text, shortcut key và checkbox/ radio button

Submenu: Android hiển thỉ mỗi submenu bằng một cửa sổ.

Trang 37

Chú ý rằng tên của submenu được hiển thị ở thanh header và mỗi Menu item được hiển thị với đầy đủ text, checkbox, shortcut key Android không hỗ trợ các submenu lồng nhau, vì không thể thêm một submenu vào một submenu

Cũng như expanded menu, submenu cũng không thể hiển thị icon cho các item

3.5.2 Tạo một Menu trong Activity

Để tạo một menu trong Activity, override phương thức onCreateOptionsMenu,

phương thức này được thực thiện ở lần đầu tiên menu được hiển thị

onCreateOptionsMenu nhận một tham số kiểu Menu Dùng phương thức add trên

đối tượng Menu này để thêm vào các item Mỗi menu item cần phải chỉ định các thuộc tính sau:

•Xác định nhóm mà item đó được thêm vào

•Mỗi item có một ID duy nhất, bởi vì chúng được xử lý chung trong phương thức onOptionsItemSelected nên việc xác định item nào được chọn là phụ thuộc vào ID được chỉ định cho nó

•Xác định cách sắp xếp thứ tự mà item được hiển thị

•Text thể hiện của item có thể là một chuỗi các ký tự hoặc một string resource.static final private int MENU_ITEM = Menu.FIRST;

Trang 38

// Unique menu item identifier Used for event handling.

int menuItemId = MENU_ITEM;

// The order position of the item

int menuItemOrder = Menu.NONE;

// Text to be displayed for this menu item.

int menuItemText = R.string.menu_item;

// Create the menu item and keep a reference to it.

MenuItem menuItem = menu.add(groupId, menuItemId,

menuItemOrder, menuItemText);

return true;

}

3.5.3 Các kiểu Menu Item

Android hỗ trợ hầu hết các kiểu menu item truyền thống, bao gồm icon, shortcut, checkbox, radio button:

expanded menu và submenu Để thiết lập một menu item là checkbox sử dụng phương

thức setCheckable Trạng thái của checkbox được thiết lập thông qua setChecked.

Một radio button group là một nhóm các radio button và chỉ có một trong số chúng được chọn tại một thời điểm Để tạo một radio button group, gán cùng ID nhóm cho mỗi item, sau đó gọi phương thức Menu.setGroupCheckable và truyền vào ID nhóm, và thiết lập giá trị cho các tham số khác là True.Checkbox thì không được sử dụng trong icon

menu.

// Create a new check box item.

menu.add(0, CHECKBOX_ITEM, Menu.NONE, “CheckBox”).setCheckable(true); // Create a radio button group.

menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, “Radiobutton 1”);

menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, “Radiobutton 2”);

menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE,

“Radiobutton 3”).setChecked(true);

menu.setGroupCheckable(RB_GROUP, true, true);

phương thức setShortcut Phương thức này yêu cầu truyền vào 2 tham số, một sử dụng

phím số và một hỗ trợ cho bàn phìm đầy đủ

// Add a shortcut to this menu item, ‘0’ if using the numeric keypad

// or ‘b’ if using the full keyboard

menuItem.setShortcut(‘0’, ‘b’);

Trang 39

Condensed Title: icon menu không thể hiển thị một shortcut hay một checkbox,

vì thế việc dùng một text hiển thị sẽ cho khái quát được tình trạng của nó.menuItem.setTitleCondensed(“Short Title”);

hiển thị trên Icon Menu

menuItem.setIcon(R.drawable.menu_item_icon)

khiển Đó là phương thức onOptionsItemSelected.

menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {

public boolean onMenuItemClick(MenuItem _menuItem) {

[ execute click handling, return true if handled ]

return true;

}

});

đối tượng Intent

menuItem.setIntent(new Intent(this, MyOtherActivity.class));

MenuItem menuItem = menu.findItem(MENU_ITEM);

[ modify menu items ]

return true;

}

3.5.3.2 Xử lý lựa chọn Menu

Android xử lý các lựa chọn menu thông qua một phương thức đơn giản,

onOptionsItemSelected, phương thức này nhận một tham số là MenuItem.

public boolean onOptionsItemSelected(MenuItem item) {

Trang 40

[ Perform menu handler actions ]

Dùng phương thức addSubMenu để thêm vào một submenu Phương thức này có

cùng các tham số với phương thức dùng để thêm vào một menu item Chúng bao gồm: một ID nhóm, một ID kiểu int cho submenu này, và mô tả bằng text Có thể dùng

setHeaderIcon và setIcon để chỉ định icon cho thanh tiêu đề của submenu.

Các menu item trong submenu cũng hỗ trợ các kiểu menu: dạng icon, hay dạng mở rộng Tuy nhiên, Android không hỗ trợ các submenu lồng nhau

Đoạn code sau mô tả việc tạo ra một submenu trong onCreateOptions.

SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, “Submenu”);

3.5.4.2.1 Tạo Context Menu

Chọn lựa đầu tiên là tạo một context menu chung cho một lớp View bằng cách

Override phương thức onCreateContextMenu:

Ngày đăng: 18/10/2014, 09:23

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Reto Meier, Professional Android Application Development darksiderg, Wrox, 2009 Khác
[2] McGraw Hill, Android A Programmers Guide, Mc Graw Hill, Jul.2008 Khác
[3] Chris Haseman, Android.Essentials, Apress, Jul.2008 Khác
[4] Rick Rogers, John Lombardo, Android Application Development, O'Reilly Media, May 26, 2009 Khác
[5] android - Developer Toolbox, Goolgle Khác

HÌNH ẢNH LIÊN QUAN

Hình sau mô tả mối quan hệ giữa các thành phần trên: - Xây dựng ứng dụng đa phương tiện cho Mobile sử dụng hệ điều hành Android
Hình sau mô tả mối quan hệ giữa các thành phần trên: (Trang 23)
BẢNG PHÂN CÔNG CÔNG VIỆC - Xây dựng ứng dụng đa phương tiện cho Mobile sử dụng hệ điều hành Android
BẢNG PHÂN CÔNG CÔNG VIỆC (Trang 112)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w