Presentation is loading. Please wait.

Presentation is loading. Please wait.

Nguyen Ha Giang FIT – Hutech

Similar presentations


Presentation on theme: "Nguyen Ha Giang FIT – Hutech"— Presentation transcript:

1 Nguyen Ha Giang FIT – Hutech nguyenha.giang@yahoo.com
Lập trình Android Nguyen Ha Giang FIT – Hutech

2 Nội dung Tổng quan hệ điều hành Android Đặc điểm Kiến trúc Phiên bản
Lập trình trên môi trường Android Môi trường lập trình AVD Quá trình phát triển ứng dụng Android. Ứng dụng cơ bản Android Tìm hiểu Android project Các cách tiếp cận trong lập trình Android.

3 Google Android ? Tập phần mềm dành cho thiết bị di động bao gồm
Một hệ điều hành Midleware Các ứng dụng cơ sở Sử dụng Linux để cung cấp dịch vụ hệ thống lõi Security Memory management Process management Power management Hardware drivers Hệ điều hành mã nguồn mở

4 Android architechture

5 Android vesioning Vesion code và version name  không giống nhau.
Mỗi version name (platform level) thì có duy nhất một version code (API level) đi kèm. Platform Codename API Level Android 1.5 Cupcake 3 Android 1.6 Donut 4 Android 2.0 Eclair 5 Android 2.0.1 6 Android 2.1 7 Android 2.2 Froyo 8 Android 2.3 Android 2.3.2 Gingerbread 9 Android 2.3.3 Android 2.3.7 10 Android 3.0, 3.1,3.2 Honeycomb 11, 12, 13

6 Version distribution Nguồn: Android developer, Oct 3, 2011

7 Installling Android SDK
Chuẩn bị môi trường trên PC Cài đặt JDK dex.html Nếu dùng Eclipse để phát triển ứng dụng thì download một phiên bản Eclipse Download SDK Start package Giải nén thư mục này vào ổ đĩa, nhớ note lại thư mục để tham chiếu trong bước cài đặt Eclipse.

8 Installling Android SDK
Cài đặt ADT plugin cho Eclipse Plugin này gọi là Android Development Tool, hỗ trợ công cụ để phát triển ứng dụng Android Mở rộng Eclipse với chức năng Tạo mới Android project Tạo ứng dụng UI Android Test ứng dụng trên emulator Android SDK Debug ứng dụng dùng Android SDK Tool. Nếu dùng IDE khác thì không cần cài Eclipse + ADT plugin!

9 Installling Android SDK
Cài đặt ADT plugin cho Eclipse: Install New Software

10 Installling Android SDK
Bước Install

11 Installling Android SDK
Add Site, có 2 lựa chọn Nếu download file zip chứa ADT rồi thì chọn Archive browse đến file zip (vd: ADT zip) Nếu chưa download và muốn cài trực tiếp thì nhập URL sau vào location Cuối cùng chọn OK, để thực hiện install ADT Sau khi cài xong ADT thì restart lại Eclipse!

12 Installling Android SDK
Configuring the ADT Plugin Bước này cài đặt ADT tham chiếu đến Android SDK mà ở bước trước đã download và install vào thư mục trên đĩa. Chọn Window > Preferences trong Eclipse, trong SDK location, browse đến thư mục Android SDK Sau bước này hoàn tất việc tạo môi trường để xây dựng Android app

13 Android Emulator & AVD Emulator là thành phần quan trọng để test ứng dụng nhưng không thể thay thế hoàn toàn thiết bị thật! Emulator trên Android được gọi là Android Virtual Devices (AVDs) Android SDK và AVD manager cho phép tạo các AVDs hướng tới bất kỳ phiên bản Android API. AVD cho phép cấu hình: Resolution RAM SD card Skin Hardware khác

14 Android Emulator: 1.6 Device

15 Android Emulator: 2.2 Device

16 Android Emulator: 3.0 Device

17 Hãy bỏ ra ít thời gian để làm quen với Android Emulator!!!
Emulator basic Sử dụng bàn phím của máy tính Sử dụng pointer máy tính như "finger" Sử dụng kết nối internet của máy tính Các button: Home, Menu, Back, Search… Ctrl + F11: landscape  portrait Alt + Enter: full screen mode Hãy bỏ ra ít thời gian để làm quen với Android Emulator!!!

18 Emulation limitations
Không hỗ trợ việc gọi và nhận thật sự cuộc gọi Giả lập cuộc gọi và tin nhắn qua emulator console Không hỗ trợ USB connection Camera/video (input) Headphone Battery charge level & AC charging state Bluetooth Test your app on an actual device!

19 Setting up an Emulator Mở chức năng Android SDK và AVD manager trong Eclipse SDK/AVD Manager

20 Setting up an Emulator Mở chức năng Android SDK và AVD manager trong Eclipse

21 Setting up an Emulator Chọn New virtual device Đặt tên Chọn platform
Chọn SD card nếu cần Chọn skin HVGA

22 Running the app in the emulator
Với project Android đang làm việc, chọn Run (Ctrl +F11), lúc này emulator đã thiết lập sẽ khởi động. Lần đầu tiên thời gian khởi động emulator khá lâu (vài phút ) do phải tạo môi trường virtual Linux system. Port number AVD name

23 Running the app: emulator
Để thuận tiện cho việc coding, build & run thì emulator khởi động một lần trong suốt quá trình làm việc. Ta cứ việc code, build và run, khi đó emulator tự động cập nhật mã lệnh mới, không cần phải restart lại emulator! Run Emulator 1 lần cho suốt phiên làm việc!

24 Mobile Devices: Advantages
Always with the user Typically have Internet access Typically GPS enabled Typically have accelerometer & compass Many have cameras & microphones Many apps are free or low-cost

25 Mobile Devices: Disadv
Limited screen size Limited battery life Limited processor speed Limited and sometimes slow network access Limited or awkward input: soft keyboard, phone keypad, touch screen, or stylus Limited web browser functionality Range of platforms & configurations across devices

26 Mã Java được biên dịch sang Dalvik byte code!
Android Apps Được xây dựng trên Java và SDK mới Không support một số thư viện Java như Swing & AWT Oracle đang kiện Google vi phạm bản quyền! Java code được biên dịch vào Dalvik byte code (.dex) Được tối ưu cho thiết bị di động (memory, battery…) Dalvik VM chạy những file .dex Mã Java được biên dịch sang Dalvik byte code!

27 Producing an Android App
Java code Byte code javac Dalvik exe dx .class .java aapt classes.dex Byte code <xml> Other .class files AndroidManifest.xml .apk <str> Resources

28 First Android Application
Trong Eclipse chọn Alt +Shift + N.

29 First Android Application
New Android Project Chọn tên project, build target (platform) và package name Tên project platform Scroll down để thấy phần package name Package name: ký tự đầu tiên phải chữ thường, phải có dấu chấm (2 định danh)

30 First Android Application
Toàn bộ Adroid project được khởi tạo từ Eclipse Chọn Package Explorer để xem cấu trúc của ứng dụng Code Java Chứa resource File cấu hình app

31 First Android Application

32 Important Files src/NguyenhagiangActivity.java
Activity của ứng dụng, hiển thị khi ứng dụng chạy res/layout/main.xml Định nghĩa layout & widgets cho activity res/values/strings.xml Khai báo hằng chuỗi dùng trong chương trình gen/R.java (Don’t touch!) File được tạo tự động các ID từ các file *.xml AndroidManifest.xml Khai báo tất cả thành phần của app (tất cả các activity). Tên thư viện cần thiết được dùng trong ứng dụng Xác định những permission mà ứng dụng được cấp. Phiên bản, cấu hình…

33 src/NguyenhagiangActivity.java Activity là thành phần sẽ hiển thị khi chạy ứng dụng. Do ứng dụng này đơn giản chỉ có 1 activity nên là activity chính của ứng dụng!

34 res/layout/main.xml Khai báo layouts & widgets cho activity

35 res/values/string.xml Khai báo hằng chuỗi dùng trong app
Hỗ trợ Localization res/values-es/values/strings.xml (Spanish) res/values-fr/values/strings.xml (French) Nội dung chuỗi Tên truy cập chuỗi

36 gen/R.java File được tự động khởi tạo với các định danh từ main.xml, string.xml và các phần khác. Không được chỉnh sửa!

37 AndroidManifest.xml Khai báo tất cả các thành phần của app với system
Phiên bản: version code, version name Application: icon, name, label… Tham chiếu đến tên các thư viện mà app có sử dụng Quy định các permission mà ứng dụng được phép.

38 Create UI Thiết lập UI cho một activity
public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } main.xml chứa trong thư mục res/layout

39 Create UI Tạo một nội dung trực tiếp từ code không dùng XML
public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); }

40 Basic Event handler Tạo button đáp ứng sự kiện click
public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button btn = new Button(this); btn.setText("Click me!"); setContentView(tv); }

41 Basic Event handler (2) Khai báo listener để xử lý sự kiện click
// thiết lập event click handler btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText( getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show(); } });

42 Three Main Approaches for Android programming

43 Three Main Approaches Java-based
Sử dụng Java để định nghĩa String, layout window, tạo các GUI, gán event handler, giống như lập trình Swing XML-based Sử dụng file XML để định nghĩa String, layout window, tạo các GUI, gán event handler. Phương thức Java chỉ đọc layout từ file XML và truyền vào setContentView. Hybrid Sử dụng file XML định nghĩa String, layout window, và tạo GUI control. Sử dụng Java để gán event handler. 3 cách cơ bản trong việc xây dựng ứng dụng Android

44 Java-based approach public class NguyenHaGiangActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String message="Message 1"; LinearLayout window = new LinearLayout(this); TextView txt = new TextView(this); txt.setText(message); Button btn = new Button(this); btn.setText("Button Label"); btn.setOnClickListener(new SomeHandler()); window.addView(txt); window.addView(btn); setContentView(window); }// end onCreate … //(next page) Code Java

45 Java-based approach ... //(previous page)
private class SomeHandler implements OnClickListener{ @Override public void onClick(View clickedButton) { // doSomething();... Toast.makeText(getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show(); } // end onClick } // end class SomeHandler } // end class NguyenHaGiangActivity Code Java

46 XML-based approach Java XML public class SomeClass extends Activity {
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void handlerMethod(View clickedButton) { String someName = getResources().getString(R.string.name); doSomethingWith(someName); } } res/values/strings.xml res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="name">…</string> </resource> <LinearLayout …> <TextView …/> <Button …android:onClick="handlerMethod" /> </LinearLayout>

47 Hybrid approach Java XML Lấy control thông qua IDs
Không sử dụng android:onClick để gán handler public class SomeClass extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.button_id); b.setOnClickListener(new SomeHandler()); } private class SomeHandler implements OnClickListener { public void onClick(View clickedButton) { doSomething(...); } }

48 Java-based Layout

49 Main idea Approach Sử dụng Java để định nghĩa chuỗi, layout window, tạo GUI control, gán trình xử lý sự kiện. Avantages Thân thiện với giới Java desktop developer. Giống cách tiếp cận để xây dựng Swing, SWT, và AWT. Thuận tiện cho việc xây dựng layout động, tuỳ biến vào logic lập trình. Disadvantages Phần code và phần UI xen lẫn với nhau. Chỉ thấy được giao diện khi chạy ứng dụng.

50 Code (Main Method) Phần code trong onCreate
String appName = "Demo Java-baed Application"; String windowText = "Press the button"; String buttonLabel = "Show Greeting"; LinearLayout mainWindow = new LinearLayout(this); mainWindow.setOrientation(LinearLayout.VERTICAL); setTitle(appName); TextView label = new TextView(this); label.setText(windowText); label.setText(windowText); mainWindow.addView(label); Button greetingButton = new Button(this); greetingButton.setText(buttonLabel); greetingButton.setOnClickListener(new Toaster()); mainWindow.addView(greetingButton); setContentView(mainWindow);

51 Code (Main Method) Lớp thực thi interface onClickListener
private class Toaster implements OnClickListener { @Override public void onClick(View clickedButton) { String greetingText = "Hello from Android!"; Toast t = Toast.makeText(getApplicationContext(), greetingText, Toast.LENGTH_LONG); t.show(); }

52 Results on Emulator

53 XML-based Layout

54 Main Idea Approach Sử dụng file XML để định nghĩa chuỗi, layout window, tạo UI control và gán event handler Định nghĩa layout và control in res/layout/main.xml Định nghĩa các chuỗi trong res/values/strings.xml Advantages Dễ quản lý Dùng visual layout editor của eclipse Đây là cách tiếp cận được khuyến khích Disaventages Việc tạo layout động.

55 More details res/layout/main.xml
Định nghĩa layout và widget với mô tả XML <LinearLayout …> define widget </LinearLayout> Tham chiếu đến chuỗi (strings.xml) với @string/string_name Gán event handler với android:onClick res/value/strings.xml Định nghĩa chuỗi dùng trong GUI Java code Tham chiếu đến layout với R.layout.main Tham chiếu đến chuỗi với getString(R.string.string_name) Tham chiếu đến widget với findViewById(R.id.xyz_id) res/layout/main.xml

56 Project layout Tham chiếu đến layout được định nghĩa trong res/layout/main.xml với R.layout.main Định nghĩa giao diện và widget. Đôi khi có phần khai báo event handler. Tham chiếu đến string định nghĩa trong res/values/strings.xml với cú Định nghĩa chuỗi được dùng trong UI

57 Code (res/layout/main.xml)
Các thuộc tính orientation, layout_width… được định nghĩa trong JavaDoc API cho LinearLayout Chuỗi được định nghĩa trong res/values/strings.xml Phương thức này là public khai báo trong main class, giá trị trả về là void, có một tham số là View

58 Code (res/values/strings.xml)
Tên của ứng dụng Các chuỗi được định nghĩa trong strings.xml được tham chiếu trong main.xml và java code Java code: getString(R.string.string_name)

59 Java code Tham chiếu đến main.xml
Tham chiếu đến chuỗi tên greeting_text được định nghĩa trong strings.xml

60 Hybrid Layout

61 Main idea Approach Sử dụng XML để định nghĩa string, layout window, và UI widget Sử dụng Java để gán event handler Advantages Tương tự như cách tiếp cận XML-based Ngoài ra việc gán event handler từ code có thể dễ hiểu hơn, do event handler cũng là phần java code. Disadvantages Khó tạo layout động.

62 Code (res/layout/main.xml)
Định nghĩa id cho button để button có thể được tham chiếu trong Java code với findViewById(R.id.greetind_button) Không gán event handler ở đây, do ta sẽ làm trong java code!

63 Code (res/values/strings.xml)
File strings.xml tương tự như phần trước!

64 Code (java) Phải thiết lập setContentView trước khi gọi findViewById, nếu không sẽ nhận được null

65 Bài tập Viết ứng dụng basic calculator cho phép tính các phép toán cơ bản {cộng,trừ, nhân, chia} theo các cách tiếp cận như sau: Java based XML based Hybrid

66 Basic Layout Organizing the Screen

67 Contents LinearLayout Cách thức tổ chức layout nhiều cấp
Sử dụng màu sắc RelativeLayout TableLayout

68 Layout Strategies XML-based
Khai báo layout trong res/layouts/some_layout.xml Thiết lập thuộc tính XML Sử dụng visual editor trong Eclipse Load layout với setContentView(R.layout.some_layout) Java-based Tạo thể hiện layout, thiết lập thuộc tính, chèn sub-layout LinearLayout window = new LinearLayout(this) // thiết lập các thuộc tính cho window window.addView(widgetOrLayout) Load với phương thức setContentView(window)

69 XML Layout Attributes Mỗi lớp Layout đều có lớp inner là LayoutParams định nghĩa tham số XML cho layout sử dụng. Các tham số này có tên android:layout_xyz, thường dùng để định kích thước và canh lề. VD: <LinearLayout android:layout_width = "match_parent" android:layout_height= "wrap_content" android:gravity = "center_horizontal" android:background = </LinearLayout>

70 Commonly Used Attributes
Size android:layout_width, android:layout_height match_parent: fill the parent space (minus padding) Phiên bản cũ là fill_parent wrap_content: kích thước bao nội dung android:layout_weight: Giá trị số cho biết tỷ lệ phân chia kích thước Alignment android:layout_gravity Cho biết cách thức canh lề của view ở trong containing view android:gravity Cho biết cách thức text và thành phần bên trong view được canh lề.

71 Commonly Used Attributes
Alignment (tt) Giá trị thường dùng Top, bottom, left, right, center_vertical, center_horizontal, center, fill_vertical, fill_horizontal, fill, clip_vertical, clip_horizontal. Margin (blank space outside) Android:layout_marginBottom, android:layout_marginTop, android:layout_marginLeft, android:layout_marginRight Units dp: density-independent pixels (scaled by device resol.) sp: scaled pixel (font size) px: pixels, in: inches, mm: milimeters.

72 Commonly Used Attributes
Padding (blank space inside) android:paddingBottom/Top/Left?Right Giá trị là con số theo đơn vị unit bên trên ID android:id Sử dụng khi java code cần tham chiếu đến view Sử dụng trong RelativeLayout khi cần tham chiếu đến view nào đó để làm mốc. Colors android:background (color, image) android:textColor Giá trị thường dùng "#rrggbb", "#aarrggbb",

73 Basic LinearLayout Ý nghĩa
Cho phép đặt những thành phần theo 1 dòng hay 1 cột Có thể lồng ghép để tạo thành những dòng với các cột. Các thuộc tính XML quan trọng. android:orientation "horizontal" (row) or "vertical" (column) Horizontal là mặc định android:gravity Cách các view bên trong được canh lề

74 Example (nested layout)
General Approach

75 Example (nested layout)
Horizontal linearlayout với gravity là center_horizontal Horizontal Linearlayout với gravity là left

76 Example (nested layout)
Horizontal LinearLayout Chứa 2 layout Horizontal LinearLayout Layout đầu tiên màu vàng có layout_width ="wrap_content" và gravity ="left" Layout thứ hai màu xanh có layout_width="match_parent"và gravity là "right"

77 Example (nested layout)
Horizontal LinearLayout Chứa 3 vertical bên trong LinearLayout với orientation là vertical và 4 button bên trong Chứa RadioGroup với orientation là vertical và 4 RadioButton bên trong. LinearLayout với orientation là vertical và 4 LinearLayout bên trong. 2 cột đầu có layout_width là wrap_content và cột thứ 3 là match_parent.

78 Example (nested layout)
Vertical LinearLayout Layout này chứa 4 horizontal bên trong. Gravity là center_horizontal Gravity là left Gravity là right Chứa 2 horizontal LinearLayout bên trong Layout_width là wrap_content và gravity là left Layout_width là match_parent và gravity là right

79 Example (nested layout)
Button android:layout_width="wrap_content" android:layout_gravity="center_horizontal"android:layout_marginTop= "20dp" Button Android:layout_width="match_parent"

80 Setting Colors Mặc dù màu có thể định nghĩa cụ thể trong file layout (background="#ff0000"), tuy nhiên có thể định nghĩa tên màu trong file riêng biệt, khi đó tham chiếu thông qua tên màu. Nếu cần thì chỉ thay đổi giá trị của màu, lúc đó sẽ tác động lên toàn bộ nơi tham chiếu đến tên màu. Syntax Convention Sử dụng file res/values/colors.xml Có thể đặt với bất cứ tên nào miễn hợp lệ! <resources> <color name="color_name_1">#rrggbb</color> … <!-- Other colors --> </resources>

81 Color File <resources>
<color name="red">#f00</color> <color name="orange">#ffa500</color> <color name="yellow">#ffff00</color> <color name="green">#0f0</color> <color name="blue">#00f</color> <color name="indigo">#4b0082</color> <color name="violet">#ee82ee</color> <color name="back">#000</color> <color name="white">#fff</color> </resources> colors.xml

82 Layout file Tham chiếu màu trong file layout. Tham chiếu trong code
getResource().getColor(R.color.red) <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginTop="20px" android:layout_centerHorizontal="true" android:padding="25dp" </TextView>

83 Layout Weight Ý nghĩa Gán những con số cho android:layout_weight, kích thước sẽ được phân chia theo tỷ số này. Cách dùng (cho height) Thiết lập android:layout_height = 0dp Sử dụng những giá trị tương ứng cho layout_weight Vd: nếu có 3 thành phần với layout_weight tương ứng là 1, 1 và 2 thì tỷ lệ tương ứng là 25%, 25% và 50% của 3 thành phần so với chiều cao của cha. Tương tự cho thiết lập width! Có thể xem giá trị weight là 100, sử dụng những giá trị 25, 25, và 50 cũng tương ứng như 1, 1 và 2!

84 Layout File

85 Result

86 RelativeLayout Ý tưởng Mỗi view có id xác định
Cho phép xác định vị trí tương đối của view với những view khác thông qua id. Thuộc tính XML quan trọng Align với container layout_alignParentBottom (Top,Right,Left) layout_centerInParent (centerHorizontal, centerVertical) Tất cả giá trị là true hay false Align với view layout_alignBottom (Top, Right, Left) layout_toLeftOf ( toRightOf, above, below) Tất cả giá trị là id của view nào đó

87 Referring to Existing IDs
@+id: để gán id mới Button thứ 1 <Button id = android:layout_alignParentRight="true"… /> Button thứ 2 <Button /> @id: (không có dấu cộng) tham chiếu đến button đã có

88 Example

89 Example <TextView android:id = "@+id/behind"
android:layout_width="match_parent" android:layout_height="100dp" android:background="#ff0000" android:textColor="#ffff00" android:textSize="42dp" android:text="Behind" android:gravity="center"/> android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#0000ff" android:textColor="#000000" android:textSize="18dp" android:text="On Top" android:layout_marginTop="25dp" android:layout_centerHorizontal="true" />

90 Example <Button android:id="@+id/image_button"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Search Images" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"/> android:text = "Search Web" /> <EditText android:layout_width="match_parent"

91 TableLayout Idea Cho phép widget và layout khác chứa bên trong grid (không có đường biên) Tương tự như HTML table, số dòng và cột xác định tự động, không cần phải khai báo. Các view được đặt bên trong TableRow XML attributes android:stretchColumns Chứa chỉ số cột sẽ được stretch khi table nhỏ hơn parent android:shrinkColumns Liệt kê các cột sẽ co lại khi table lớn hơn parent android:collapseColumns Những cột sẽ bị thu lại, có thể lập trình để hiện ra sau.

92 TableRow Dùng để định nghĩa một dòng trong TableLayout
Thuộc tính XML quan trọng sử dụng bên trong TableRow android:layout_column Có thể xác định chính xác cột của thành phần, cột bỏ qua đó sẽ rỗng. android:layout_span Số cột mà thành phần sẽ chiếm giữ, giống colspan trong HTML table Không có thuộc tính tương ứng với rowspan trong HTML, dùng nested table để thực hiện.

93 Example

94 Example

95 Example

96 Example

97 VD Tạo activity có layout như sau: (chỉ dùng TableLayout)

98 Button Widgets

99 Topics in this section Buttons ImageButtons với 1 ảnh
ImageButtons với 3 ảnh (normal/focused/pressed) RadioButtons – OnClickListener RadioButtons – OnCheckedChangeListener CheckBoxes ToggleButtons

100 Button layout Horizontal LinearLayout (3 button)
Horizontal LinearLayout (3 Imagebutton) Horizontal LinearLayout (3 Imagebutton) Horizontal RadioGroup (3 RadioButton) Horizontal RadioGroup (3 RadioButton) Horizontal LinearLayout (3 CheckBox) Horizontal RadioGroup (3 ToggleButton) Vertical LinearLayout

101 Basic Button Là nút nhấn có nhãn bên trên
Listener: View.OnClickListener Nếu sử dụng phương pháp XML based thì có thể không cần phải khai báo lớp Listener này. Thuộc tính XML thường dùng android:text Nhãn của button, có thể truy xuất bằng code java thông qua phương thức setText và getText android:onClick

102 ImageButton Là nút nhấn có ảnh hiển thị bên trên
Listener: View.OnClickListener Thuộc tính XML android:src ảnh hiển thị trên button, tham chiếu đến tên (không có phần mở rộng) của ảnh trong thư mục res/drawable Hỗ trợ các kiểu ảnh png, jpeg, gif và bmp. Có thể dùng Java code để thiết lập với setImageDrawable android:onClick

103 ImageButton

104 RadioButton Là nút chọn, cho phép chọn một trong số mục chọn cùng nhóm. Listener View.OnClickListener Gán cho mỗi nút nếu quan tâm đến sự kiện chọn trên từng item. Có thể dùng cách khác là bắt sự kiện trên RadioGroup. Thuộc tính XML android:text, android:onClick

105 RadioGroup Tương tự như LinearLayout, cho phép chứa các RadioButton bên trong. Quản lý trạng thái RadioButton là exclusive. Listener: OnCheckedChangeListener Thuộc tính XML Tương tự như LinearLayout Sử dụng android:id để tham chiếu trong chương trình (khi thiết lập OnCheckedChangeListener) Không có thuộc tính andoird:onXYZ để thiết lập RadioGroup listener trong XML.

106 Event handler cho RadioButton
Minh hoạ Đáp ứng với mỗi click trên từng radio button bằng cách hiện thông điệp message nào đó Cách thực hiện Đặt các radiobutton vào trong radiogroup Gán event handler, sử dụng onClick cho mỗi RadioButton. Không cần id cho RadioGroup, không cần listener cho RadioGroup.

107 Event handler cho RadioButton

108 Event handler cho RadioGroup
Minh hoạ Mỗi khi nút nào được nhấn thì hiển thị message báo tên nút được nhấn Cách thực hiện Đặt RadioButton bên trong RadioGroup Trong XML, tạo id cho RadioGroup Trong Java, xác định RadioGroup và thiết lập Listener

109 Event handler cho RadioGroup
Xử lý trong hàm onCreate

110 CheckBox Minh hoạ cách dùng

111 Spinner Là dạng tương tự như combo box Listener
AdapterView.OnItemSelectedListener AdapterView.OnItemClickedListener Thuộc tính XML android:id, android:prompt android:entry Định nghĩa mục chọn, có thể định nghĩa trong strings.xml hoặc arrays.xml

112 Spinner Khai báo Spinner Strings.xml hay arrays.xml

113 Spinner Tham chiếu đến Spinner Lớp thực thi Listener
Lấy item được chọn

114 Spinner Cách tiếp cận khác là tạo spinner thông qua code Java.
Sinh viên tìm hiểu thêm cách tiếp cận này!

115 Intent

116 Dùng Intent để gọi Activity
Có thể dùng Intent để gọi một activity từ một activity đang hiển thị. Cú pháp Intent activityIntent = new Intent(this, NewActivity.class); startActivity(activityIntent); // khai báo trong AndroidManifest.xml <activity android:name = "NewActivity" <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

117 Gởi dữ liệu giữa Activity
Cách thực hiện Tạo đối tượng Bundle, chứa dữ liệu cần gởi cho activity mới, attach đối tượng Bundle này kèm theo Intent Cú pháp Java (original Activity) Java (new Activity) Intent activityIntent = new Intent(this, NewActivity.class); Bundle newActivityInfo = new Bundle(); newActivityInfo.putXYZ(…); //putDouble, putString… activityIntent.putExtras(newActivityInfo); startActivity(activityIntent); Intent intent = getIntent(); Bundle info = intent.getExtras(); If (info != null) { // getXYZ()… }

118 Gởi dữ liệu giữa Activity
VD: Truyền dữ liệu từ original activity sang new activity.

119 Gởi dữ liệu giữa Activity
Hàm xử lý submit public void submit(View v) { Intent newActivity = new Intent(this,NewActivity.class); Bundle info = new Bundle(); String sName, s ; EditText ed1 = (EditText)findViewById(R.id.editText1); EditText ed2 = (EditText)findViewById(R.id.editText2); info.putString("Name", ed1.getText().toString()); info.putString(" ", ed2.getText().toString() ); newActivity.putExtras(info); startActivity(newActivity); }

120 Gởi dữ liệu giữa Activity
Xử lý trong new activity setContentView(R.layout.new_activity); // tham chiếu đến intent String sName, s ; Intent intent = getIntent(); Bundle info = intent.getExtras(); if (info != null) { sName = info.getString("Name"); s = info.getString(" "); TextView tv1 = (TextView)findViewById(R.id.tvHoTen); tv1.setText(sName); TextView tv2 = (TextView)findViewById(R.id.tv ); tv2.setText(s ); }

121 Gởi dữ liệu giữa Activity
Tình huống: Activity mới sau khi tương tác với user, thu thập được dữ liệu, kết thúc activity và gởi lại cho activity gọi nó (original activity). Acvitity B kết thúc và gởi dữ liệu về cho A Activity A Activity B Gọi activity B (có thể truyền dữ liệu cho B tuỳ ý)

122 Gởi dữ liệu giữa Activity
Phần xử lý ở lớp activity A (Original Activity) Phần xử lý trên thường đặt trong hàm xử lý sự kiện của button hay menu. Intent newActivity = new Intent(this, ActivityB.class); final int result = 1; // gọi activity B hiển thị và chờ lấy kết quả trả về startActivityForResult(newActivity, result);

123 Gởi dữ liệu giữa Activity
Phần xử lý ở lớp activity A (Original Activity), khi nhận kết quả trả về từ activity B (new Activity). Override phương thức onActivityResult trong ActivityA để nhận kết quả trả về (khi ActivityB đóng). protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // lấy Bundle chứa dữ liệu Bundle bundle = data.getExtras(); int data1 = bundle.getInt("<tên dữ liệu 1>"); int data2 = bundle.getInt("<tên dữ liệu 2>"); String data3 = bundle.getString("<tên dữ liệu 3>"); }

124 Gởi dữ liệu giữa Activity
Phần xử lý trong activity B (activity được gọi từ A) // gởi dữ liệu về activity trước Intent intent = new Intent(); Bundle bundle = new Bundle(); // gởi dữ liệu vào bundle bundle.putInt("<tên dữ liệu 1>", data1); bundle.putInt("<tên dữ liệu 2>", data2); Bundle.putString("<tên dữ liệu 3>", data3); intent.putExtras(bundle); // gởi kèm dữ liệu setResult(RESULT_OK, intent); // gởi kết quả về finish(); // đóng activity

125 Gọi Activity thông qua URI
Cung cấp URI tham chiếu đến new activity New Activity sẽ đăng ký trong androidmanifest có mô tả dùng URI Cú pháp Java (original Activity) XML (phần khai báo cho activity được gọi) Uri uri = Uri.parse("call://ex.intent.uri/ActivityC"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="call" android:host="ex.intent.uri"/> </intent-filter>

126 Gởi dữ liệu qua tham số URI
Ý tưởng Nhúng tham số trong URI, tương tự như query string trong Web. Cú pháp Java (original Activity) Java (new Activity) Uri uri = Uri.parse("call://ex.intent.uri/ActivityC?str=hello class"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); Uri uri = getIntent().getData(); String str = uri.getQueryParameter("str"); // xử lý với chuỗi, nếu truyền là chuỗi số thì chuyển sang số

127 Extras vs. URI parameter
Pros Can send data of different types No parsing required in Activity that receives the data Cons More complex for originating activity Requires parsing in originating activity if values come from EditText URI parameters Pros: Simpler for originating Activity, especially if EditText used More consistent with URI usage Can send Strings only Requires parsing in receiving Activity

128 Activity với Tabbed Window
Ý tưởng Tạo tab window, mỗi tab là một activity Có thể gọi activity thông qua class hay URI Gởi dữ liệu thông qua extras Bundle hay URI Tab Window Activity và các activity phải cùng project. Cú pháp Java Mở rộng từ lớp TabActivity, sử dụng TabHost, TabSpec XML: (androidManifest.xml) Tương tự như phần trước.

129 Sử dụng TabActivity: outline

130 Activity với Tabbed Window
Tạo ứng dụng demo như sau:

131 Activity với Tabbed Window
Resources resource = getResources(); TabHost host = getTabHost(); Intent intent1 = new Intent(this, activity1.class); Drawable tabIcon1 = resource.getDrawable(R.drawable.b1); TabSpec tab1 = host.newTabSpec("Tab One").setIndicator("Activity 1",tabIcon1) .setContent(intent1); host.addTab(tab1); Intent intent2 = new Intent(this, activity2.class); Drawable tabIcon2 = resource.getDrawable(R.drawable.b2); TabSpec tab2 = host.newTabSpec("Tab Two").setIndicator("Activity 2",tabIcon2) .setContent(intent2); host.addTab(tab2); Intent intent3 = new Intent(this, activity3.class); Drawable tabIcon3 = resource.getDrawable(R.drawable.b3); TabSpec tab3 = host.newTabSpec("Tab Three").setIndicator("Activity 3",tabIcon3) .setContent(intent3); host.addTab(tab3);

132 Service Service là thành phần nền tảng của Android.
Đôi khi ứng dụng run process với khoảng thời gian lâu và không có hoặc hiếm khi có sự can thiệp từ người dùng. Tiến trình nền này có thể xử lý ngay cả khi phone được sử dụng cho activity/task khác. Các lớp thực thi service phải mở rộng từ lớp Service trong gói android.app.Service Các phương thức override là: onCreate, onDestroy, onStart

133 Sử dụng ToggleButton để on/off service
Minh hoạ: Tạo một service thực thi việc chạy file nhạc nền. Service này được gọi thông qua UI trên Activity. Sử dụng ToggleButton để on/off service

134 Ví dụ import file only_time.mp3 vào thư mục raw
Service Bước 1: Chuẩn bị file nhạc mp3. Tạo thư mục raw trong res (nếu chưa có raw) Import một file nhạc mp3 nào đó vào thư mục res/raw Ví dụ import file only_time.mp3 vào thư mục raw

135 Service Bước 2: Tạo layout cho activity chính của ứng dụng
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:text="Services Demo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="35dp" > </TextView> <ToggleButton android:text="ToggleButton" android:onClick="doService" > </ToggleButton> </LinearLayout>

136 Service Bước 3: Tạo một lớp mới extend từ Service
Tên lớp service sẽ tạo Extend từ lớp Service

137 Service Bước 4: Override các phương thức onCreate, onDestroy, onStart của service. Tạo đối tượng player là MediaPlayer public class MyService extends Service { private static final String TAG ="HaGService"; private MediaPlayer player; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } public void onCreate() { public void onDestroy() { public void onStart(Intent intent, int startId) {

138 Service Bước 5: viết các phần xử lý cho onCreate
Hiển thị một messge báo "Service created" Hiển thị thông tin debug trong LogCat Load file nhạc vào biến player Thiết lập cờ looping. @Override public void onCreate() { // TODO Auto-generated method stub Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show(); Log.d(TAG,"onCreate"); player = MediaPlayer.create(this, R.raw.only_time); player.setLooping(false); }

139 Service Bước 6: thực thi hàm onStart và onDestroy @Override
public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); player.start(); // chạy file nhạc } public void onDestroy() { Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); Log.d(TAG,"onDestroy"); player.stop(); // dừng file nhạc

140 Service Bước 7: viết phần xử lý cho sự kiện onClick của ToggleButton trong activity chính của ứng dụng public void doService(View view) { // tham chiếu đến ToggleButton ToggleButton btn = (ToggleButton)view; if (btn.isChecked()==true) { startService( new Intent(this,MyService.class) ); } else { stopService( new Intent(this,MyService.class) );

141 Service Bước 8: khai báo service trong AndroidManifest.xml
Việc khai báo service trong file AndroidManifest là bắt buộc. Nếu thiếu phần khai báo thì service sẽ không chạy được. <service android:name="MyService" android:enabled="true"></service> Tên của service Thiết lập trạng thái của Service là anable

142 Phần tìm hiểu thêm Broadcast Receivers
Thành phần có thể respond lại các thông báo của hệ thống. VD: Thông báo màn hình bị tắt, pin yếu, ảnh được chụp Thông báo cuộc gọi đến, tin nhắn đến… Ngoài ra ứng dụng cũng có thể khởi tạo broadcast để báo cho ứng dụng khác hay hệ thống biết thông tin gì đó Ứng dụng báo đã hoàn thành việc download về thiết bị và sẵn sàng cho việc sử dụng. Có thể dùng để start một service chạy nền nào đó.

143 Phần tìm hiểu thêm Content providers
Quản lý sự chia sẻ dữ liệu của ứng dụng. Bao gồm các dạng Shared preferences Internal storage Local cache External storage SQLite database (Chapter 12: Android App Dev for Dummies) Network connection


Download ppt "Nguyen Ha Giang FIT – Hutech"

Similar presentations


Ads by Google