2.4.1 XML unit
Bên khung Project Explorer bên trái đi tới thư mục res, có 3 thư mục con:
- drawable: thư mục chứa các hình ảnh để làm icon hoặc tài nguyên cho
giao diện...
- layout: chứa các file xml để thiết kế giao diện.
- values: chứa các giá trị sử dụng trong ứng dụng được người lập trình
định nghĩa, như các dòng ký tự (string), các màu (color), các themes...
- raw: chứa các file âm thanh dùng trong ứng dụng.Một số các thuộc tính để điều chỉnh cho cách thành phần giao diện, các thuộc tính này được gọi ra kèm với tiền
Hình 2.2: Project Explorer
layout_width: chiều rộng của thành phần
layout_height: chiều cao của thành phần
layout_marginTop: khoảng cách từ thành phần đó lên cạnh trên của màn hình layout_marginBottom: khoảng cách từ thành phần đó lên cạnh trên của
màn hình
layout_marginLeft: khoảng cách từ thành phần đó sang cạnh trái của
màn hình
layout_marginRight: khoảng cách từ thành phần đó sang cạnh phải của
màn hình
layout_gravity: vị trí của thành phần trên màn hình
layout_x, layout_y: toạ độ hiển thị của thành phần trên màn hình (cái này
sử dụng với AbsoluteLayout).
Mã: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:id="@+id/edit_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/edit_hint"/> <TextView android:id="@+id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/text_color" android:textSize="28px" android:typeface="monospace"/> </LinearLayout>
Trong đoạn XML này được khai báo một Linear Layout với 2 thành phần con của nó là 1 Edit Text (dùng để gõ xâu ký tự) với 1 Text View (hiển thị xâu ký tự). Linear Layout được khai báo với từ khóa orientation nhằm chỉ ra chiều sắp xếp của 2 thành phần con là chiều dọc. Còn với layout_width, layout_height có thể cho giá trị bằng "fill_parent" hoặc "wrap_content" để thông báo thành phần này sẽ có chiều rộng (dài) phủ đầy thành phần cha hoặc chỉ vừa bao đủ nội dung.
Trong Edit Text và Text View có từ khóa id, từ khóa này cho phép khai báo id của các thành phần để lấy về trong code
Ngoài ra từ khóa hint trong Edit Text cho phép hiện ra phần nội dung mờ khi Edit Text vẫn chưa có ký tự nào. "@string/edit_hint" thông báo lấy trong file strings.xml xâu có tên là edit_hint. textColor của Text View thông báo đoạn
ký tự sẽ được hiển thị với màu lấy trong file colors.xml, textSize chỉ ra cỡ chữ bằng 28 pixel và typeface chỉ ra kiểu chữ là monospace.
Ví dụ file strings.xml. Khai báo và định nghĩa cho các chuỗi được sử dụng ở main
Mã:
<?xml version="1.0" encoding="utf-8"?> <resources>
<string name="hello">Hello World, Example!</string> <string name="app_name">Example 1</string>
<string name="edit_hint">Enter the work here</string> </resources>
Ví dụ file colors.xml. Khai báo và định nghĩa các màu cần dùng: Mã:
<?xml version="1.0" encoding="utf-8"?>
<resources> <color name="text_color">#ff3300</color> </resources>
Thực chất hoàn toàn có thể viết: Mã:
android:textColor="#ff3300"
Trong file main.xml mà không cần tạo mới file colors.xml, nhưng mục đích của XML trong Android chính là để hỗ trợ nâng cấp chỉnh sửa dễ dàng. Nếu sau này muốn sửa màu của dòng text thì chỉ cần vào colors.xml thay đổi thay vì mò mẫm trong main.xml.
Các thành phần trên mới chỉ là các phần cơ bản của XML.
Để hiển thị giao diện thiết kế bằng XML lên màn hình thì cần dùng java để gọi liên kết
Để gọi hoặc lấy dữ liệu từ giao diện đó cho việc xử lý hoạt động thì cần sử dụng findViewById:
package tunghuynh.netau.net; import ...;
public class Example1_XMLActivity extends Activity { /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
//Thiết lập giao diện lấy từ file main.xml setContentView(R.layout.main);
//Lấy về các thành phần trong main.xml thông qua id final EditText edit = (EditText) findViewById(R.id.edit_text); final TextView text = (TextView) findViewById(R.id.text_view); //Thiết lập xử lý cho sự kiện nhấn nút giữa của điện thoại edit.setOnKeyListener(new OnKeyListener() { @Override
public boolean onKey(View v, int keyCode, KeyEvent event) { //... code here ...
} }); } }
Trong Android, các lớp sử dụng để tạo giao diện (Edit Text, Text View...) đều là lớp con của lớp View.
Một số lớp thường xuyên được sử dụng để tạo giao diện: - TextView: Hiển thị chuỗi lên màn hình
- EditText: Tạo ô để nhập dữ liệu
- ListView: Hiển thị 1 danh sách các phần tử lên màn hình - Spinner: Hộp combobox chọn phần tử
- Button: Nút bấm - RadioButton: Ô chọn
Ngoài ra có thể tạo 1 View riêng của mình bằng cách kế thừa View có sẵn. Các Listener được sử dụng để bắt 1 sự kiện nào đó. Ở đây sử dụng OnKeyListener dùng để bắt sự kiện khi nhấn 1 phím của điện thoại. Ngoài ra thường sử dụng OnClickListener để bắt sự kiện chạm vào 1 View đang hiển thị trên màn hình. Mỗi View đều phải set Listener riêng để xử lý cho sự kiện tương tác với nó, và mỗi loại View cũng lại có những Listener dành riêng cho nó (VD: CheckBox có OnCheckChangedListener). Các sự kiện này nằm trong lớp View của android.view
Lưu ý thêm phần R.id.edit_text. Để lấy hoặc truy nhập các thành phần ta đã định nghĩa trong XML ta phải sử dụng R.* như R.layout.main, R.id.edit_text. Lệnh findViewById sẽ trả về 1 View có Id thiết lập trong phần XML. Do View là lớp cha của EditText với TextView nên ở đây ta phải ép kiểu.
Ngoài ra các string hay color cũng có thể lấy về bằng lệnh getResource() . Vd: getResource().getColor(R.color.text_color)
2.4.2 Các lay out
Layout được dùng để quản lý các thành phần giao diện khác theo 1 trật tự nhất định.
- FrameLayout: Layout đơn giản nhất, hiển thị các thành phần con vào
góc trên bên trái của màn hình.
- LinearLayout: Hiển thị các thành phần con theo 1 chiều nhất định
(ngang hoặc dọc). LinearLayout làm cho các thành phần trong nó không bị phụ thuộc vào kích thước của màn hình. Các thành phần trong LinearLayout được dàn theo tỷ lệ cân xứng vào các ràng buộc giữu các thành phần. Đây là layout được sử dụng nhiều nhất.
- RelativeLayout: Hiển thị các thành phần con dựa trên mối quan hệ với các thành phần khác hoặc với biên của layout.
- TableLayout: Hiển thị các thành phần con dựa trên 1 lưới các ô ngang và dọc.
- AbsoluteLayout: Hiển thị các thành phần con dựa theo tọa độ x, y.
Layout được sử dụng nhằm mục đích thiết kế giao diện cho nhiều độ phân giải. Thường khi lập trình nên kết hợp nhiều layout với nhau để tạo ra giao diện mong muốn.
2.4.3 Android Manifest
Mỗi ứng dụng đều cần có AndroidManifest.xml để mô tả những thông tin quan trọng của nó cho hệ thống Android biết.
File này được tự động tạo ra khi tạo project nhưng nếu dùng đến intent hay dùng thêm activity thì phải khai báo bổ sung vào file này để hệ thống chấp nhận và có thể sử dụng. Mã: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tunghuynh.netau.net" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Example1_XMLActivity" android:label="@string/app_name android:screenOrientation="landcape" android:theme="@android:style/Them.NotitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>
Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.
- Mô tả các thành phần (component) của ứng dụng: activity, service, broadcast receiver hoặc content provider.
- Thông báo những permission mà ứng dụng cần có để truy nhập các protected API và tương tác với các ứng dụng khác.
- Thông báo những permission mà các ứng dụng khác cần có để tương tác với ứng dụng hiện thời.
- Thông báo level thấp nhất của Android API mà ứng dụng cần để chạy. (Android 1.0 là level 1, 1.1 là level 2, 1.5 level 3, 1.6 level 4 và 2.0 là level 5)....
- Ngoài ra, từ khoá screenOrientation cho phép thiết lập giao diện khi vào ứng dụng theo chiều dọc (portrait – mặc định) hay ngang (landcape), theme cho phép sử dụng style có sẵn của android là fullscreen (không có thanh status nữa).
2.4.4 File R.java
File R.java là một file tự động sinh ra ngay khi tạo ứng dụng, file này được sử dụng để quản lý các thuộc tính được khai báo trong file XML của ứng dụng và các tài nguyên hình ảnh.
Mã nguồn của file R.java được tự động sinh khi có bất kỳ một sự kiện nào xảy ra làm thay đổi các thuộc tính trong ứng dụng. Chẳng hạn như, kéo và thả một file hình ảnh từ bên ngoài vào project thì ngay lập tức thuộc tính đường dẫn file đó cũng sẽ được hình thành trong file R.java hoặc xóa một file hình ảnh thì đường dẫn tướng ứng đến hình ảnh đó cũng tự động bị xóa.
Có thể nói file R.java hoàn toàn không cần phải đụng chạm gì đến trong quá trong cảquá trình xây dựng ứng dụng.
Dưới đây là một nội dung của một file R.java package tunghuynh.netau.net;
public final class R {
public static final class attr { } public static final class drawable {
public static final int icon=0x7f020000; }
public static final class id {
public static final int textview=0x7f050000; }
public static final class layout {
public static final int main=0x7f030000; }
public static final class string {
public static final int app_name=0x7f040001; public static final int hello=0x7f040000; }
}
2.4.5. Button và ToggleButton
Đây là thành phần diện cho một widget . Button có thể được nhấn, hoặc bấm bởi người sử dụng để thực hiện một hành động. Với Button thông thường thì chỉ sự kiện chính là button được nhấn, còn với ToggleButton thì có 2 chế độ khi nhấn đó là tắt và bật, nó giống như một công tắc điện
Ví dụ 1 button và togglebutton cơ bản, gồm có các thành phần như id, kích thước và tên hiển thị.
Mã: <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" />
Mã: <ToggleButton android:id="@+id/toggleButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ToggleButton" />
Để bắt và xử lý sự kiện khi người dùng bấm vào button thì có thể xử lý bằng java. Trước tiên cần lấy được button đó thông qua id đã khai báo, và trong button thì có nhiều sự kiện nhưng thông dụng nhất vẫn là sự kiện khi nhấn phím OnClickListener
Mã:
Button btn = (Button)findViewById(R.id.button3); btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { // code hoạt động ở đây }
});
2.4.6 TextView và EditText
TextView là một thành phần dùng để hiển thị một nội dung dạng text lên màn hình. Ngoài tác dụng là để hiển thị văn bản thì nó còn cho phép định dạng nội dung bằng thẻ html. Mã: <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView"
android:textAppearance="?android:attr/textAppearanceLarge" />
android:textAppearance là thuộc tính của TextView cho phép định dạng
cỡ chữ hiển thị, có 4 cỡ chính đó là dạng mặc định (cỡ vừa), Large (cỡ lớn), Small(cỡ nhỏ), Medium(cỡ trung bình).
EditText là 1 ô để nhập dữ liệu từ phần cứng như bàn phím, màn hình của thiết bị. Mã: <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Enter here" android:inputType="numberPassword" />
android:inputType là thuộc tính của EditText cho phép định dạng dữ liệu
nhập vào. Có nhiều định dạng như:
Mặc định: nhập text bình thường numberPassword: Nhập password textEmailAddress: Nhập email phone: Nhập số điện thoại
textPostalAddress: Nhập địa chỉ
textMultiLine: Cho phép nhập trên nhiều dòng date, time: Nhập kiểu ngày và giờ
number: Nhập số nguyên
numberSigned: Nhập số có dấu
2.4.7 CheckBox và RadioButton
CheckBox và RadioButton đều tạo ra các ô chọn. CheckBox cho phép chọn được nhiều ô cùng lúc, còn RadioButton chỉ cho phép chọn 1 ô tại 1 thời điểm.
Mã: <CheckBox android:id="@+id/check_work" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:paddingTop="45px" android:paddingRight="10px" /> Mã: <RadioButton android:id="@+id/radioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RadioButton" />
Tất cả các thành phần widget trong android đều có một số thuộc tính cơ bản chung như vị trí, kích thước, mà sắc, tên hiển thị,... dưới đây là một hình ảnh minh hoạ về các thành phần đã nói trên.
Hình 2.3: Minh hoạ cho Button, EditText, CheckBox
2.5 SQLite
SQLite là một dạng CSDL tương tự như Mysql, PostgreSQL... Đặc điểm của SQLite là gọn, nhẹ, đơn giản. Chương trình gồm 1 file duy nhất vỏn vẹn chưa đến 500kB, không cần cài đặt, không cần cấu hình hay khởi động mà có thể sử dụng ngay. Dữ liệu database cũng được lưu ở một file duy nhất. Không có khái niệm user, password hay quyền hạn trong SQLite database.
SQLite không thích hợp với những hệ thống lớn nhưng ở quy mô vừa tầm thì SQLite phát huy uy lực và không hề yếu kém về mặt chức năng hay tốc độ. Với các đặc điểm trên SQLite được sử dụng nhiều trong việc phát triển, thử nghiệm v..v.. và là sự lưa chọn phù hợp cho những người bắt đầu học database.
Hiện nay thì SQLite đã được ứng dụng vào smartphone như iPhone và Android để lưu trữ dữ liệu.
Để có thể dễ dàng thao tác với SQLite chúng ta có thể sử dụng chương trình quản lý database của Sqlite là Sqlite Browser.
Hình 2.4: Chương trình SQLite Database Browser Một số đặc điểm chính của SQLite
Đảm bảo đầy đủ 4 đặc tính ACID của các giao tác: tuy cực kỳ nhỏ gọn nhưng các giao tác làm việc với SQLite được đảm bảo đầy đủ 4 tính chất cơ bản của giao tác là tính nguyên tổ (Atomic), tính nhất quán (Consistent), tính cô lập (Isolated), và tính bền vững (Durable) thậm chí sau khi hệ thống bị crash hoặc gặp các sự cố về nguồn điện.
Không cần cấu hình: với SQLite chúng ta sẽ không cần phải cài đặt hay quản trị nó
SQLite có gần như toàn bộ các đặc tính phổ biến của SQL theo chuẩn SQL92. Tuy nhiên còn một số tính năng như RIGHT OUTER JOIN, FULL OUTER JOIN, FOR EACH STATEMENT TRIGGER,... chưa được hỗ trợ
Toàn bộ Database được lưu trữ trong 1 tập tin trên đĩa duy nhất
Hỗ trợ CSDL lên tới hằng TetraByte, trong đó các kiểu dữ liệu chuỗi và blobs lên tới hằng GigaByte.
Bộ thư viện quản lý rất nhỏ, gọn: dưới 500 KB cho bản đầy đủ tính năng, và có thể ít hơn nếu loại bớt một số đặc tính. Cụ thể, kích thước phiên bản SQLite 3.7.17 (Phiên bản hiện tại, mới nhất của SQLite) ít hơn 350 KB trên hệ điều hành 32 bit và ít hơn 409 KB trên các hệ thống 64 bit.
Hầu hết các thao tác trên dữ liệu thông thường đều chạy nhanh hơn các Database Engine theo kiểu Client/Server phổ biến khác.
Đơn giản và dễ sử dụng bộ API tương ứng
Mã nguồn mở được viết bằng ANSI-C, được comment rất tốt và có thể tái sử dụng với bất cứ mục đích gì.
SQLite có thể được tải về và nhúng vào các dự án khác nhau dưới hình thức một Single ANSI-C source-code file
Tự tổ chức lưu trữ (self-contained) mà không phải phụ thuộc vào các thư viện bên ngoài. Đây là một đặc điểm khá quan trọng khiến SQLite trở thành CSDL phù hợp để nhúng vào các thiết bị di động hoặc tích hợp vào các ứng dụng muốn chạy mà không cần phải điều chỉnh cấu hình hệ thống.
Trong bộ thư viện SQLite có sẵn 1 client đơn giản giao tiếp theo chế độ dòng lệnh (Command-Line Interface – CLI) tên là sqlite3 (trên môi trường Windows là tiện ích sqlite3.exe) để có thể được dùng để quản trị CSDL SQLite
Ứng dụng cơ sở dữ liệu SQLite:
Do đặc điểm được thiết kế của SQLite ngay từ đầu, nên CSDL nhúng này phù hợp với một số tình huống sử dụng như sau:
SQLite có thể sử dụng như định dạng tập tin thích hợp cho các ứng dụng: trước đây các tập tin cấu hình có thể được lưu dưới dạng file .ini, rồi sau đó là .xml,... tuy nhiên chúng ta sẽ cần phải viết hoặc phụ thuộc vào việc sử dụng các parser phù hợp. Sử dụng SQLite không những giúp chúng ta khắc phục được yếu điểm này mà chương trình của chúng ta lại còn có thể chạy trên nhiều nền tảng khác nhau.
SQLite có thể sử dụng làm CSDL cho các thiết bị điện tử. Quả thật SQLite đang là sự lựa chọn phổ biến về Database Engine cho các thiết bị điện tử như PDA, điện thoại di động, MP3 Player, các hộp set-top box và nhiều loại thiết bị điện tử khác. SQLite nhỏ, sử dụng bộ nhớ, không gian lưu trữ và băng thông đĩa hiệu quả, tin cậy mà không cần phải quản trị bởi các quản trị viên chuyên nghiệp. Nếu bạn đang viết ứng dụng trên các thiết bị chạy iOS như iPhone, iPad,... hay các thiết bị chạy Android hoặc Windows Mobile,... thì SQLite chính là CSDL phù hợp cho các thiết bị di động này.
SQLite có thể sử dụng như CSDL cho các website. Do SQLite không cần phải cấu hình và dữ liệu được lưu trữ thành các tập tin trên đĩa thật sự nên nó đang trở thành lựa chọn phổ biến cho các website vừa và nhỏ.
SQLite có thể thay thế cho các CSDL quan hệ tầm doanh nghiệp trong một số tình huống như kiểm thử, demo minh họa,... do SQLite chạy khá nhanh và không cần cài đặt
Một số điểm hạn chế của SQLite