Phát triển ứng
dụng
Smartphone
Tài liệu lưu hành nội bộ
u tham kho s dng trong môn hc Lp trình ng dng Smartphone Android
c tng hp, biên son t nhiu ngun bi các thành viên ca Nhóm nghiên cu và ng dng công
ngh A106-i hc Hoa Sen.
Nhóm A106-
Phát triển ứng dụng Smartphone – Android
1
Phát triển ứng
dụng Smartphone
Phần 02: Giao diện người dùng
c Huy
Email:
Phát triển ứng dụng Smartphone – Android
2
Mục lục
1 ViewGroup 4
1.1 LinearLayout 5
1.2 AbsoluteLayout 12
1.3 TableLayout 14
1.4 RelativeLayout 16
1.5 FrameLayout 19
1.6 ScrollView 21
2 View 24
2.1 Basic Views 24
2.1.1 ProgressBar View 35
2.1.2 AutoComplete TextView 42
2.2 PickerView 46
2.2.1 TimePicker 46
2.2.2 DatePicker 50
2.2.3 List Views 54
2.2.4 Spinner View 57
2.3 Display Views 62
2.3.1 Gallery and ImageView 62
2.3.2 ImageSwitcher 69
2.3.3 GridView 74
2.4 Menus 77
2.5 Additional View 87
2.5.1 AnalogClock và DigitalClock 87
2.5.2 WebView 89
Phát triển ứng dụng Smartphone – Android
3
Ti thm này, bn có th thy rng thành phn ca mt ng dng android chính là
Activity. Activity
t vin trong m
n viwindow
t giao dii dùng bc setContentView(View). Ta có
th xem Activity là mt ca s ng dng. M
toàn màn hình (full screen window), m
trong mActivityGroup). Ca s ng dng mà Activity to ra có th cha các
widgets ng, xây dng giao dii dùng ta s dng
file xml ha mun th hin lên giao dii
dùng cùng vi các thung quynh cách thc th hi ha s
ng dngt ví d ha th hin giao dii
dùng ca ng dng:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
</LinearLayout>
c thi, giao di hc np t c onCreate()
bng cách s dc setContentView() ca Activity ch nh file xml mong mun.
Ví dụ:
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Khi mã code cc biên dch, mi phn t c biên dch thành
nh hng cùng vi các thuc cung cp kèm theo các phn t trong
th to ra các th hin c hi dùng cung cp cho
c np.
Vic xây dng mt giao dii dùng bng cách s dng file xml rn, tuy nhiên s
tn rt nhiu thi gian nu nhà lp trình cn phi xây dng giao di hi dùng mt các linh
Phát triển ứng dụng Smartphone – Android
4
hot trong lúc thc thi (Ví d: Khi xây dng game). Tuy nhiên các nhà phát trin ng dng vn có th
xây dng giao di hi dùng bng cách s dng câu lnh.
Views and ViewGroups
Mt Activity chng View ng ViewGroup. Mng View là
m ho dùng hin th ni dung lên màn hình. Ví d: Button, lt
View c dn sut t các class: android.view.View.Mt hoc nhiu View có th c nhóm li cùng
nhau bên trong mt ViewGroup. Mt ViewGroup cung cp kh b
ho cha trong nó mt cách phù hp. Có th s d b tr ho
theo dòng, theo ct, theo dng bng hay theo s ch nh to c th. Mi ViewGroup c dn xut
t class android.view.ViewGroup. Android h tr các ViewGroup
LinearLayout
AbsoluteLayout
TableLayout
RelativeLayout
FrameLayout
ScrollView
i các bài hc s nói rõ v tng loi ViewGroup mt cách chi ti
rng, trong các bài thng xuyên lng các loi ViewGroup v xây dng
mt giao dii dùng.
1 ViewGroup
Tạo 1 Project đơn giản
ng dn này, chúng ta s to mt project android vi các thông s
Project name: UIExample
Build target: Android 2.3.3.
Application name: UI Example
Package name: android.uiexample
Create Activity: main
Phát triển ứng dụng Smartphone – Android
5
1.1 LinearLayout
LinearLayout là loi ViewGroup cho phép sp xng View (cha trong nó) trong
mt c thy cách mt LinearLauout làm vi nào, hãy b sung
vào file main.
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android=" />ndroid"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
Trong file main.xml này, ta quan sát thy rng phn t gc là <LinearLayout> và nó có cha
mt thành phn <TextView>. Phn t <LinearLayout> s nh cách hin th ca các ng
View cha trong nó thông qua các thuc tính.
View và ViewGroup có mt tp các thuc tính rt hay s dng c lit kê qua bng sau:
Thuộc tính
Đặc tả
layout_width
nh chiu rng ca mt View hoc ViewGroup
layout_height
nh chiu cao ca mt View hoc ViewGroup
layout_marginTop
nh phn m rng phía bên trên ca View hoc ViewGroup
layout_marginBottom
nh phn m ri ca View hoc ViewGroup
layout_marginLeft
nh phn m rng phía bên trái ca View hoc ViewGroup
layout_marginRight
nh phn m rng phía bên phi ca View hoc ViewGroup
layout_gravity
ng View con
layout_weight
nh phc th hin ca View hoc ViewGroup (S dng
vi thuc tính layout_width ho c gán giá tr
fill_parent wrap_contentc giá tr c nh: 100px)
layout_x
nh to x ca the View hoc ViewGroup
layout_y
nh to y ca the View hoc ViewGroup
Phát triển ứng dụng Smartphone – Android
6
Chú ý rng mt vài các thuc tính trên ch c s dng khi m
trong mt ViewGroup c th.
Ví d:
- Hai thuc tính layout_weight và layout_gravity ch c s dng nu View nm trong
LinearLayout hoc là trong TableLayout.
Xem xét phn code xml sau:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
- Phn t TextView trên có chiu rng bng vi chiu rng ca phn t cha ca nó
(fill_parent- ng hp này nó bng vi chiu rng màn hình). Chiu cao trong
ng hp này, khi bn khai báo là wrap_content thì chiu cao ca nó s là chiu cao cn
thit mà ni dng ca TextView dùng hin th n text.
ng hp , chiu rng ca TextView t là 105 pixels.
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
<TextView
android:layout_width="105px"
android:layout_height="wrap_content"
android:text="@string/hello">
</TextView>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="Button">
</Button>
</LinearLayout>
Khi phn code giao dic np lên Activity s c giao din :
Phát triển ứng dụng Smartphone – Android
7
M nh ca LinearLayout s sp x ho (View) trong nó theo chiu
ngang, nu bn mui nó thành chiu dc bn có th sa phn code phn t gc LinearLayout
l
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="
<TextView
android:layout_width="105px"
android:layout_height="wrap_content"
android:text="@string/hello">
</TextView>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="Button">
</Button>
Phát triển ứng dụng Smartphone – Android
8
</LinearLayout>
B i thuc tính android:orientation=“vertical” i cách
LinearLayout sp x ho bên trong nó. Thuc tính android:orientation có th gán
hai giá tr ng sau:
- vertical ho cha trong LinearLayout c sp xp
theo chiu dc.
- horizontal ho cha trong LinearLayout c sp
xp theo chiu ngang.
Giá tr ca thuc m ho c phân thành hai loi:
- Giá tr c nh c th giá tr c. Ví d: 150px).
- Giá tr linh hot. Giá tr này ph thuc vào mt trong hai yu t:
o Ni dung mà m ho mun hin th.Vi View thì nn
i ViewGroup là các phn t con mà nó cha.
Phát triển ứng dụng Smartphone – Android
9
o Phn ng cha còn trng.
Trong LinearLayout bn có th áp dng các thuc tính layout_weight và layout_gravity
sau:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<Button
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="Button"
android:layout_gravity="right"
android:layout_weight="0.2"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_weight="0.8"/>
</LinearLayout>
Hình sau s hin th Button c gán vào bên phi ca phn t cha c
này là LinearLayout) s dng thuc tính layout_gravity, và s dng thuc tính layout_weight cho
các Button, EditText (tng giá tr ca layout_weight bng 1). Sau khi np phn giao din trên vào
Activity ta s c giao di
Phát triển ứng dụng Smartphone – Android
10
Phân tích phn giao din bên trên ta s thy rng:
- Th gc ca toàn b giao din là LinearLayout vi hai thuc tính
android:layout_width=“fill_parent”và android:layout_height=“fill_parent”nh
chiu rng và chiu cao LinearLayout s chim toàn chiu rng và chiu cao cng
ch LinearLayout này là th gc (Th ngoài cùng) nên nó s t
n thoi khi ng dc m lên. Vì vy nó s chim toàn b chiu rng
và chiu cao cn thong hp giá tr c ca mi
ho là linh hot và ph thuc vào không gian còn trng cng cha (Trong
ng hn thoa gì hc xem
là rng).
- Th TextView có thuc tính android:layout_width="fill_parent" và
android:layout_height=“wrap_content” xác c chiu ngang ca TextView
s chim toàn b khong trng còn li ng cha nó (LinearLayout), và chiu cao ca
TextView s ph thuc vào ni dung nó cn hin th (TextView chim mt khong chiu
cao bng vi chiu cao c hin th ).
Phát triển ứng dụng Smartphone – Android
11
- Th Button có thuc tính android:layout_width=“100px”c chiu rng
ca nó là 100pxng hp mà giá tr c ca m ho là
c nh (Chiu rng = 100px).
- Th Button có thuc tính android:layout_gravity="right"nh rng Button
c np lên giao din s canh l bên phi so vng cha nó.
Bng sau lit kê các giá tr có th gán cho thuc tính android:layout_gravity:
Giá trị
Mô tả
top
này không .
bottom
.
left
.
right
.
center_vertical
.
fill_vertical
nó.
center_horizontal
.
fill_horizontal
center
.
fill
ViewGroup
clip_vertical
Additional option that can be set to have the top and/or bottom edges of the
child clipped to its container's bounds. The clip will be based on the vertical
gravity: a top gravity will clip the bottom edge, a bottom gravity will clip the
top edge, and neither will clip both edges.
clip_horizontal
Additional option that can be set to have the left and/or right edges of the child
clipped to its container's bounds. The clip will be based on the horizontal
gravity: a left gravity will clip the right edge, a right gravity
Phát triển ứng dụng Smartphone – Android
12
Thuc tính android:layout_gravity có th gán nhit thuc tính.
VD: android:layout_gravity:“top|left”
C hai th Button và EditText u có thuc tính android:layout_height=“wrap_content”và
android:layout_weight vi các giá tr ng: Button: 0.2 EditText: 0.8.Nu thuc tính kích
c ca m ho (android:layout_height và android:layout_width) nh là
wrap_content c này s v hin th ni dung ca nó (Vi View thì ni dung này là
i ViewGroup là các phn t con mà nó cha). Tuy nhiên nu s dng thêm thuc tính
android:layout_weight thì c c ho này s ph thuc vào giá tr ca thuc
tính này. gii thích v cách s dng thuc tính android:layout_weight ta xem xét li ví d
sau:
- Ta có mt th gc LinearLayout chng TextView, Button, EditText. C ba
c sp xp theo chiu dc t trên xung.
- Chiu cao ca TextView là “wrap_content” có m cao v hin th
mn text c -Ta s bàn v khái nim @string/hello phn sau
ca giáo trình).
- c chiu cao ca TextView thì ta s còn li mt khong tr
sp xp Button và EditText. Ta gi khong trng này là H. Chiu cao cng
wrap_content android:layout_weightlt là 0.2 và 0.8.Lúc này
chiu cao ca Button s là 0.2*H và chiu cao ca EditText là 0.8*H.
Ta cng tng android:layout_weightcng trong cùng mt
ViewGroupluôn là 1.0 (android:layout_weight ca Button + android:layout_weight caEditText =
1.0)
1.2 AbsoluteLayout
AbsoluteLayout cho bn ch nh chính xác v trí ca các thành phn con, xem xét ví d sau:
<?xmlversion="1.0"encoding="utf-8"?>
<AbsoluteLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
<Button
android:layout_width="188px"
android:layout_height="wrap_content"
android:text="Button"
android:layout_x="126px"
android:layout_y="361px"
/>
<Button
Phát triển ứng dụng Smartphone – Android
13
android:layout_width="113px"
android:layout_height="wrap_content"
android:text="Button"
android:layout_x="12px"
android:layout_y="361px"
/>
</AbsoluteLayout>
Khi np phn code xml trên lên Activity thì ta s c giao di
ví d trên xut hin thêm hai thuc tính là:
- android:layout_x: nh to x cng trong to Oxy.
- android:layout_ynh to x cng trong to Oxy.
Gc to nh m trên cùng góc trái ca ViewGroupgn
nht cha nó.
Phát triển ứng dụng Smartphone – Android
14
1.3 TableLayout
TableLayout t chc các ng Viewi dng mt bng gm nhiu hàng, nhiu
ct. Mc th hin bng mt th <TableRow>i dòng có th cha mt hoc
nhing View. Mt trên mt dòng s to thành mt ô trong giao din bng
do TableLayout to ra. Chiu rng ca mi cc nh bng chiu rng ln nht ca các ô nm
trên cùng mt ct.
Ví d:
<?xmlversion="1.0"encoding="utf-8"?>
<TableLayout
xmlns:android="
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:background="#000044">
<TableRow>
<TextView
android:text="User Name:"
android:width="120px"
/>
<EditText
android:id="@+id/txtUserName"
android:width="200px"/>
</TableRow>
<TableRow>
<TextView
android:text="Password:"
/>
<EditText
android:id="@+id/txtPassword"
android:password="true"
/>
</TableRow>
<TableRow>
<TextView/>
<CheckBox
android:id="@+id/chkRememberPassword"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Remember Password"
/>
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonSignIn"
android:text="Log In"/>
Phát triển ứng dụng Smartphone – Android
15
</TableRow>
</TableLayout>
Khi np phn code xml trên lên Activity thì ta s c giao di
ví d trên, giao di ho c t chi dng mt bàng gm có bn dòng vi hai ct.
Ô i ô cha TextView Password có mt th <TextView/>rng. Nt th này, thì
CheckBox Remember Password s xut hii TextView
Phát triển ứng dụng Smartphone – Android
16
1.4 RelativeLayout
RelativeLayout cho phép bn ch nh mi quan h gia các ng View/ViewGroup. Ta
xét ví d sau:
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayout
android:id="@+id/RLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
>
<TextView
android:id="@+id/lblComments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Comments"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
Phát triển ứng dụng Smartphone – Android
17
/>
<EditText
android:id="@+id/txtComments"
android:layout_width="fill_parent"
android:layout_height="170px"
android:textSize="18sp"
android:layout_alignLeft="@+id/lblComments"
android:layout_below="@+id/lblComments"
android:layout_centerHorizontal="true"
/>
<Button
android:id="@+id/btnSave"
android:layout_width="125px"
android:layout_height="wrap_content"
android:text="Save"
android:layout_below="@+id/txtComments"
android:layout_alignRight="@+id/txtComments"
/>
<Button
android:id="@+id/btnCancel"
android:layout_width="124px"
android:layout_height="wrap_content"
android:text="Cancel"
android:layout_below="@+id/txtComments"
android:layout_alignLeft="@+id/txtComments"
/>
</RelativeLayout>
Chú ý rng mc nhúng bên trong RelateLayout có các thuc tính cho phép xác nh
mi quan h gia chúng vi RelativeLayout cha nó hoc các View, ViewGroup khác. Mt s thuc
tính
- layout_alignParentTop: Thuc tính này có hai giá tr true/false. Nng
ho này s nm sát trên cùng ca RelativeLayout cha nó.
- layout_alignParentBottom: Thuc tính này có hai giá tr true/false. N i
ho này s nm sát i cùng ca RelativeLayout cha nó.
- layout_alignParentLeft:Thuc tính này có hai giá tr true/false. Nng
ho này s nm sát bên trái ca RelativeLayout cha nó.
- layout_alignParentRight: Thuc tính này có hai giá tr true/false. Nng
ho này s nm sát bên phi ca RelativeLayout cha nó.
- layout_alignLeft: Thuc tính nh id cng View hoc ViewGroup mà nó
s nm bên trái c
Phát triển ứng dụng Smartphone – Android
18
- layout_alignRight: Thuc tính nh id cng View hoc ViewGroup mà nó
s nm bên phi c
- layout_below: Thuc tính nh id cng View hoc ViewGroup mà nó s
nm bên i c
- layout_above: Thuc tính nh id cng View hoc ViewGroup mà nó s
nm
- layout_centerInParent: Thuc tính này có hai giá tr true/false. Nng
ho này s nm chính gia ca RelativeLayout cha nó.
- layout_centerHorizontal:Thuc tính này có hai giá tr true/false. Nng
ho này s canh gia theo chiu ngang so vi RelativeLayout cha nó.
- layout_centerVertical: Thuc tính này có hai giá tr true/false. N
ho này s canh gia theo chiu dc so vi RelativeLayout cha nó.
Khi np phn code xml trên lên Activity thì ta s c giao di
Phát triển ứng dụng Smartphone – Android
19
1.5 FrameLayout
FrameLayout là c biêt có th s d hin th mt t c các i
ng t trong FrameLayout s luôn trên cùng bên trái ca FrameLayout.
Xem xét n code xml sau:
<?xmlversion="1.0"encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget68"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="40px"
android:layout_y="35px">
<ImageView
android:src="@drawable/android_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</FrameLayout>
</AbsoluteLayout>
có mt FrameLayout bên trong mt AbsoluteLayout. Bên trong FrameLayout, bn
nhúng mt ImageView. Sau khi np phn code xml trên lên Activity bn s c giao di
Phát triển ứng dụng Smartphone – Android
20
Nu ta thêm mt View khác (Mt Button) bên trong FrameLayout, View mi thêm vô s nm
c :
<?xmlversion="1.0"encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget68"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="40px"
android:layout_y="35px"
>
<ImageView
android:src="@drawable/android_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Phát triển ứng dụng Smartphone – Android
21
/>
<Button
android:layout_width="124px"
android:layout_height="wrap_content"
android:text="Print Picture"
/>
</FrameLayout>
</AbsoluteLayout>
Sau khi np lên Activity ta s c giao di
Bn có th thêm nhiu View vào chnh ca View
m sát góc trên cùng bên trái ca FrameLayout cha nó.
1.6 ScrollView
Mt ScrollView là mt ng hc bit ca FrameLayout i s dng
cun qua mng View hoc ViewGroup chim gi không gian hin th l
so v n thoi h tr. ScrollView ch có th cha duy nht m ng View hoc
ng là LinearLayout).
Phát triển ứng dụng Smartphone – Android
22
Chú ý: Không s dng ListView cùng vi ScrollView. ListView c thit k hin th mt
danh sách các ng có liên h vc t phù hp
vi nhng danh sách ln.
Ví d sau minh ha ScrollView cha mt LinearLayout:
Thn code trên bn s c kt qu au:
<?xmlversion="1.0"encoding="utf-8"?>
<ScrollView
android:id="@+id/widget54"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="
>
<LinearLayout
android:layout_width="310px"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 1"
/>
<Button
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 2"
/>
<Button
android:id="@+id/button3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 3"
/>
<EditText
android:id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="300px"
/>
<Button
android:id="@+id/button4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
Phát triển ứng dụng Smartphone – Android
23
android:text="Button 4"
/>
<Button
android:id="@+id/button5"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 5"
/>
</LinearLayout>
</ScrollView>
Sau khi np phn code xml trên lên Activity ta s c giao di
Giao din trên cho phép ta dùng ngón tay vut lên màn hình theo chiu t i lên.
Phát triển ứng dụng Smartphone – Android
24
2 View
n ca giao di ho trên Android chính là View. Mi din cho mt
widget, trong bài hc này bn s c hc v s khác nhau gia các View mà bn có th s dng nó
trong quá trình phát trin ng dng android.
t danh mc các loi View mà chúng ta s cp trong bài này:
- Basic View: ng xuyên s dng
Button.
- Picker Viewi dùng ng dng la chn mt
ng hin th i dng mt danh
sách các la ch
- Display View hin th hình
ImageSwitcher.
- Menu to giao din menu la chn
- Additional View: nh
To mt project mi vi các thông s
Project name: UIExample
Build target: Android 2.3.3.
Application name: UI Example
Package name: android.uiexample
Create Activity: main
2.1 Basic Views
Trong phn này, ta s n trong android mà cho phép hin th mn
vc hin mt s các la chn. Ta s tin hành tìm hiu v
- TextView
- EditText
- Button
- ImageButton
- CheckBox