Intent và tương tác giữa các Activity

Một phần của tài liệu Bài giảng lập trình di động android (Trang 37)

2.4.1. Intent là gì?

Một khái niệm quan trọng khác của hệđiều hành Android là Intent. Intent hiểu một cách đơn giản giống như “keo dán” giữa các thành phần của Android, giúp các activity của cùng một ứng dụng hoặc các ứng dụng khác nhau có thể tương tác với

nhau để thực hiện công việc một cách trôi chảy, giống như các activity đó cùng thuộc một ứng dụng.

ThS. Bùi Trung Úy 38

Intent là một cấu trúc thông điệp (message) không đồng bộ cho phép một thành phần của ứng dụng yêu cầu chức năng từ các thành phần khác. Các Intent cho phép giao tiếp với các thành phần của ứng dụng cũng như với các thành phần đóng gói

trong một ứng dụng khác. Chẳng hạn, một Activity có thể gọi một Activity bên ngoài

để chụp ảnh.

Intent được xem là cầu nối giữa các Activity, khi ứng dụng có nhiều hơn một Activity thì việc điều hướng từ Activity này sang Activity khác và ngược lại là việc rất cần thiết và được thực hiện rất thường xuyên. Intent chính là người đưa thư, giúp chúng ta triệu gọi cũng như truyền các dữ liệu cần thiết để thực hiện một Activity từ một Activity khác.

2.4.2. Sử dụng đối tượng Intent

Vềcơ bản,Intent là đối tượng của lớp android.content.Intent. Bạn có thể gửi Intent vào hệ thống Android với chỉđịnh thành phần mục tiêu gửi đến. Mỗi đối tượng Intent có thể chứa các thông tin sau:

- Action (hành động) - Data (dữ liệu) - Type (loại)

- Category (danh mục)

Phần “hành động” mô tả việc chúng ta cần làm, còn phần “dữ liệu” chứa thông tin cần thiết gữi kèm cho thành phần sắp được mở ra xử lý. Chẳng hạn, ta tạo Intent yêu cầu cần hiển thị thông tin, với dữ liệu đi kèm là url đến một website. Hệ thống Android sẽ lọc trong tất cả ứng dụng đã được cài đặt trên hệ thống và liệt kê ra các ứng dụng có thể xửlý được Intent này để người dùng lựa chọn. Intent trên có thểđược gọi tường minh hơn như sau:

Intent it = new Intent(“android.intent.action.VIEW”);

it.setData(Uri.parse(“http://www.google.com”));

ThS. Bùi Trung Úy 39 it.putExtra("key_name", "This is a string!");

Một số Intent không cần truyền theo dữ liệu cụ thể, mà chỉ cần truyền theo loại dữ liệu, ví dụ lấy một bản ghi trong danh sách danh bạ, ta có thểdùng Intent như sau:

Intent it = new Intent(android.content.Intent.ACTION_PICK); it.setType(ContactsContract.Contacts.CONTENT_TYPE);

Hàm setType() chỉ ra loại dữ liệu (MIME data type) của thông tin trả về cho

activity hiện tại. MIME type của ContactsContract.Contacts.CONTENT_TYPE là xâu

“vnd.android.cursor.dir/contact”.

Ngoài hành động, dữ liệu và loại dữ liệu, mỗi đối tượng Intent có thể có thêm tham số “danh mục” (category) dùng để nhóm các Activity lại theo danh mục nhằm thuận tiện cho việc lọc các Activity theo nhu cầu của ứng dụng.

Đối với Activity, để mở Activity khác, ta cần truyền Action của activity đó trong hàm dựng của đối tượng Intent như sau:

Intent it = new Intent(“com.example.LoginActivity”)

startActivity(it);

Action ởđây là “com.example.LoginActivity” còn được gọi là “component name”. Trong trường hợp Activity cần mở nằm cùng project với Activity hiện tại, ta có thể gọi ngắn gọi như sau:

Intent it = new Intent(LoginActivity.class) startActivity(it);

2.4.3. Truyền dữ liệu giữa các Activity

Một thao tác phổ biến trong lập trình Android là truyền dữ liệu cho Activity mới được mở ra. Chẳng hạn trong trường hợp, khi gọi mở một activity mới ta có thể truyền sẵn chuỗi dữ liệu cần hiển thị của Activity này.

Trước tiên ta xem xét một ví dụđơn giản nhất trong việc sử dụng Intent để mở một Activity khác từ Activity hiện tại. Cụ thểnhư sau, trong project HelloAndroid, bạn tạo thêm activity là GreetingActivity; MainActivity có một ô nhập liệu và một nút bấm, khi nhấn với nút bấm này sẽ mở GreetingActivity.

Để truyền dữ liệu từ MainActivity, trước khi gọi startActivity, ta gắn dữ liệu cần truyền vào đối tượng Intent dùng để mở GreetingActivity như sau:

// Tạo một Intent với mục tiêu là GreetingActivity

Intent it = new Intent(this, "com.example.GreetingActivity"); // Các dữ liệu gửi kèm

it.putExtra("student_name", "John Kerry"); it.putExtra("student_age", 23);

// Yêu cầu start Activity chỉđịnh trong Intent.

ThS. Bùi Trung Úy 40 Hoặc chúng ta có thể sử dụng code như sau:

// Tạo một Intent với mục tiêu là GreetingActivity

Intent it2 = new Intent(this, "com.example.GreetingActivity"); // Các dữ liệu gửi kèm - Sử dụng Bundle

Bundle extras = new Bundle();

extras.putString("student_country", "Da Nang – Viet Nam"); extras.putInt("student_yearbirth", 1986);

//---attach the Bundle object to the Intent object--- It2.putExtras(extras);

//-- Yêu cầu start Activity và sẽ có phản hồi từActivity được gọi. this.startActivityForResult(it2, REQUEST_CODE);

Khi đó, trong hàm onCreate của activity mục tiêu GreetingActivity, ta có thể lấy dữ liệu được truyền sang bằng cách lấy Intent qua hàm getIntent() và lần lượt lấy ra các trường dữ liệu tương ứng bằng các phương thức getStringExtra, getIntExtra, getExtras… như sau:

//---get the data passed Intent it = getIntent();

String name = it.getStringExtra("student_name"); int age = it.getIntExtra("student_age", 0);

Hoặc lấy dữ liệu theo dạng bundle:

//---get the Bundle object passed in--- Bundle bundle = it.getExtras();

String country = bundle.getString("student_country"); int year = bundle.getInt("student_yearbirth");

2.4.4. Lấy kết quả trả về từ Activity thông qua Intent

Trong rất nhiều trường hợp, khi mở Activty mới với mục đích yêu cầu thêm dữ liệu từ người dùng, như yêu cầu người dùng nhập tên truy cập và mật khẩu,… Trong trường hợp đó, sau khi người dùng kết thúc nhập liệu và quay trở lại Activity trước, dữ liệu người dùng vừa nhập cần phải được truyền vềActivity ban đầu để xử lý.

Để minh họa cho quá trình trên, ta thực hiện các bước sau: 1. Trong GreetingActivity, thêm nút bấm „Got It‟:

Trong hàm xử lý sự kiện click của nút „Got It‟ của GreetingActivity, ta thêm đoạn mã trả về dữ liệu cho Activity gốc (Activity gọi nó) trước khi đóng lại như sau:

Intent itn = new Intent(); //---set the data to pass back---

itn.setData(Uri.parse(“Hello Got it! Have fun today!”)); setResult(RESULT_OK, itn);

ThS. Bùi Trung Úy 41

2. Trong MainActivity, thay vì mở GreetingActivity bằng phương thức

startActivity(), ta dùng startActivityForResult() kèm theo một mã yêu cầu: startActivityForResult(itent, 101);

3. Tiếp theo ta ghi đè hàm nhận sự kiện onActivityResult () khi Activity nhận kết quả tra về:

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 101 && resultCode == RESULT_OK) {

Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show(); }

}

Khi nhận được kết quả (dạng chuỗi) từ GreetingActivity, với mục đích minh họa, ta chỉ hiển thị text này lên màn hình dưới dạng Toast.

2.4.5. Bộ lọc Intent (Intent Filter)

Khi tạo mới một Activity hoặc một Service, bạn cần phải khai báo nó với AndroidManifest.xml, thông thường khi bạn tạo chúng với sự trợ giúp của trình wizard trong Android Studio mã đăng ký tự động được tạo ra trong AndroidManifest.xml.

ThS. Bùi Trung Úy 42 Bạn có thể nhận thấy trong AndroidManifest.xml, phần khai báo của Activity có thể có thẻ <intent-filter>, thẻ này dùng chỉ rõ các loại Intent gửi tới Activity mà nó có thể chấp nhận.

Khi bạn tạo ra một Intent, hệ thống Android sẽ tìm kiếm các thành phần thích hợp để khởi động bằng cách so sánh nội dung của Intent với các bộ lọc intent khai báo trong file manifest của ứng dụng khác trên thiết bị. Nếu Intent phù hợp với một bộ lọc Intent, hệ thống khởi động thành phần đó và truyền vào đối tượng Intent.

Ví dụ, một khai báo bộ lọc Intent trong manifest: … <activity android:name=".HelloWorld" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity> ...

Với bộ lọc Intent này, ta có thể tạo một Intent để gọi tới Activity trên như sau:

Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse("www.google.com")); startActivity(intent);

2.5. Resource trong ứng dụng Android

2.5.1. Resource (tài nguyên) là gì?

Bất kỳ ứng dụng mà bạn phát triển sẽ phải bao gồm nhiều loại tài nguyên (resource) và các giá trị cục bộ, chẳng hạn như văn bản, hình ảnh (thậm chí đơn giản là biểu tượng ứng dụng) và màu sắc. Trong phần này, chúng ta sẽ tìm hiểu về các tài nguyên trong Android và làm thế nào để sử dụng chúng trong ứng dụng để hiển thị nội dung cho người dùng, xử lý các thiết bị có kích thước khác nhau.

Trong lập trình Android, có một sự phân biệt rõ ràng giữa tài nguyên (resource) và mã nguồn (source code). Nếu như source code được để trong thư mục java/ thì resource được để trong thư mục res/ đó là những file còn lại không liên quan đến Java code, chẳng hạn như các file hình ảnh, âm thanh, các file text, màu sắc,… và thậm chí là file XML, cũng chính là các resource mà chúng ta cần quan tâm.

Nếu mở thư mục res/ này ra, bạn sẽ nhìn thấy rất nhiều thư mục con trong đó. Những thư mục con này được tạo sẵn khi bạn tạo mới một project, số lượng thư mục tạo sẵn và tên các thư mục này phụ thuộc vào từng thời điểm của Android Platform. Ngoài các thư mục được tạo sẵn này bạn có thể tạo thêm nhiều thư mục khác nữa.

ThS. Bùi Trung Úy 43

2.5.2. Các loại tài nguyên

Để sử dụng tài nguyên trong một dự án Android, bạn cần phải sắp xếp chúng vào các thư mục con trong thư mục res. Tên các thư mục con này được đặt theo quy định củahệ thống tài nguyên Android:

animator: Thư mục này chứa các tập tin XML định nghĩa hiệu ứng động cho các đối tượng view trong ứng dụng. Thay vì định nghĩa hiệu ứng động lặp đi lặp lại trong code, ta có thể tạotập tin XML animator ở đâyvới một hiệu ứng động cụ thể.

drawable: Nếu ứng dụng đòi hỏi tài nguyên hình ảnh cục bộ, thì bạn cần phải đặt chúng trong thư mục drawable. Đây cũng là nơi chứa tập tin XML xác định hình dạng hoặc hình ảnh được vẽ ra trong code.

mipmap: Tương tự như drawable, thư mục mipmap lưu các hình ảnh, nhưng nó được sử dụng đặc biệt cho các biểu tượng launcher của ứng dụng.

layout: Chứa các tập tin XML là bố cục giao diện người dùng của ứng dụng. • menu: Chứa các tập tin menu XML được sử dụng tạo các mục trên action bar, menu điều hướng và menu con.

raw: Thư mục này được sử dụng để lưu trữ các tập tin tùy ý cho ứng dụng, chẳng hạn như âm thanh, video và các tập tin văn bản.

xml: Thư mục này chứa các tập tin XML tùy ý được sử dụng bởi Android cho các tác vụ khác nhau, chẳng hạn như việc xác định cấu hình tìm kiếm hoặc khả năng bên ngoài.

values: Chứa các loại file thiết lập chung để lập trình viên định nghĩa ra các

thuộc tính, giao diện, các config… để sử dụng cho đồng nhất và đồng thời sẽ giúp

người dùng tối ưu code khi chỉnh sửa sau này. Điều mà bạn không được mắc phải khi code dự án ở các công ty, đó là không được viết lại các dòng lệnh giống nhau nhiều lần, thay vào đó phải định nghĩa ra rồi khi dùng gọi đến. Thư mục values có thể chứa

ThS. Bùi Trung Úy 44

nhiều tập tin XML bao gồm các giá trị đơn giản được sử dụng trong ứng dụng, bao gồm:

+ color.xml: đây là file định nghĩa các mã màu trong dự án android của ban, khi sử

dụng màu nào bạn chỉ cần gọi tên tên mã màu đã định nghĩa.

Ví dụ, một file colors.xml mẫu <?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="yellow">#FFFF00</color> <color name="red">#FF0000</color> <color name="silver">#C0C0C0</color> <color name="gray">#808080</color> <color name="olive">#808000</color> <color name="purple">#800080</color> <color name="aqua">#00FFFF</color> <color name="lime">#00FF00</color> <color name="teal">#008080</color> <color name="green">#008000</color> <color name="blue">#0000FF</color> <color name="navy">#000080</color> <color name="black">#000000</color> </resources>

+ dimens.xml: đây là file mà bạn sẽđịnh nghĩa ra các kích thước như cỡ chữ, chiều cao, chiều rộng các view.

Ví dụ, một file dimens.xml mẫu <?xml version="1.0" encoding="utf-8"?> <resources> <!-- Default margins. --> <dimen name="horizontal_margin">16dp</dimen> <dimen name="vertical_margin">16dp</dimen> <!-- Padding --> <dimen name="padding_tiny">2dp</dimen> <dimen name="padding_small">4dp</dimen> <dimen name="padding_medium">8dp</dimen> <dimen name="padding_large">16dp</dimen> <!—Icon size --> <dimen name="icon_width">60dp</dimen> <dimen name="icon_height">60dp</dimen> </resources>

+ strings.xml: đây là file định nghĩa các đoạn văn bản trong ứng dụng, chẳng hạn

như bạn có một đoạn văn bản mà sử dụng đi sử dụng lại trong các màn hình khác nhau, bạn có thể định nghĩa đoạn văn bản đó trong strings.xml và khi dùng thì gọi ra sử dụng và sau này chỉnh sửa bạn chỉ cần sửa ở file này và nó sẽ apply tất cả mọi nơi.

ThS. Bùi Trung Úy 45

<?xml version="1.0" encoding="utf-8"?> <resources>

<string name="app_name">Hello Android</string> <string name="loading">Loading please wait…</string>

<string name="log_out">Log Out</string>

<string name="notif_policy">Notification Policy</string>

<string name="html_text" formatted=”false”>

<![CDATA[

<font color=\’#28b5f5\’>Discover</font> and <font color=\’#28b5f5\’>Play</font>

]]> </string> </resources>

txtView.setText(Html.fromHtml(getString(R.string.html_text)));

+ styles.xml: Bất kỳ ứng dụng mà bạn xây dựng cần một giao diện nhất quán và điều này có thể đạt được bằng cách sử dụng tập tin styles.xml. Sử dụng styles, bạn có thể thay thế giao diện mặc định cho các thành phần và các thuộc tính có thể được liên kết với các đối tượng view khác nhau trong các tập tin layout.

2.5.3. Truy cập vào tài nguyên

Tất cả các loại tài nguyên trong Android, khi biên dịch và đóng gói ứng dụng sẽ được tự động gán một định danh để xác định loại tài nguyên, chẳng hạn như R.drawable.pic01, R.layout.activity_main hay R.id.text01,… các định danh này được định nghĩa là các hằng sốtrong tập tin R.java của ứng dụng (tập tin R.java là tập tin được tự động sinh ra trong quá trình biên dịch ứng dụng). Tên định danh này có thể được sử dụng để truy cập vào các nguồn tài nguyên trong code Java hoặc trong tập tin tài nguyên XML.

Truy cập tài nguyên trong code

Nhiều đối tượng trong Android được xây dựng từ cácnguồn tài nguyên và sử dụng định danh tài nguyên để thiết lập cho đối tượng. Chẳng hạn, thiết lập một ImageView sử dụng một tài nguyên drawable (hình ảnh) như sau:

imageView.setImageResource(R.drawable.pic01);

Tương tự, một đối tượng MediaPlayer (được sử dụng để phát âm thanh hoặc video) có thể được tạo ra để chơi tập tin đa phương tiện raw bằng cách truyền vào trong R id của tập tin.

mediaPlayer.create(getActivity(), R.raw.hello_song)

Ngoài ra, bạn cũng có thể truy xuất tài nguyên gốc trong code bằng cách sử dụng phương thức getResources() của đối tượng Context của Android. Điều này trả về một đối tượng Resources với nhiều phương thức để truy cập vào các tài nguyên cục bộ của ứng dụng, chẳng hạn như getColor() và getDrawable().

getResources().getColor(R.color.colorPrimary); getResources().getDrawable(R.drawable.kittens);

ThS. Bùi Trung Úy 46

Truy cập tài nguyên trong XML

Phần lớn khi bạn sử dụng tài nguyên đều sử dụng trong các tập tin XML. Bằng cách định nghĩa colors, styles, strings, hoặc bất kỳ tài nguyên nào được sử dụng ở nhiều nơi khác nhau của ứng dụng, nó làm cho việc bảo trì trở nên đơn giản hơn bằng cách cho phép bạn thay đổi một giá trị và có tác dụng trên toàn bộ ứng dụng.

Đểtruy cập tài nguyên trong XML ta sử dụng như sau: <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:text="@string/title" style="@style/TitleStyle" />

ThS. Bùi Trung Úy 47

Chương 3. LẬP TRÌNH GIAO DIỆN ANDROID

Giao diện người dùng là mt trong nhng yếu t quan trng, quyết định s thành công ca mt ng dng Android. Trong chương này, chúng ta sẽ tìm hiu cu trúc giao din, các thành phn trên giao din và cách kết hp các thành phần này để to nên b cc giao din cho ng dng Android.

3.1. Tổng quan về giao diện Android

Xét ví dụ, ta có một màn hình giao diện cho người dùng đăng nhập như sau:

Trên màn hình giao diện này, Android tổ chức hiển thị các phần tử (views) thành

các nhóm (viewgroup), có 2 nhóm chính là:

+ Nhóm 1: gồm 2 nhãn hiển thị „Email‟ và „Password‟ là các TextView; và 2 ô

nhập liệu là các EditText, nhóm này được tổ chức trong một ViewGroup là

LinearLayout dạng dọc (Vertical).

+ Nhóm 2: gồm 2 nút chức năng Login và Cancel là các Button. Nhóm này được

tổ chức trong một ViewGroup là LinearLayout dạng ngang (Horizontal).

Khái niệm View

Một giaodiện người dùng của ứng dụng Android được tạo thành bởi nhiều phần tử

khác nhau. Mỗi phần tử trên giao diện đượcgọi là một view, một view là một lớp con

của lớp android.view.View. View được sử dụng để tạo ra các điều khiển hiển thị trên

Một phần của tài liệu Bài giảng lập trình di động android (Trang 37)

Tải bản đầy đủ (PDF)

(133 trang)