Professional Documents
Culture Documents
กิตินันท์ พลสวัสดิ์
บรรณาธิการ
ค�ำน�ำ
หนังสือ Basic Android Programming เล่มนี้ น�ำเสนอเนือ้ หาตัง้ แต่พนื้ ฐานการเขียน Android App
ไปกระทัง่ ถึงการสร้าง App อย่างง่าย และสามารถใช้ได้จริง รวมไปถึงน�ำเสนอเนือ้ หาทีช่ ว่ ยให้ผอู้ า่ นสามารถ
ปรับแต่งส่วนแสดงผลใน Android App ได้ตามทีต่ อ้ งการให้เหมือนกับ App มาตรฐานทีค่ ณ ุ พบเห็นได้ ใน Play
Store โดยเริ่มต้นจากเนื้อหาที่ง่ายที่สุด ไปจนกระทั่งถึงการเขียนโปรแกรมร่วมกับระบบฐานข้อมูล SQLite
ซึ่งมีประโยชน์ส�ำหรับการพัฒนาแอพพลิเคชันที่มีความซับซ้อน
เนื้อหาในหนังสือเล่มนี้แบ่งออกเป็น 2 ส่วนใหญ่ๆ คือ ส่วนเริ่มต้นเรียนรู้และพัฒนา อีกส่วนหนึ่ง
คือ ส่วนตัวอย่างการพัฒนาแอพพลิเคชันอย่างง่าย โดยส่วนแรกมีวัตถุประสงค์ ให้ผู้อ่านมีพื้นฐานความรู้ที่
จ�ำเป็นส�ำหรับการพัฒนาแอพพลิเคชัน Android ในส่วนที่สองก็เพื่อให้ผู้อ่านสามารถเรียนรู้การน�ำพื้นฐาน
ในส่วนแรกไปใช้งานส�ำหรับพัฒนาแอพพลิเคชัน Android ได้จริง
ผู้เขียนหวังว่า เนื้อหาที่น�ำเสนอในเล่มนี้จะเป็นจุดเริ่มต้นที่ดีส�ำหรับคุณผู้อ่านที่เป็นมือใหม่ ที่
ต้องการเริ่มต้นพัฒนา Android App อย่างเป็นระบบและได้ผลลัพธ์ที่เห็นได้จริง ให้สามารถศึกษาเนื้อหา
ในระดับสูงต่อไปได้ด้วยตัวเอง
สุดท้ายนี้ผู้เขียนหวังเป็นอย่างยิ่งว่า หนังสือเล่มนี้จะมีประโยชน์ ในการเรียนรู้และพัฒนา
แอพพลิเคชัน Android ให้กบั ผูอ้ า่ น และหากหนังสือเล่มนีม้ ขี อ้ ผิดพลาดประการใด ต้องขออภัยมา ณ โอกาส
นี้ โดยผู้อ่านสามารถขอค�ำแนะน�ำและการช่วยเหลือได้ที่ http://www.ebooks.in.th/thaivb.net
ศุภชัย สมพานิช
ธันวาคม 2555
Contents
Part 1 ความรู้พื้นฐานการพัฒนา Android App......................................1
บทที่ 1 เตรียมตัวก่อนพัฒนา Android App...........................................3
การเตรียมสภาพแวดล้อมในการพัฒนา Android App...................................................................................... 4
ดาวน์โหลดและติดตั้งโปรแกรม Eclipse.................................................................................................. 4
ดาวน์โหลดและติดตั้ง Android SDK....................................................................................................... 6
การติดตั้ง ADT .......................................................................................................................................... 9
การก�ำหนดให้ Editors แสดงหมายเลขบรรทัดของโค้ด.......................................................................12
เริ่มต้นสร้าง Hello World App...........................................................................................................................13
รัน Hello World App เพื่อทดสอบการท�ำงาน ................................................................................................17
การสร้างเครื่องโทรศัพท์จ�ำลอง (Emulator)......................................................................................................20
การรัน Android Project เกิดข้อผิดพลาด.........................................................................................................22
การบันทึก Android Project................................................................................................................................23
การเปิด Android Project....................................................................................................................................25
การถอดรายการโปรเจ็กต์ออกจากโปรแกรม Eclipse.......................................................................................27
การเลือกพาธจัดเก็บ Workspace ใหม่..............................................................................................................28
บทที่ 2 พื้นฐานการสร้าง Android App...............................................29
การสร้างเหตุการณ์ click ให้กับปุ่มกด Button.................................................................................................29
พื้นฐานการรับค่าจากผู้ใช้งานด้วย EditText......................................................................................................36
การแสดงแถบข้อความด้วย Toast Notification..............................................................................................42
การก�ำหนดสีให้กับ widget ต่างๆ........................................................................................................................45
การลงสีแบบไล่โทนสี (Gradient Color)............................................................................................................47
ก�ำหนดสีแบบไล่โทนสีในขณะออกแบบ...................................................................................................47
ก�ำหนดสีแบบไล่โทนสีด้วยการเขียนโค้ด.................................................................................................50
การสร้างตัวเลือกแบบเลือกได้มากกว่า 1 รายการด้วย CheckBox...............................................................51
การสร้างตัวเลือกแบบ 1 ตัวเลือกด้วย RadioButton......................................................................................55
พื้นฐานการตรวจสอบข้อผิดพลาด........................................................................................................................58
การส่ง SMS ด้วย Android App.......................................................................................................................61
บทที่ 3 การแจ้งเตือนใน Android App................................................67
พื้นฐานการแสดงไดอะล็อกบ็อกซ์แบบ Alert......................................................................................................67
การแสดง AlertDialog แบบมีการตรวจสอบปุ่มกด...........................................................................................70
การรับข้อมูลจากผู้ใช้ด้วย Input Dialog.............................................................................................................75
การสร้างไดอะล็อกบ็อกซ์ยืนยันก่อนออกจาก Android App...........................................................................79
Contents I
Android App Development
บทที่ 4 ส่วนแสดงผลใน Android App................................................81
ท�ำความรู้จักกับส่วนแสดงผลแบบ RelativeLayout..........................................................................................81
การเปลี่ยนประเภท Layout..................................................................................................................................82
ท�ำความรู้จักกับส่วนแสดงผลแบบ LinearLayout.............................................................................................83
ท�ำความรู้จักกับส่วนแสดงผลแบบ TableLayout..............................................................................................85
การสร้างส่วนแสดงผลแบบแนวนอน..................................................................................................................88
การควบคุมรูปแบบส่วนแสดงผล.........................................................................................................................90
การสร้างส่วนแสดงผลแบบเลื่อนขึ้น-ลงด้วย SlidingDrawer..............................................................................94
บทที่ 5 การสร้างส่วนแสดงผลแบบรายการด้วย ListActivity......................99
พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วยคลาส ListActivity................................................................99
การสร้างรายการใน ListActivity จากอาร์เรย์ของข้อความ............................................................................102
พื้นฐานการแสดงรูปภาพก�ำกับแต่ละรายการในคลาส ListActivity...............................................................107
การแสดงรายการใน ListActivity แบบใช้รูปภาพแตกต่างกัน......................................................................110
การสร้าง Activity ที่สามารถเปลี่ยนส่วนแสดงผลได้.....................................................................................117
บทที่ 6 การสร้างส่วนแสดงผลแบบรายการด้วย ListView และ Spinner...... 123
พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วย ListView.............................................................................123
การแสดงข้อมูลแบบหลายคอลัมน์ใน ListView...............................................................................................126
การแสดงรายการใน ListView แบบมีตัวเลือก CheckBox...........................................................................132
พื้นฐานการลงสีใน ListView แบบไล่โทนสี......................................................................................................139
การลงสีใน ListView แบบตรวจจับเหตุการณ์.................................................................................................143
พื้นฐานการสร้างรายการให้ผู้ใช้เลือกด้วย Spinner.........................................................................................147
การแสดงรายการใน Spinner แบบมีรูปภาพก�ำกับแต่ละรายการ.................................................................150
บทที่ 7 การสร้างส่วนแสดงผลแบบช่องตารางด้วย GridView.................. 155
พื้นฐานการสร้างส่วนแสดงผลแบบช่องตารางด้วย GridView.......................................................................155
การแสดงข้อความและรูปภาพในแต่ละช่องตาราง..........................................................................................158
การใช้ตัวเลือกแบบ CheckBox ใน GridView................................................................................................165
บทที่ 8 ระบบเมนูใน Android........................................................... 173
ท�ำความรู้จักกับระบบเมนูใน Android App.....................................................................................................173
การสร้างเมนู About Me....................................................................................................................................178
การสร้างเมนูแบบ Popup ด้วยคลาส PopupMenu......................................................................................180
การสร้างเมนูให้กับแถบ Action Bar.................................................................................................................183
การใส่รูปภาพในเมนูของ Action Bar...............................................................................................................186
Contents III
1
part
1.2 คลิก
1.3 คลิก
เมือ่ ใดก็ตามทีผ่ อู้ า่ นต้องการเปิดโปรแกรม Eclipse ให้มาทีพ่ าธทีต่ ดิ ตัง้ โปรแกรม Eclipse นีเ้ สมอ
รูปที่ 1-2
แสดงรายการ 2 พาธติดตั้งโปรแกรม Eclipse
ไฟล์ของโปรแกรม
Eclipse
รูปที่ 1-3
แสดงการก�ำหนด
พาธที่จัดเก็บ
โปรเจ็กต์
1.2 คลิก
2.1 คลิก
3. เริม่ ต้นการติดตัง้ Android SDK โดยการเลือกเวอร์ชนั ของ Android ทีต่ อ้ งการพัฒนา ในทีน่ เี้ ลือก
เวอร์ชัน 4.0.3 ขึ้นไป ซึ่งในขั้นตอนนี้ต้องเชื่อมต่อกับอินเทอร์เน็ตอยู่ด้วย
รูปที่ 1-6
แสดงรายการ
คอมโพเนนต์ต่างๆ
ของ Android
SDK ที่ติดตั้ง
เลือก 3.1
3.4 คลิก
3.3 คลิก
การติดตั้ง ADT
ADT (Android Development Tool) เป็น Plug-in ของ Eclipse ที่จะช่วยอ�ำนวยความสะดวกใน
การพัฒนาแอพพลิเคชัน โดยที่ผู้อ่านไม่มีความจ�ำเป็นต้องเตรียมสิ่งต่างๆ ด้วยตัวเอง เช่น ADT จะเป็นตัวช่วย
สร้างโปรเจ็กต์ต้นแบบโดยมีโค้ดเริ่มต้นที่จ�ำเป็นไว้ให้ และเป็นตัวช่วยในการสร้างหน้าจอไปจนถึงการส่งไฟล์
นามสกุล .apk ส�ำหรับการติดตั้งแอพพลิเคชันบนเครื่องโทรศัพท์อีกด้วย ซึง่ มีขั้นตอนการติดตั้ง ADT ดังต่อไปนี้
1. เข้าสูเ่ ว็บไซต์ http://developer.android.com/sdk/installing/installing-adt.html เพือ่ ดาวน์โหลด
Android Developer Tool เรียกสั้นๆ ว่า ADT
รูปที่ 1-8 1.1 กรอก URL
แสดงการดาวน์โหลด
Android Developer
Tool (ADT)
1.2 คลิก
3. เปิดโปรแกรม Eclipse ขึ้นมา คลิกเมนู Help > Install New Software... เพื่อก�ำหนดให้โปรแกรม
Exlipse สามารถพัฒนา Android App ได้
รูปที่ 1-10
แสดงการเลือก
ค�ำสั่ง Install
New Software...
3 เลือก
4.2 คลิก
4.3 เลือก
4.4 คลิก
เลือก 5.1
5.2 เลือก
5.3 คลิก
1 เลือก
2. จะปรากฏไดอะล็อกบ็อกซ์ Preferences
3. คลิกเลือก Editors > Text Editors
4. คลิกเลือก Show line numbers
5. คลิกปุ่ม
เลือก 3 4 เลือก
5 คลิก
3.1 เลือก
3.2 คลิก
4.5 คลิก
5.2 เลือก
5.3 คลิก
6.2 เลือก
6.3 คลิก
คลิก 6.1
6.4 คลิก
7.3 คลิก
8.2 กรอกชื่อ
8.3 เลือก
8.4 กรอกชื่อ
8.5 คลิก
2.2 เลือก
2.3 คลิก
3 เลือก
4 คลิก
5. จะปรากฏหน้าจอแสดงผลการท�ำงานของแอพพลิเคชันดังรูป
รูปที่ 1-24
ผลการรัน Hello
World App บน
ระบบปฏิบัติการ
Android จ�ำลอง
เวอร์ชัน 4.0.3
5.2 คลิก
การสร้างเครื่องโทรศัพท์จ�ำลอง (Emulator)
ในการรัน Android Application ผูอ้ า่ นจะต้องสร้างโทรศัพท์จำ� ลองทีม่ สี ภาพแวดล้อมเหมือนโทรศัพท์
จริง หรือจะเรียกว่า Emulator ขึน้ มาก่อน ซึง่ ในการพัฒนา Android Application จะเรียกเครือ่ งโทรศัพท์จำ� ลอง
ว่า AVD (Android Visual Device) นั่นเอง โดยมีขั้นตอนการสร้าง AVD ดังนี้
1. คลิกเมนู Window > AVD Manager
รูปที่ 1-28
แสดงการเรียก
หน้าต่าง Android
Virtual Device
Manager
1 คลิก
3. จะปรากฏหน้าต่าง Create new Android Virtual Device (AVD) เพือ่ ก�ำหนดคุณสมบัตขิ องระบบ
ปฏิบัติการ Android ที่จะจ�ำลองขึ้นมา โดยที่
ช่อง Name คือ ชื่อระบบจ�ำลอง ในที่นี้ผู้เขียนแนะน�ำให้ตั้งชื่อโดยระบุว่า ระบบ
ปฏิบัติการ Android ที่จะจ�ำลองขึ้นมาเป็นเวอร์ชันอะไร เพื่อให้สะดวก
ต่อการทดสอบ Android App ในภายหลัง เช่น Android_4.0.3,
Android_2.3.3 เป็นต้น
ช่อง Target คือ เวอร์ชนั ของระบบปฏิบตั กิ าร Android ทีจ่ ะจ�ำลองให้กบั AVD ในกรณี
นี้คือ ระบบปฏิบัติการ Android เวอร์ชัน 4.0.3
ช่อง CPU/ABI คือ แพลตฟอร์มที่ก�ำหนดให้ระบบปฏิบัติการ Android ที่จะจ�ำลองขึ้นมา
กำ�หนดขนาดหน้าจอแสดงผล 3.7
3.8 คลิก
แสดงข้อผิดพลาด
2 เลือก
ถูกคลิกเลือกเท่านั้น
รูปที่ 1-33
แสดงการ Clean
เฉพาะโปรเจ็กต์
ปัจจุบัน 3.1 เลือก
3.2 เลือก
3.3 คลิก
1 เลือก
3.1 เลือก
3.2 คลิก
4.2 เลือก
5.2 ที่อยู่ที่ต้องการบันทึก
5.1 คลิก
เลือก 6
7 คลิก
1 คลิก
2. จะปรากฏไดอะล็อกบ็อกซ์ Import
3. คลิกเลือก General > Existing Projects into Workspace เพื่อเปิดโปรเจ็กต์เดิมที่มีอยู่ ใน
Workspace ของโปรแกรม Eclipse ดังรูปที่ 1-38
รูปที่ 1-38
แสดงการเลือก
หัวข้อ Existing
Projects into
Workspace 2 เลือก
3 คลิก
เลือก 4
6 คลิก
จากรูปที่ 1-39 ส่วนตัวเลือก Select root directory หมายถึง การเปิด Android Project แบบปกติ
(เก็บอยู่ในโฟลเดอร์)
7. จะปรากฏหน้าโปรเจ็กต์ดังรูป
รูปที่ 1-40
แสดง Android
Project ที่ถูก
เปิดในโปรแกรม
Eclipse
1.2 เลือก
1 เลือก
3 คลิก
สรุปท้ายบท
เนื้อหาในบทนี้เป็นการกล่าวถึงในภาพกว้างของการพัฒนา Android App ด้วยโปรแกรม Eclipse
รวมไปถึงการเตรียมสภาพแวดล้อมให้พร้อมใช้งาน เนื้อหาในบทต่อไปจะเข้าสู่การพัฒนา Android App อย่าง
แท้จริง
2.6 คลิก
Android App Development
3. ที่ช่อง Title ตั้งชื่อให้กับ App นี้ว่า Hello Android ดังรูปที่ 2-2
รูปที่ 2-2
แสดงการตั้งชื่อให้
กับ App ปัจจุบัน
3.1 กรอกชื่อ
3.4 กรอกชื่อ
3.5 คลิก
4.1 ดับเบิลคลิก
เพื่อเพิ่มข้อความใหม่เข้ามา
1
ในโปรเจ็กต์
รูปที่ 2-4
แสดงการเพิ่ม 5.1 คลิก
ข้อความที่ชื่อว่า
TextView1
5.2 เลือก
5.3 คลิก
จากรูปที่ 2-5 ข้อความทีช่ อื่ ว่า Button1 (ช่อง Name) ท�ำหน้าทีเ่ ก็บข้อความ “Button1” (ช่อง Value*)
ส่งผลให้ในโปรเจ็กต์มีข้อความใหม่เพิ่มขึ้นมา 2 ข้อความ
ลากวาง 7.2
เลือก 8.3
เลือก 8.4
8.5 คลิก
เลือก 8.8
เลือก 8.9
8.10 คลิก
9 เลือก
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="16dp"
android:layout_marginTop="52dp"
android:text="@string/Button1" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/TextView1" />
</RelativeLayout>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
11. รันโปรเจ็กต์จะได้ผลลัพธ์ดังนี้
รูปที่ 2-10
ผลการรัน
ตัวอย่างที่ 2-1 11.1 คลิก 11.2 คลิก
จากรูปที่ 2-10 เมือ่ คลิกปุม่ Button1 ก็จะท�ำให้สว่ นแสดงผลปัจจุบนั แสดงข้อความ “Hello Android”
อธิบายการท�ำงานของโค้ด
1. ส่วนเริ่มต้นแพ็คเกจมีชื่อว่า com.example.hello.android เกิดในขั้นตอนที่ผู้อ่านสร้างโปรเจ็กต์
ขึ้นมาในโปรแกรม Eclipse
2. มีส่วนระบุ library ที่จ�ำเป็นในขั้นต้นให้ครบถ้วน
\src\com.example.hello.android\MainActivity.java
package com.example.hello.android;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
พื้นฐานการรับค่าจากผู้ใช้งานด้วย EditText
การท�ำงานขั้นต้นอีกอย่างหนึ่งที่ผู้อ่านควรรู้ก็คือ การรับค่าต่างๆ ที่ผู้ใช้ป้อนเข้ามาใน Android App
เพื่อน�ำข้อมูลดังกล่าวไปใช้ในการท�ำงานระดับถัดไป ซึ่งอยู่ในความรับผิดชอบของ widget ประเภท EditText
ตัวอย่างที่ 2-2 พื้นฐานการรับค่าจากผู้ใช้งานด้วย EditText โดยหน้าที่ของ App นี้ก็คือ รับข้อความ
จากผู้ใช้งานเข้ามาก่อนแล้วแสดงข้อความดังกล่าวออกมา ซึ่งมีขั้นตอนดังนี้
1.6 คลิก
2.4 กรอกชื่อ
2.5 คลิก
TextView
รูปที่ 2-13
แสดงการสร้าง
ข้อความขึ้นมา
3 ชุด
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/tvFullNameText" />
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6. รันโปรเจ็กต์เพื่อทดสอบการท�ำงานดังนี้
ให้ผู้อ่านคลิกที่ช่องป้อนข้อมูลแล้ว
Android Emulator จะแสดงคีย์บอร์ดขึ้นมา 6.1 ป้อนข้อมูล 6.2 คลิก
ให้ป้อนข้อความตามที่ต้องการ จากนั้นคลิกปุ่ม
ตรวจสอบข้อความที่ป้อนเข้าไปจะปรากฏขึ้นมา
ในส่วนแสดงผลด้านล่าง 6.3 แสดงผล
รูปที่ 2-15
ผลการรัน
ตัวอย่างที่ 2-2
1.6 คลิก
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/cmdToast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="14dp"
android:text="@string/cmdToast" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5. รันโปรเจ็กต์เพื่อทดสอบการท�ำงานดังนี้
รูปที่ 2-19
ผลการรัน
ตัวอย่างที่ 2-3 5.1 คลิก
5.2 แสดงผล
ส่วนแสดงผลปัจจุบัน
3. การสั่งให้แสดงข้อความแบบ Toast Notification ให้ท�ำผ่านทางเมธอด show()
\src\com.example.toast.notification\MainActivity.java
public void onClick(View v) {
Toast.makeText(MainActivity.this,"สวัสดี Android App " ,Toast.LENGTH_LONG).show();
}
2.2 เลือก
2.3 คลิก
2.4 กำ�หนดชื่อสไตล์
2.5 กำ�หนดสี
3.3 เลือก
คลิก 3.2
3.4 คลิก
4. รันโปรเจ็กต์เพื่อทดสอบการท�ำงานได้ผลลัพธ์ดังนี้
รูปที่ 2-22
ผลการรัน
ตัวอย่างที่ 2-4
2.1 คลิกขวา
2.2 เลือก
2.3 เลือก
2.4 คลิก
2.8 เลือก
2.9 คลิก
โดยที่
| แอตทริบิวต์ android:angle หมายถึง มุมองศาส�ำหรับไล่โทนสีก�ำหนดค่าเป็น 90 องศา
4. ในกรณีนตี้ อ้ งการให้สพี นื้ หลังของส่วนแสดงผล Activity (MainActivity) ใช้สี Gradient ทีส่ ร้างขึน้ มา
โดยการก�ำหนดที่คุณสมบัติ Background โดยเลือกสีพื้นหลังจาก bggradient ตามที่เราสร้างไว้
ก่อนหน้านี้
รูปที่ 2-25
ผลของการลงสี
แบบ Gradient
จากไฟล์
bggradient.xml
4.3 เลือก
คลิก 4.2
เลือก 4.1
4.4 คลิก
4.5 แสดงผล
ก�ำหนดสีแบบไล่โทนสีด้วยการเขียนโค้ด
ในหัวข้อนีผ้ เู้ ขียนจะยกตัวอย่างการเขียนโค้ดเพือ่ ก�ำหนดให้ลงสีพนื้ หลังแอพพลิเคชันในแบบ Gradient
เพื่อเป็นแนวทางในการศึกษาให้กับผู้อ่าน โดยมีโค้ดดังนี้
โค้ด JAVA ที่ 2-5 การลงสีแบบไล่โทนสี (Gradient Color) (\src\com.example.gradientcolor\MainActiviy.java)
package com.example.gradientcolor;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = new View(this);
setContentView(v);
v.setBackgroundResource(R.drawable.bggradient);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
ถ้าผู้อ่านเลือกใช้วิธีการเขียนโค้ด ผลการท�ำงานที่ได้จะเกิดขึ้นในขณะรันโปรเจ็กต์เท่านั้นซึ่งจะได้
ผลลัพธ์ดังรูปที่ 2-25
รูปที่ 2-26
ผลการรัน
ตัวอย่างที่ 2-5
การสร้างตัวเลือกแบบเลือกได้มากกว่า 1 รายการด้วย
CheckBox
ในกรณีที่เราต้องการสร้างตัวเลือกในส่วนแสดงผล เพื่อให้ผู้ใช้สามารถเลือกตัวเลือกได้มากกว่า 1
ตัวเลือกในเวลาเดียวกันจะเป็นหน้าที่ของ widget ที่ชื่อว่า CheckBox ซึ่งยกตัวอย่างได้ดังนี้
ตัวอย่างที่ 2-6 การสร้างตัวเลือกแบบเลือกมากกว่า 1 รายการด้วย CheckBox มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SimpleCheckBox
2. ออกแบบส่วนแสดงผล โดยใช้ CheckBox จ�ำนวน 3 ตัวดังรูปที่ 2-27
รูปที่ 2-27
ส่วนแสดงผลที่ได้ CheckBox 2.1
CheckBox 2.2
<CheckBox
android:id="@+id/chk1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/chk1" />
<CheckBox
android:id="@+id/chk2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/chk1"
android:text="@string/chk2" />
<CheckBox
android:id="@+id/chk3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/chk2"
android:text="@string/chk3" />
<Button
android:id="@+id/cmdCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/chk3"
android:layout_below="@+id/chk3"
android:text="@string/cmdCheck" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final CheckBox c1 = (CheckBox) findViewById(R.id.chk1);
final CheckBox c2 = (CheckBox) findViewById(R.id.chk2);
final CheckBox c3 = (CheckBox) findViewById(R.id.chk3);
Button cmd = (Button) findViewById(R.id.cmdCheck);
cmd.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) { 2
// TODO Auto-generated method stub
String str = "รายการที่ถูกเลือก" + "\n";
if (c1.isChecked()) {
str = str + "-ตัวเลือก 1 ถูกเลือก" + "\n";
}
if (c2.isChecked()) {
str = str + "-ตัวเลือก 2 ถูกเลือก" + "\n";
}
if (c3.isChecked()) {
str = str + "-ตัวเลือก 3 ถูกเลือก" + "\n";
}
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
เลือก 4.2
4.3 คลิก
4.4 แสดงผล
\src\com.example.simplecheckbox\MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final CheckBox c1 = (CheckBox) findViewById(R.id.chk1);
final CheckBox c2 = (CheckBox) findViewById(R.id.chk2);
final CheckBox c3 = (CheckBox) findViewById(R.id.chk3);
Button cmd = (Button) findViewById(R.id.cmdCheck);
RadioButton 2.2
2.3 Button
<Button
android:id="@+id/cmdCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
<RadioButton
android:id="@+id/optMale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:checked="true"
android:text="@string/optMale" />
<RadioButton
android:id="@+id/optFemale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/optMale"
android:text="@string/optFemale" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RadioButton oMale = (RadioButton) findViewById(R.id.optMale);
final RadioButton oFemale = (RadioButton) findViewById(R.id.optFemale);
Button cmd = (Button) findViewById(R.id.cmdCheck);
cmd.setOnClickListener(new Button.OnClickListener() { 2
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String str = "รายการที่ถูกเลือก" + "\n";
if (oMale.isChecked()) {
str = str + "-ตัวเลือกผู้ชายถูกเลือก" + "\n";
}
if (oFemale.isChecked()) {
str = str + “-ตัวเลือกผู้หญิงถูกเลือก” + “\n”;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์จะได้ผลลัพธ์ดังนี้
รูปที่ 2-30
ผลการรัน
ตัวอย่างที่ 2-7 เลือก 4.1
4.2 คลิก
4.3 แสดงผล
อธิบายการท�ำงานของโค้ด
1. เริ่มต้นในเหตุการณ์ onCreate() ให้ท�ำ
z อ่ า น RadioButton ที่ ชื่ อ ว่ า optMale และ optFemale มาเก็ บ ไว้ ที่ ตั ว แปรออบเจ็ ก ต์
\src\com.example.simpleradio\MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final RadioButton oMale = (RadioButton) findViewById(R.id.optMale);
final RadioButton oFemale = (RadioButton) findViewById(R.id.optFemale);
Button cmd = (Button) findViewById(R.id.cmdCheck);
พื้นฐานการตรวจสอบข้อผิดพลาด
การตรวจสอบข้อผิดพลาดในการเขียนโค้ด JAVA มีมากมายหลายแบบ แต่กม็ กี ารตรวจสอบในขัน้ ต้น
อยูอ่ ย่างหนึง่ ทีผ่ อู้ า่ นควรทราบก็คอื การตรวจสอบเพือ่ บังคับให้ผใู้ ช้งานป้อนข้อมูลให้ครบตามทีเ่ ราต้องการนัน่ เอง
ซึ่งยกตัวอย่างได้ดังนี้
ตัวอย่างที่ 2-8 พื้นฐานการตรวจสอบข้อผิดพลาดมีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า CheckError
2. ออกแบบส่วนแสดงผล ดังรูปที่ 2-31
รูปที่ 2-31
ส่วนแสดงผลที่ได้
2.2 Button
2.1 EditText
<Button
android:id="@+id/cmdCheck"
android:layout_width="wrap_content"
<EditText
android:id="@+id/edtData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="14dp"
android:ems="10" >
<requestFocus />
</EditText>
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4.2 แสดงผล
\src\com.example.checkerror\MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
\src\com.example.checkerror\MainActivity.java
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (edt.getText().length() == 0) {
edt.setError("กรุณาป้อนข้อมูลให้ครบ");
Toast.makeText(MainActivity.this, "กรุณาป้อนข้อมูลให้ครบ",
Toast.LENGTH_SHORT).show();
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/strNumber" />
<EditText
android:id="@+id/edtNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<EditText
android:id="@+id/edtMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/edtNumber"
android:layout_below="@+id/edtNumber"
android:layout_marginTop="18dp"
android:ems="10" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/textView1"
android:layout_alignTop="@+id/edtMessage"
android:text="@string/strMessage" />
<Button
android:id="@+id/cmdSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/edtMessage"
android:layout_below="@+id/edtMessage"
android:layout_marginTop="15dp"
android:text="@string/cmdSend" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.view.View.OnClickListener;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5.2 คลิก
5.3 แสดงผล
อธิบายการท�ำงานของโค้ด
การส่ง SMS เราต้องการเพียง 2 อย่างคือ หมายเลขโทรศัพท์ปลายทางและข้อความที่ต้องการส่งไป
1. เริ่มต้นในเหตุการณ์ onCreate() ให้ท�ำ
อ่าน EditText ที่ชื่อว่า edtNumber มาเก็บไว้ที่ตัวแปรออบเจ็กต์ EditText ที่ชื่อว่า
edt_Number ซึ่งท�ำหน้าที่รับเบอร์โทรศัพท์ปลายทาง
·อ่าน EditText ที่ชื่อว่า edtMessage มาเก็บไว้ที่ตัวแปรออบเจ็กต์ EditText ที่ชื่อว่า
edt_Message ซึ่งท�ำหน้าที่รับข้อความที่ผู้ใช้ต้องการส่ง
·อ่าน Button ที่ชื่อว่า cmdSend มาเก็บไว้ที่ตัวแปรออบเจ็กต์ Button ที่ชื่อว่า cmd
\src\com.example.simplesms\MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
3. การส่ง SMS อาศัยคลาส SmsManager และตัง้ ทีช่ อื่ ว่า sms ร่วมกับเมธอด sendTextMessage()
1
โดยที่
พารามิเตอร์ตัวที่ 1 หมายถึง เบอร์โทรศัพท์ปลายทาง ในกรณีนี้เก็บอยู่ที่ตัวแปร strNumber
\src\com.example.simplesms\MainActivity.java
try {
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(strNumber, null, strMessage, null, null);
Toast.makeText(getApplicationContext(),
"ส่ง sms เรียบร้อยแล้ว", Toast.LENGTH_SHORT).show();
สรุปท้ายบท
การใช้งาน widget ต่างๆ ที่น�ำเสนอในบทนี้จะถูกน�ำไปใช้ร่วมกับ widget ประเภทอื่นๆ ในเนื้อหา
บทต่อๆ ไป ดังนั้น ผู้อ่านควรศึกษาเนื้อหาให้เข้าใจ
พื้นฐานการแสดงไดอะล็อกบ็อกซ์แบบ Alert
ไดอะล็อกบ็อกซ์แบบ Alert (Alert Dialog) หมายถึง กรอบข้อความที่ปรากฏขึ้นมาในส่วนแสดงผล
เพื่อแจ้งเตือนให้แก่ผู้ใช้รับทราบว่า ณ ช่วงเวลานั้นๆ เกิดอะไรขึ้น หรือต้องการให้ท�ำอะไร โดยผู้อ่านศึกษาการ
ใช้งานได้จากตัวอย่างต่อไปนี้
ตัวอย่างที่ 3-1 พื้นฐานการแสดงไดอะล็อกบ็อกซ์แบบ Alert มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ที่ชื่อว่า Alert Dialog ขึ้นมา ดังรูปที่ 3-1
รูปที่ 3-1
แสดงการ 1.1 กรอกชื่อ
สร้างโปรเจ็กต์
Android ที่ชื่อว่า 1.2 กรอกชื่อ
Alert Dialog 1.4 เลือก
1.3 กรอกชื่อ
1.5 เลือก
1.6 คลิก
Android App Development
2. สร้างข้อความที่ชื่อว่า cmdShowAlert ขึ้นมาโดยก�ำหนดค่าเป็น Show Alert... ดังรูปที่ 3-2
รูปที่ 3-2
แสดงการสร้าง
ข้อความที่ชื่อว่า
cmdShowAlert
2.1 ชื่อ
2.2 ข้อมูล
3. ออกแบบส่วนแสดงผลดังรูปที่ 3-3
รูปที่ 3-3
ส่วนแสดงผลที่ได้
3 Button
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/cmdShowAlert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/cmdShowAlert" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5. รันโปรเจ็กต์เพื่อทดสอบการท�ำงานดังนี้
รูปที่ 3-4
ผลการรัน
ตัวอย่างที่ 3-1
5.1 คลิก
5.2 แสดงผล
2. การสร้างไดอะล็อกบ็อกซ์ในขั้นต้นมีสิ่งที่ควรท�ำดังนี้
·ข้อความแถบไตเติล เพื่อบอกให้ผู้ใช้ทราบว่าเป็นข้อความประเภทอะไร โดยสั่งผ่านทาง
เมธอด setTitle()
·ข้อความที่ต้องการแจ้ง โดยผู้อ่านต้องก�ำหนดข้อความให้ชัดเจนว่า ต้องการแจ้งข้อมูลอะไร
กับผู้ใช้งานซึ่งสั่งผ่านทางเมธอด setMessage()
\src\com.example.alert.dialog\MainActivity.java
aDlg.setTitle("ทดสอบ");
aDlg.setMessage("ข้อความจาก Alert Dialog");
aDlg.show();
}
z ·กรณีสนใจ 2 ปุ่ม
1.6 คลิก
2.2 ข้อมูล
3. ออกแบบส่วนแสดงผลดังรูปที่ 3-7
รูปที่ 3-7
แสดงการ
ออกแบบส่วน
แสดงผล
3 Button
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/cmdShowAlert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="14dp"
android:text="@string/cmdShowAlertWithButton" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AlertDialog.Builder aDlg = new AlertDialog.Builder(this);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
รูปที่ 3-8
กรณีผู้ใช้แตะปุ่ม No
5.1 คลิก
5.2 คลิก
1 คลิก
2 คลิก
3 แสดงผล
อธิบายการท�ำงานของโค้ด
1. เริ่มต้นสร้างตัวแปรออบเจ็กต์ AlertDialog ที่ชื่อว่า aDlg ขึ้นมาก่อน
\src\com.example.alertdialogwithbutton\MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AlertDialog.Builder aDlg = new AlertDialog.Builder(this);
Button cmd = (Button) findViewById(R.id.cmdShowAlert);
ล�ำดับ
·ก�ำหนดปุ่ม No ผ่านทางเมธอด setNegativeButton() ก�ำหนดให้ไม่ต้องท�ำงานใดๆ ด้วย
ค่า null
\src\com.example.alertdialogwithbutton\MainActivity.java
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
aDlg.setTitle("ค�ำยืนยัน");
aDlg.setMessage("คุณต้องการบันทึกข้อมูล ใช่หรือไม่?");
aDlg.setNegativeButton("No", null);
4. ทีเ่ หตุการณ์ Click() ของปุม่ Yes สัง่ ให้แสดงข้อความ “คุณคลิกปุม่ Yes” แบบ Toast Notification
\src\com.example.alertdialogwithbutton\MainActivity.java
public void onClick(DialogInterface dialog, int arg1) {
Toast.makeText(MainActivity.this,"คุณคลิกปุ่ม Yes "
,Toast.LENGTH_LONG).show();
}
});
aDlg.show();
}
});
}
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
2 Button
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Button
android:id="@+id/cmdShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="22dp"
android:layout_marginTop="14dp"
android:text="@string/cmdShow" />
</RelativeLayout>
3. เขียนโค้ดเพื่อก�ำหนดการท�ำงานดังต่อไปนี้
โค้ด JAVA ที่ 3-3 การรับข้อมูลจากผู้ใช้ด้วย Input Dialog (\src\com.example.input.dialog\MainActivity.java)
package com.example.input.dialog;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AlertDialog.Builder aDlg = new AlertDialog.Builder(this);
final EditText edt = new EditText(this);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์เพื่อทดสอบการท�ำงานของแอพพลิเคชัน
4.1 ให้คลิกปุ่ม
4.2 แสดงไดอะล็อกบ็อกซ์ ดังรูปที่ 3-11 4.1 คลิก
รูปที่ 3-11
ผลการรัน
ตัวอย่างที่ 3-3 แสดงไดอะล็อกบ็อกซ์ 4.2
4.3 ให้คลิกที่ช่องรับข้อมูลเพื่อป้อนข้อความตามที่ต้องการ
4.4 คลิกปุ่ม Yes เพื่อตรวจสอบว่าผู้ใช้ป้อนข้อมูลใดเข้ามา ดังรูปที่ 3-12
รูปที่ 3-12
ผลการตรวจสอบ
ข้อความที่ถูก
ป้อนเข้ามา
4.3 ป้อนข้อความ
4.4 คลิก
4.5 แสดงผล
·ก�ำหนดข้อความผ่านทางเมธอด setMessage()
·ก�ำหนดให้ส่วนแสดงผลแสดงผลจากตัวแปรออบเจ็กต์ edt
\src\com.example.input.dialog\MainActivity.java
Button cmd = (Button) findViewById(R.id.cmdShow);
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
aDlg.setTitle("ข้อมูลผู้ใช้");
aDlg.setMessage("กรุณาป้อนชื่อ-นามสกุล :");
aDlg.setView(edt);
3. ก�ำหนดปุ่มที่จะปรากฏในไดอะล็อกบ็อกซ์ที่สร้างขึ้นมาโดยที่
·ปุ่ม No ก�ำหนดให้ไม่ต้องมีการท�ำงานใดๆ โดยก�ำหนดค่าเป็น null
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.Menu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onBackPressed() {
AlertDialog.Builder qDlg = new AlertDialog.Builder(this);
qDlg.setTitle("คุณต้องการออกจากโปรแกรม ใช่หรือไม่?");
qDlg.setPositiveButton("Cancel", null);
qDlg.setNegativeButton("OK", new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
finish();
}
});
qDlg.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
สรุปท้ายบท
ในทางปฏิบัติยังมีรูปแบบการแจ้งเตือนอีกหลายแบบที่ผู้อ่านสามารถพบเห็นได้ใน App ต่างๆ แต่
อย่างน้อยทีส่ ดุ รูปแบบแจ้งเตือนทีผ่ เู้ ขียนเลือกมาน�ำเสนอในบทนีเ้ พียงพอต่อการน�ำไปใช้งานจริงได้ในระดับหนึง่
ท�ำความรู้จักกับส่วนแสดงผลแบบ RelativeLayout
ส่วนแสดงผลแบบ RelativeLayout เป็นส่วนแสดงผลเริ่มต้น เมื่อสร้างโปรเจ็กต์ Android ขึ้นมา ซึ่ง
อยู่ในความรับผิดชอบของอิลิเมนต์ <RelativeLayout>...</RelativeLayout>
หลักการของการจัดส่วนแสดงผลแบบนี้ก็คือ เมื่อใช้ widget ใดๆ ก็ตามในส่วนแสดงผลจะอาศัยการ
อ้างอิงต�ำแหน่งระหว่างกัน เพื่อระบุต�ำแหน่งให้กับ widget แต่ละตัวนั่นเอง ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 4-1 ท�ำความรู้จักกับส่วนแสดงผลแบบ RelativeLayout
1. ผู้เขียนลองใช้ widget ประเภท Button จ�ำนวน 3 ปุ่มในส่วนแสดงผล ดังรูปที่ 4-1
รูปที่ 4-1
ขณะใช้ widget
ประเภท Button
ในส่วนแสดงผล
จากรูปที่ 4-1 เมือ่ เลือ่ น/ย้ายต�ำแหน่ง widget พบว่า จะมีสว่ นช่วยเหลือปรากฏขึน้ มาเพือ่ ระบุวา่ widget
ที่ก�ำลังสนใจอยู่อ้างอิงต�ำแหน่งกับ widget ใดในส่วนแสดงผลปัจจุบัน
Android App Development
2. ผลของการออกแบบส่วนแสดงผลหลักที่ได้จะถูกสร้างเป็นไฟล์ XML โดยอัตโนมัติ ที่ชื่อว่า
activity_main.xml และถูกเก็บอยู่ในโฟลเดอร์ \res\layout ดังรูปที่ 4-2
รูปที่ 4-2
แสดงสคริปต์
activity_main.
xml ที่ได้
การเปลี่ยนประเภท Layout
ในกรณีที่เราต้องการเปลี่ยน Layout ของส่วนแสดงผลให้เป็น Layout ประเภทอื่นๆ ก็สามารถท�ำได้
เช่นกัน ซึ่งมีขั้นตอนดังนี้
1. ที่ส่วนแสดงผลให้คลิกขวาเลือกค�ำสั่ง Change Layout... ดังรูปที่ 4-3
รูปที่ 4-3
แสดงการเลือก 1.1 คลิกขวา
ค�ำสั่ง Change
Layout...
1.2 เลือก
จากรูปที่ 4-4 Layout ทีป่ รากฏขึน้ มาเป็น Layout ที่ Android รองรับ โดยผูเ้ ขียนจะน�ำเสนอเป็นเนือ้ หา
ในล�ำดับต่อๆ ไป
ท�ำความรู้จักกับส่วนแสดงผลแบบ LinearLayout
ส่วนแสดงผลแบบ LinearLayout หมายถึง ส่วนแสดงผลในแนวเส้นตรง โดยอยู่ในความรับผิดชอบ
ของอิลิเมนต์ <LinearLayout>...</LinearLayout> ซึ่งมี 2 แบบคือ
z ·แนวตั้ง อยู่ในความรับผิดชอบของแอตทริบิวต์ android:orientation=“vertical”
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
3. ได้ผลลัพธ์ดังนี้
รูปที่ 4-6
ส่วนแสดงผล
LinearLayout
แบบแนวนอน
ท�ำความรู้จักกับส่วนแสดงผลแบบ TableLayout
ส่วนแสดงผลแบบ TableLayout หมายถึง การมองส่วนแสดงผลแบบเป็นแถว (Row) หรือคอลัมน์
(Column) อยู่ในความรับผิดชอบของอิลิเมนต์ <TableLayout>...</TableLayout>
ตัวอย่างที่ 4-3 ท�ำความรู้จักกับส่วนแสดงผลแบบ TableLayout ซึ่งมีรายละเอียดดังนี้
ผู้เขียนใช้ widget ประเภท TextView จ�ำนวน 5 ตัววาดลงในส่วนแสดงผล ดังรูปที่ 4-7
รูปที่ 4-7
ส่วนแสดงผลแบบ
TableLayout
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@string/Row1"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Row2"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Row3"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Row4"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Row5"
android:textAppearance="?android:attr/textAppearanceLarge" />
</TableLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity" />
<TableRow>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</TableRow>
</TableLayout>
การสร้างส่วนแสดงผลแบบแนวนอน
โดยปกติแล้วส่วนแสดงผลทีป่ รากฏใน Android App ของเราถูกก�ำหนดให้แสดงผลตามแนวตัง้ ในบาง
กรณีเราต้องการก�ำหนดให้ Android App ของเราแสดงผลตามแนวนอนก็สามารถท�ำได้เช่นกัน โดยมี 2 วิธี ดังนี้
1. ก�ำหนดในขณะออกแบบ
2. เขียนโค้ด JAVA ควบคุม
ตัวอย่างที่ 4-5 การสร้างส่วนแสดงผลแบบแนวนอนมีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า FixOrientation
2. ในกรณีที่ต้องการเขียนโค้ด JAVA ควบคุมแสดงได้ดังต่อไปนี้
โค้ด JAVA ที่ 4-5 การสร้างส่วนแสดงผลแบบแนวนอน (\src\MainActivity.java)
package com.example.fixorientation;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.view.Menu;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int CurrentOrientation = getRequestedOrientation();
if ( CurrentOrientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE ) { 2
setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE );
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
3. รันโปรเจ็กต์จะได้ผลลัพธ์ดังนี้
รูปที่ 4-9
ผลการรัน
ตัวอย่างที่ 4-5
การควบคุมรูปแบบส่วนแสดงผล
ในกรณีที่ต้องการให้ Android App มีความยืดหยุ่นมากพอ โดยการเปิดโอกาสให้ผู้ใช้งานสามารถ
ควบคุมรูปแบบส่วนแสดงผลได้ด้วยก็สามารถท�ำได้เช่นกัน โดยที่การควบคุมที่ผู้เขียนกล่าวถึงในโปรเจ็กต์นี้
ไม่เกี่ยวข้องกับระบบเซนเซอร์บนอุปกรณ์แท็บเล็ตหรือสมาร์ทโฟนแต่อย่างใด ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 4-6 การควบคุมรูปแบบส่วนแสดงผลมีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า ControlOrientation
2. ออกแบบส่วนแสดงผล ดังรูปที่ 4-11
รูปที่ 4-11
ส่วนแสดงผลของ
ControlOrien-
taion App
จากรูปที่ 4-11 ผูเ้ ขียนเลือกใช้สว่ นแสดงผลแบบ TableLayout ซึง่ แสดงสคริปต์ XML ทีไ่ ด้ดงั ต่อไปนี้
1
สคริปต์ XML ที่ 4-6 การควบคุมส่วนแสดงผล (\res\layout\activity_main.xml)
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity" />
<EditText
android:id="@+id/edtInput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/edtInput" >
<requestFocus />
</EditText>
<Button
android:id="@+id/cmdLandscape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="53dp"
android:text="@string/cmdLandscape" />
<Button
android:id="@+id/cmdPortrait"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cmdPortrait" />
</TableLayout>
3. เขียนโค้ดก�ำหนดการท�ำงานดังต่อไปนี้
โค้ด JAVA ที่ 4-6 การควบคุมรูปแบบส่วนแสดงผล (\src\com.example.controlorientation\MainActivity.java)
package com.example.controlorientation;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
cmdPort.setOnClickListener(new Button.OnClickListener() { 2
public void onClick(View arg0) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
});
cmdLand.setOnClickListener(new Button.OnClickListener() { 3
public void onClick(View arg0) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์จะได้ผลลัพธ์ดังนี้
รูปที่ 4-12
ผลการรัน
ตัวอย่างที่ 4-6
อธิบายการท�ำงานของโค้ด
1. เริ่มต้นในเหตุการณ์ onCreate()
ปุม ่ แนวตัง้ ให้หาปุม่ ทีช่ อื่ ว่า cmdPortrait เก็บไว้ทตี่ วั แปรออบเจ็กต์ Button ทีช่ อื่ ว่า cmdPort
ปุ่มแนวนอน ให้หาปุ่มที่ชื่อว่า cmdLandscape เก็บไว้ที่ตัวแปรออบเจ็กต์ Button ที่ชื่อว่า
cmdLand
\src\com.example.controlorientation\MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
การสร้างส่วนแสดงผลแบบเลื่อนขึ้น-ลงด้วย Sliding-
Drawer
ในกรณีทตี่ อ้ งการให้สว่ นแสดงผลของเราสามารถเลือ่ นขึน้ หรือเลือ่ นลงได้โดยมีปมุ่ Button ท�ำหน้าที่
ควบคุมจะเป็นหน้าที่ของ widget ที่ชื่อว่า SlidingDrawer
ตัวอย่างที่ 4-7 การสร้างส่วนแสดงผลแบบเลื่อนขึ้น-ลงด้วย SlidingDrawer มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SimpleSlidingDrawer
2. ออกแบบส่วนแสดงผล ดังรูปที่ 4-14
รูปที่ 4-14
ส่วนแสดงผลที่ได้
TextView 2 ตัว
<SlidingDrawer
android:id="@+id/slidingDrawer1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:content="@+id/content" 1
android:handle="@+id/handle" >
<Button
android:id="@+id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
</SlidingDrawer>
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 4-15
ผลการรัน
ตัวอย่างที่ 4-7
อธิบายการท�ำงานของโค้ด
1. หลักการท�ำงานของส่วนแสดงผลแบบนี้มีอยู่ 2 ส่วน เริ่มต้นที่ส่วนแสดงผลของอิลิเมนต์
<SlidingDrawer>...</SlidingDrawer> ให้ต้องก�ำหนดค่า ดังนี้
แอตทริบิวต์ android:content ท�ำหน้าที่ระบุว่าให้อิลิเมนต์ใดท�ำหน้าที่แสดงเนื้อหา ในกรณี
<SlidingDrawer
android:id="@+id/slidingDrawer1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:content="@+id/content"
android:handle="@+id/handle" >
<Button
android:id="@+id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Handle" />
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="458dp"
android:orientation="vertical" >
<TextView
/>
<TextView
/>
</LinearLayout>
</SlidingDrawer>
</RelativeLayout>
sld.setOnDrawerCloseListener(new OnDrawerCloseListener() {
public void onDrawerClosed() {
cmd.setText(R.string.cmdUp);
}
});
พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วยคลาส
ListActivity
การสร้างส่วนแสดงผลแบบรายการนอกเหนือไปจากการใช้งาน ListView แล้ว ยังมีอีก 1 วิธีนั่นคือ
การก�ำหนดให้ Activity ท�ำหน้าที่สร้างส่วนแสดงผลแบบรายการด้วยตัวเองโดยอาศัยคลาสที่ชื่อว่า ListActivity
ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 5-1 พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วยคลาส ListActivity มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า UsingListActivity
2. เขียนโค้ด JAVA ก�ำหนดการท�ำงานดังต่อไปนี้
Android App Development
โค้ด JAVA ที่ 5-1 พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วยคลาส ListActivity (\src\com.example.
usinglistactivity\MainActivity.java)
package com.example.usinglistactivity;
import android.os.Bundle;
import android.app.ListActivity; 2
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
String[] arrStr = new String[] { "เมนู 1", "เมนู 2", "เมนู 3",
"เมนู 4", "เมนู 5" };
ArrayAdapter<String> arrAdt = new ArrayAdapter<String>(this, 4
android.R.layout.simple_list_item_1, arrStr);
setListAdapter(arrAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
3. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 5-1
ผลการรัน
ตัวอย่างที่ 5-1
3.1 เลือก
3.2 คลิก
String[] arrStr = new String[] { "เมนู 1", "เมนู 2", "เมนู 3",
"เมนู 4", "เมนู 5" };
\src\com.example.usinglistactivity\MainActivity.java
protected void onListItemClick(ListView l, View v, int position, long id) {
String str = (String) getListAdapter().getItem(position);
Toast.makeText(this, "รายการ : " + str + " ถูกเลือก",
Toast.LENGTH_SHORT).show();
}
2.1 คลิกขวา
2.2 เลือก
2.3 เลือก
2.4 คลิก
2.5 เลือก
2.9 แสดงไฟล์
2.8 คลิก
3.2 เลือก
3.3 คลิก
4.1 คลิก
4.5 กำ�หนดค่า
4.4 คลิก
5. ในกรณีนผี้ เู้ ขียนต้องการสร้าง 5 รายการ จึงเพิม่ Item 5 ครัง้ โดยผูอ้ า่ นสามารถคลิกแท็บ myxml.xml
1
ด้านล่างเพื่อดูโครงสร้างการจัดเก็บอาร์เรย์ของข้อความที่เราสร้างขึ้นมาได้อีกด้วย
รูปที่ 5-5
แสดงโครงสร้าง
การจัดเก็บอาร์เรย์
ของข้อความในไฟล์
myxml.xml
ณ จุดนี้ส่วนของข้อความพร้อมแล้ว ขั้นตอนต่อไปเป็นการน�ำรายการที่เราสร้างขึ้นมาไปแสดงใน
ส่วนแสดงผล
6. ที่ส่วนแสดงผลให้ใช้ TextView 1 ตัวตั้งชื่อว่า tvMain ดังรูปที่ 5-6
รูปที่ 5-6
ส่วนแสดงผลที่ได้
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="TextView" />
</RelativeLayout>
import android.os.Bundle;
import android.app.ListActivity;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
8. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 5-7
ผลการรัน
ตัวอย่างที่ 5-2
8.1 เลือก
พื้นฐานการแสดงรูปภาพก�ำกับแต่ละรายการในคลาส
ListActivity
จากหัวข้อทีผ่ า่ นมารายการทีป่ รากฏอยูใ่ นส่วนแสดงผลของ Activity สามารถใส่รปู ก�ำกับแต่ละรายการ
ได้เช่นกัน ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 5-3 พื้นฐานการแสดงรูปภาพก�ำกับแต่ละรายการในคลาส ListActivity มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า UsingListActivity
2. ให้ใช้ ImageView จ�ำนวน 1 ตัวตัง้ ชือ่ ว่า imgMain โดยก�ำหนดให้แสดงรูปภาพทีช่ อื่ ว่า ic_launcher
อยู่ในโฟลเดอร์ Drawable ผ่านทางคุณสมบัติ Src ดังรูปที่ 5-8
2.3 คลิก
<ImageView
android:id="@+id/imgMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="26dp"
android:layout_toRightOf="@+id/imgMain"
android:text="@+id/tvMain"
android:textSize="20dp" />
</RelativeLayout>
import android.os.Bundle;
import android.app.ListActivity;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
String[] MainMenu = new String[] { "เมนู 1", "เมนู 2", "เมนู 3",
"เมนู 4", "เมนู 5" };
ArrayAdapter<String> arrAdt = new ArrayAdapter<String>(this, 2
R.layout.activity_main, R.id.tvMain, MainMenu);
setListAdapter(arrAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 5-10
ผลการรัน
ตัวอย่างที่ 5-3
2 ลากวาง
จากรูปที่ 5-11 ไฟล์รปู ภาพถูกเพิม่ เข้ามาในโปรเจ็กต์อยูใ่ นฐานะเป็น Resource ประเภทหนึง่ ทีส่ ามารถ
1
เรียกใช้ได้นั่นเอง
3. ออกแบบส่วนแสดงผลดังรูปที่ 5-12
รูปที่ 5-12
แสดงการใช้งาน
ImageView และ
TextView
ImageView
<ImageView
android:id="@+id/imgMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/pic01" />
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="14dp"
android:layout_toRightOf="@+id/imgMain"
android:text="TextView" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapterWithImage myAdt = new ArrayAdapterWithImage(this, MainMenu);
setListAdapter(myAdt);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) { 7
String str = getListAdapter().getItem(position).toString();
Toast.makeText(this,"รายการ : " + str + " ถูกเลือก", Toast.LENGTH_SHORT).show();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) { 2
LayoutInflater inflater = context.getLayoutInflater();
View v = inflater.inflate(R.layout.activity_main, null, true);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 5-13
ผลการรัน
ตัวอย่างที่ 5-4
5.1 เลือก
5.2 แสดงผล
5. เราจะตรวจสอบว่าแต่ละรายการต้องใช้รูปใด กล่าวคือ
กรณีเป็นรายการ เมนู 1 ใช้รูปที่ชื่อว่า pic01
\src\com.example.listactivitywithmultipleimage\MainActivity.java
public class MainActivity extends ListActivity {
String MainMenu[]={"เมนู 1","เมนู 2","เมนู 3","เมนู 4","เมนู 5"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapterWithImage myAdt = new ArrayAdapterWithImage(this, MainMenu);
setListAdapter(myAdt);
}
<ImageView
android:id="@+id/imgMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/pic01" />
<TextView
android:id="@+id/tvMain"
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imgMain"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:src="@drawable/arrow" />
</RelativeLayout>
3. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 5-16
ผลของการแก้ไข
import android.os.Bundle;
import android.app.ListActivity;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 3
super.onCreate(savedInstanceState);
mainAdt = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, MainMenu);
subAdt = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, SubMenu);
setListAdapter(mainAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
3.3 แสดงผล
\src\com.example.usinglistactivity\MainActivity.java
public class MainActivity extends ListActivity {
String[] MainMenu = { "เมนูหลัก 1", "เมนูหลัก 2", "เมนูหลัก 3","เมนูหลัก 4", "เมนูหลัก 5" };
String[] SubMenu = new String[] { "เมนูย่อย 1", "เมนูย่อย 2", "เมนูย่อย 3" };
\src\com.example.usinglistactivity\MainActivity.java
String strMain = "";
ArrayAdapter<String> mainAdt;
ArrayAdapter<String> subAdt;
พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วย List-
View
ส่วนแสดงผลแบบรายการเป็นรูปแบบการน�ำเสนอเนือ้ หาทีไ่ ด้รบั ความนิยมในระดับต้นๆ ของ Android
App การใช้งาน ListView ในขั้นต้นนี้ประกอบด้วยการท�ำงาน 2 ส่วนคือ
1. วิธีการสร้างรายการ
2. การตรวจสอบว่าผู้ใช้คลิกเลือกรายการใด
ตัวอย่างที่ 6-1 พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วย ListView มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SimpleListView
2. ให้ใช้งาน widget ที่ชื่อว่า ListView สร้างส่วนแสดงผล ดังรูปที่ 6-1
รูปที่ 6-1
แสดง ListView
ในขณะออกแบบ
Android App Development
จากรูปที่ 6-1 แสดงสคริปต์ XML ได้ดังต่อไปนี้
สคริปต์ XML ที่ 6-1 พื้นฐานการสร้างส่วนแสดงผลแบบรายการด้วย ListView (\res\Layout\activity_main.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/lsvMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] myMenus = new String[] {
"เมนู 1", "เมนู 2", "เมนู 3", "เมนู 4", "เมนู 5"
};
lsv.setOnItemClickListener(new OnItemClickListener() { 4
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
{
String UserSelected = ((TextView) view).getText().toString();
Toast.makeText(getApplicationContext(),UserSelected, Toast.LENGTH_SHORT).show();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 6-2
ผลการรัน
ตัวอย่างที่ 6-1
4.1 เลือก
4.2 แสดงผล
2. ให้หา ListView ทีช่ อ่ื ว่า lsvMain ในส่วนแสดงผลมาเก็บไว้ทตี่ วั แปรออบเจ็กต์ ListView ทีช่ อื่ ว่า lsv
\src\com.example.simplelistview\MainActivity.java
ListView lsv = (ListView)findViewById(R.id.lsvMain);
ทางเมธอด getText()
สั่งให้แสดงข้อความของเมนูที่ถูกคลิกเลือกด้วยคลาส Toast ร่วมกับเมธอด show()
\src\com.example.simplelistview\MainActivity.java
lsv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
{
String UserSelected = ((TextView) view).getText().toString();
Toast.makeText(getApplicationContext(),UserSelected, Toast.LENGTH_SHORT).show();
}
});
}
การแสดงข้อมูลแบบหลายคอลัมน์ใน ListView
ในกรณีที่เราต้องการแสดงผลรายการข้อมูลในลักษณะแบ่งรายการที่แสดงอยู่ใน ListView ออกเป็น
คอลัมน์เหมือนกับตารางก็สามารถท�ำได้เช่นกัน
ตัวอย่างที่ 6-2 การแสดงข้อมูลแบบหลายคอลัมน์ใน ListView มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SimpleMultiColumn
2. ในกรณีนี้ผู้เขียนต้องการก�ำหนดให้แต่ละรายการถูกแบ่งออกเป็น 3 คอลัมน์จึงต้องเพิ่ม Layout
ใหม่ในโฟลเดอร์ layout (\res\layout) โดยการคลิกขวาเลือกค�ำสั่ง New > Other... > Android >
Android XML Layout File เพื่อสร้าง Layout ใหม่ให้แต่ละรายการ ดังรูปที่ 6-3
2.1 คลิกขวา
2.2 เลือก
เลือก 2.5
2.6 กรอกชื่อ
2.7 เลือก
2.3 เลือก
2.4 คลิก
2.8 คลิก
<TextView
android:id="@+id/tvCol1"
android:layout_width="80dp"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvCol2"
android:layout_width="170dp"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvCol3"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
ณ จุดนี้รูปแบบของการแสดงข้อมูล 1 แถวพร้อมใช้งานแล้ว
4. ที่ส่วนแสดงผลหลัก (activity_main.xml) ให้ออกแบบดังรูปที่ 6-4
รูปที่ 6-4
ส่วนแสดงผลที่ได้
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="6dp"
android:paddingTop="4dip" >
<TextView
android:id="@+id/c1"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="0.50"
android:text="@string/Col1" />
<TextView
android:id="@+id/c2"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_weight="0.75"
android:text="@string/Col2" />
<TextView
android:id="@+id/c3"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_weight="0.18"
android:text="@string/Col3" />
</LinearLayout>
<ListView
android:id="@+id/lsvMain"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lsv = (ListView) findViewById(R.id.lsvMain); 2
ArrayList<HashMap<String, String>> arr = new ArrayList<HashMap<String, String>>();
lsv.setOnItemClickListener(new OnItemClickListener() { 4
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
parent.getItemAtPosition(position).toString(),
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6.2 เลือก
6.1 แสดงผล
ในกรณีนี้ผู้เขียนสร้างข้อมูลขึ้นมา 3 แถว
\src\com.example.simplemulticolumn\MainActivity.java
ArrayList<HashMap<String, String>> arr = new ArrayList<HashMap<String, String>>();
4. ตรวจสอบแถวที่ถูกคลิกเลือกอยู่ในเหตุการณ์ setOnItemClickListener()
\src\com.example.simplemulticolumn\MainActivity.java
lsv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
parent.getItemAtPosition(position).toString(),
Toast.LENGTH_SHORT).show();
}
});
}
cmdClear
lsvMain
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/cmdSelectAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strAll" />
<Button
android:id="@+id/cmdClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strClear" />
<Button
android:id="@+id/cmdCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strCheck" />
</LinearLayout>
import android.os.Bundle;
import android.app.Activity;
import android.util.SparseBooleanArray;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); 2
String[] arrMain = { "รายการที่ 1", "รายการที่ 2", "รายการที่ 3","รายการที่ 4", "รายการที่ 5" };
cmd_SelectAll.setOnClickListener(new Button.OnClickListener() { 4
public void onClick(View v) {
for (int i = 0; i < lsv.getCount(); i++)
lsv.setItemChecked(i, true);
}
});
cmd_Clear.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
for (int i = 0; i < lsv.getCount(); i++)
lsv.setItemChecked(i, false);
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
·กรณีเลือกทั้งหมด แสดงดังรูปที่ 6-7
รูปที่ 6-7
กรณีเลือกทุก
รายการ คลิก 4.1
4.2 แสดงผล
4.4 แสดงผล
4.5 เลือก
4.7 แสดงผล
อธิบายการท�ำงานของโค้ด
1. เริ่มต้นสร้างอาร์เรย์ของข้อความที่ชื่อว่า arrMain ขึ้นมาท�ำหน้าที่เป็นรายการต่างๆ ที่ปรากฏใน
ส่วนแสดงผล ในกรณีนี้ก�ำหนดให้มี 5 รายการ และสร้างตัวแปรออบเจ็กต์ ListView ที่ชื่อว่า lsv
ไว้ก่อน
\src\com.example.listviewwithcheckbox\MainActivity.java
public class MainActivity extends Activity {
ListView lsv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] arrMain = { "รายการที่ 1", "รายการที่ 2", "รายการที่ 3","รายการที่ 4", "รายการที่ 5" };
\src\com.example.listviewwithcheckbox\MainActivity.java
lsv = (ListView) findViewById(R.id.lsvMain);
Button cmd_SelectAll = (Button) findViewById(R.id.cmdSelectAll);
Button cmd_Clear = (Button) findViewById(R.id.cmdClear);
Button cmd_Check = (Button) findViewById(R.id.cmdCheck);
สถานะของรายการที่ถูกเลือกให้เก็บสะสมค่าไว้ที่ตัวแปร str
\src\com.example.listviewwithcheckbox\MainActivity.java
if (arrBool.get(i)) {
str += lsv.getItemAtPosition(i).toString() + "\n";
}
}
<ListView
android:id="@+id/lsvMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true">
</ListView>
</RelativeLayout>
3.1 คลิกขวา
3.2 เลือก
3.3 เลือก
3.4 คลิก
4.4 เลือก
4.5 คลิก
6. เพิม่ ไฟล์ Android XML Layout File ในโฟลเดอร์ layout ตัง้ ชือ่ ว่า activity_main_item.xml ท�ำหน้าที่
แสดงรายการใน ListView และก�ำหนดให้แสดงข้อความธรรมดา โดยการใช้งาน TextView จ�ำนวน
1 ตัว ดังรูปที่ 6-14
รูปที่ 6-14
แสดงการใช้งาน
TextView
6.3 เลือก
6.1 เลือก
คลิก 6.2
6.4 คลิก
<TextView
android:id="@+id/tvMain"
android:layout_width="match_parent"
android:layout_height="32dp"
android:background="@drawable/lsv_normal"
android:text="TextView" />
</LinearLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lsv = (ListView) findViewById(R.id.lsvMain);
String[] str = new String[] { "รายการที่ 1", "รายการที่ 2",
"รายการที่ 3", "รายการที่ 4", "รายการที่ 5" };
ArrayAdapter<String> arrAdt = new ArrayAdapter<String>(this,
R.layout.activity_main_item, R.id.tvMain, str);
lsv.setAdapter(arrAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
<TextView
android:id="@+id/tvMain"
android:layout_width="match_parent"
android:layout_height="32dp"
android:text="TextView" />
</LinearLayout>
ในกรณีนี้ผู้เขียนตั้งโจทย์ว่า เมื่อรายการใดก็ตามอยู่ในสถานะถูกโฟกัสให้มีสีพื้นหลังเป็นแบบไล่โทนสี
แดง และถ้าผู้ใช้คลิกเลือกรายการใดก็ตามให้สีพื้นหลังเปลี่ยนเป็นแบบไล่โทนสีน�้ำเงิน
จากข้อก�ำหนดข้างต้นจึงท�ำให้ต้องสร้างสีแบบ Gradient ขึ้นมา 2 ไฟล์คือ Gradient แบบสีแดง และ
แบบสีน�้ำเงินก่อน
3. ในโฟลเดอร์ drawable ไฟล์ที่ท�ำหน้าที่เก็บโทนสีแดง ชื่อว่า lsv_normal.xml ดังรูปที่ 6-17
รูปที่ 6-17
แสดงราย
ละเอียดของไฟล์
lsv_normal.xml
3 ไฟล์ lsv_normal.xml
4 ไฟล์ lsv_press.xml
<item android:drawable="@drawable/lsv_normal"
android:state_pressed="false"
android:state_selected="false"/>
<item android:drawable="@drawable/lsv_press"
android:state_pressed="true"/>
<item android:drawable="@drawable/lsv_press"
android:state_pressed="false"
android:state_selected="true"/>
</selector>
pressed กับแอตทริบวิ ต์ android:state_selected มีคา่ เป็น false) ให้ใช้สที อี่ ยูใ่ นไฟล์ lsv_normal
z ·เมื่อรายการใดก็ตามอยู่ในสถานะถูกคลิก (แอตทริบิวต์ android:state_pressed มีค่าเป็น true)
หรือถูกเลือก (แอตทริบวิ ต์ android:state_selected มีคา่ เป็น true) ให้ใช้สที อี่ ยูใ่ นไฟล์ lsv_press
รูปที่ 6-20
แสดงสีพื้นหลัง
เป็นสีแดง เมื่อ
รายการได้รับ
โฟกัส (ผลจากไฟล์
lsv_normal)
รูปที่ 6-21
แสดงสีพื้นหลัง
เป็นสีน�้ำเงิน เมื่อ
รายการถูกคลิก
เลือก (ผลจากไฟล์
lsv_press)
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
tools:context=".MainActivity" />
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4.1 เลือก
4.2 แสดงผล
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
\src\com.example.usingspinner\MainActivity.java
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
String str = arg0.getItemAtPosition(arg2).toString();
Toast.makeText(arg0.getContext(), "รายการที่ถูกเลือก : " + str,
Toast.LENGTH_SHORT).show();
}
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="16dp" />
</RelativeLayout>
<ImageView
android:id="@+id/imgMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spn = (Spinner) findViewById(R.id.spinner1);
spn.setOnItemSelectedListener(this);
ArrayAdapter<String> adt = new ArrayAdapter<String>(this, 2
R.layout.spinnerlist, R.id.tvMain, arrMain);
spn.setAdapter(adt);
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String str = arg0.getItemAtPosition(arg2).toString();
Toast.makeText(arg0.getContext(), "รายการที่ถูกเลือก : " + str,
Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
อธิบายการท�ำงานของโค้ด
1. ก�ำหนดรายการเริ่มต้นให้มี 5 รายการผ่านทางตัวแปรออบเจ็กต์ spn
\src\com.example.spinnerwithimage\MainActivity.java
public class MainActivity extends Activity implements OnItemSelectedListener {
String[] arrMain = { "เมนู 1", "เมนู 2", "เมนู 3", "เมนู 4", "เมนู 5" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spn = (Spinner) findViewById(R.id.spinner1);
spn.setOnItemSelectedListener(this);
สรุปท้ายบท
เนื้อหาที่น�ำเสนอในบทนี้จะเห็นได้ว่า มีการใช้เทคนิคที่ผู้เขียนน�ำเสนอในบทก่อนหน้านี้เข้ามาประกอบ
รวมกันเป็นส่วนแสดงผลที่ใกล้เคียงกับ App ที่ผู้อ่านเคยพบเห็นได้ใน Play Store
<GridView
android:id="@+id/gvMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:numColumns="3" >
</GridView>
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
@Override
public void onCreate(Bundle savedInstanceState) { 2
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 7-2
ผลการรัน
ตัวอย่างที่ 7-1
4.1 เลือก
4.2 แสดงผล
จากรูปที่ 7-2 ผูเ้ ขียนก�ำหนดให้คา่ เริม่ ต้นมี 10 รายการ ส่งผลให้สว่ นแสดงผลทีไ่ ด้เป็นแบบ 3 คอลัมน์
4 แถว
อธิบายการท�ำงานของโค้ด
1. เริ่มต้นก�ำหนดให้ 10 รายการเก็บไว้ในตัวแปรอาร์เรย์ข้อความที่ชื่อว่า MainData ก่อน
\src\com.example.simplegridview\MainActivity.java
public class MainActivity extends Activity {
String[] mainData = new String[] { "รายการ 1", "รายการ 2", "รายการ 3",
"รายการ 4", "รายการ 5", "รายการ 6", "รายการ 7", "รายการ 8",
"รายการ 9", "รายการ 10" };
การแสดงข้อความและรูปภาพในแต่ละช่องตาราง
ในกรณีที่ต้องการเพิ่มความน่าสนใจของส่วนแสดงผลแบบช่องตาราง เราสามารถใช้รูปภาพประกอบ
ในแต่ละเซลล์ได้อีกด้วย ซึ่งเป็นรูปแบบที่สามารถพบเห็นได้ในอุปกรณ์ที่ติดตั้งระบบปฏิบัติการ Android ดัง
ตัวอย่างต่อไปนี้
ตัวอย่างที่ 7-2 การแสดงข้อความและรูปภาพในแต่ละช่องตารางมีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า GridViewWithImage
2. เตรียมไฟล์รปู ภาพทีต่ อ้ งการน�ำมาใช้ในแต่ละเซลล์ ซึง่
มีข้อแนะน�ำว่า ควรจะเป็นรูปภาพที่มีขนาดเท่ากัน ใน
กรณีนี้ผู้เขียนใช้รูปภาพขนาด 64×64 พิกเซล โดยลาก
มาเก็บไว้ในโฟลเดอร์ drawable-hdpi ก่อน ดังรูปที่ 7-3
รูปที่ 7-3
แสดงไฟล์รูปภาพ
ทั้ง 8 รูป
ในโฟลเดอร์
drawable-hdpi
<GridView
android:id="@+id/gvMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:horizontalSpacing="5dp"
android:numColumns="3"
android:verticalSpacing="5dp" >
</GridView>
</RelativeLayout>
จากรูปที่ 7-5 ผูเ้ ขียนต้องการให้แต่ละเซลล์ แสดงข้อความด้านบนผ่านทาง TextView ทีช่ อื่ ว่า tv และ
แสดงรูปภาพผ่านทาง ImageView ที่ชื่อว่า img ดังสคริปต์ XML ต่อไปนี้
สคริปต์ XML ที่ 7-2 การแสดงข้อความและรูปภาพในแต่ละช่องตาราง (\res\layout\gridcell.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pic01" />
</LinearLayout>
จากสคริปต์ XML ข้างต้นก�ำหนดให้ ImageView ทีช่ อื่ ว่า img แสดงรูปภาพเริม่ ต้นชือ่ ว่า pic01 (.png)
5. เขียนโค้ด JAVA ก�ำหนดการท�ำงานดังต่อไปนี้
โค้ด JAVA ที่ 7-2 การแสดงข้อความและรูปภาพในแต่ละช่องตาราง (\src\com.example.gridviewwithimage\
MainActivity.java)
package com.example.gridviewwithimage;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
public gvAdapter(Context c) {
_Context = c;
}
if (arg1 == null) {
v = new View(_Context);
LayoutInflater inflater = getLayoutInflater();
v = inflater.inflate(R.layout.gridcell, arg2, false);
} else {
v = (View) arg1;
}
@Override
public void onCreate(Bundle savedInstanceState) { 5
super.onCreate(savedInstanceState);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 7-6
ผลการรัน
ตัวอย่างที่ 7-2
อ้างอิงให้กับเมธอดนี้เพื่ออ่านข้อมูลชุดที่สนใจ
เมธอด getItemId() ท�ำหน้าที่คืนค่าเป็นรายการ (ข้อมูล) เท่าที่มีอยู่เช่นกัน แต่ใช้ Id ใน
public gvAdapter(Context c) {
_Context = c;
}
if (arg1 == null) {
v = new View(_Context);
LayoutInflater inflater = getLayoutInflater();
v = inflater.inflate(R.layout.gridcell, arg2, false);
} else {
v = (View) arg1;
}
img
·ให้อ่าน TextView ที่ชื่อว่า tv ผ่านทางตัวแปรออบเจ็กต์ v มาเก็บไว้ที่ตัวแปรออบเจ็กต์ tv
<CheckBox
android:id="@+id/chk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pic01" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
z การเลือกทุกตัวเลือกเท่าที่มีอยู่ในส่วนแสดงผล
z การยกเลิกทุกตัวเลือกเท่าที่มีอยู่ในส่วนแสดงผล
z การตรวจสอบรายการที่อยู่ในสถานะถูกเลือก
<Button
android:id="@+id/cmdCheckAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/strCheckAll" />
<Button
android:id="@+id/cmdClearAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/cmdCheckAll"
android:text="@string/strClearAll" />
<Button
android:id="@+id/cmdGetAll"
android:layout_width="wrap_content"
<GridView
android:id="@+id/gvMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/cmdCheckAll"
android:layout_marginTop="25dp"
android:numColumns="2" >
</GridView>
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public gvAdapter(Context c) {
_Context = c;
}
if (arg1 == null) {
v = new View(_Context);
LayoutInflater inflater = getLayoutInflater();
v = inflater.inflate(R.layout.gridcell, arg2, false);
} else {
v = (View) arg1;
}
ImageView img = (ImageView) v.findViewById(R.id.img);
img.setImageResource(picLists[arg0]);
TextView tv = (TextView) v.findViewById(R.id.tv);
tv.setText("รูปที่ : " + String.valueOf(arg0 + 1));
return v;
}
}
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final GridView gv = (GridView) findViewById(R.id.gvMain);
gvAdapter adt = new gvAdapter(this);
gv.setAdapter(adt);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
กรณีเลือกทุกตัวเลือก แสดงดังรูปที่ 7-9
รูปที่ 7-9
กรณีเลือกทุกตัว
เลือก คลิก 5.1
5.2 แสดงผล
รูปที่ 7-10
กรณีตรวจสอบ
รายการที่อยู่ใน 5.4 เลือก
สถานะถูกเลือก
เลือก 5.3
5.5 แสดงผล
อธิบายการท�ำงานของโค้ด
1. เริม่ ต้นทีส่ ว่ นแสดงผลสัง่ ให้อา่ น GridView ทีช่ อื่ ว่า gvMain ไว้ทตี่ วั แปรออบเจ็กต์ gv ใช้สว่ นแสดง
ผลที่ได้จากตัวแปรออบเจ็กต์ gvAdapter ที่ชื่อว่า adt ร่วมกับเมธอด setAdaper()
\src\com.example.gridviewwithimage\MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final GridView gv = (GridView) findViewById(R.id.gvMain);
gvAdapter adt = new gvAdapter(this);
gv.setAdapter(adt);
สรุปท้ายบท
การสร้างส่วนแสดงผลแบบช่องตารางด้วย GridView ไม่มคี วามซับซ้อนแต่อย่างใด เนือ้ หาทีเ่ ลือกมา
น�ำเสนอในบทนี้ผู้อ่านสามารถน�ำไปประยุกต์ใช้ได้เป็นอย่างดี
3.2 เลือก
3.3 คลิก
รูปที่ 8-3
แสดงการสร้าง
เมนูย่อย 3 เมนู
5.1 เลือก
เลือก 5.2
5.3 คลิก
จากรูปที่ 8-4 ให้ผอู้ า่ นสร้างเหตุการณ์ทชี่ อื่ ว่า onOptionsItemSelected(MenuItem) เพือ่ ให้ Activity
สามารถตรวจสอบการคลิกเมนูได้นั่นเอง
บทที่ 8 ระบบเมนูใน Android 175
Android App Development
6. เขียนโค้ด JAVA ก�ำหนดการท�ำงานดังต่อไปนี้
โค้ด JAVA ที่ 8-1 ที่ 8-1 ท�ำความรู้จักกับระบบเมนูใน Android App (\src\com.example.simplemenu\MainAc-
tivity.java)
package com.example.simplemenu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@Override
public boolean onOptionsItemSelected(MenuItem item) { 1
// TODO Auto-generated method stub
{
switch (item.getItemId()) {
case R.id.mnu1: 2
Toast.makeText(MainActivity.this, "คุณเลือกเมนู 1",
Toast.LENGTH_SHORT).show();
return true;
case R.id.mnu2:
Toast.makeText(MainActivity.this, "คุณเลือกเมนู 2",
Toast.LENGTH_SHORT).show();
return true;
case R.id.mnu3:
Toast.makeText(MainActivity.this, "คุณเลือกเมนู 3",
Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
7.2 เลือก
การสร้างเมนู About Me
เราสามารถใช้ฟีเจอร์ของการสร้างเมนูมาท�ำเมนู About Me ซึ่งท�ำหน้าที่อธิบายรายละเอียดของ
ผู้พัฒนา App ได้ ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 8-2 การสร้างเมนู About Me มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า AboutMe
2. เริ่มต้นสร้างข้อความที่ชื่อว่า strAbout ในไฟล์ strings.xml (\res\values) โดยก�ำหนดข้อความ
ตามที่ต้องการในกรณีนี้คือข้อความ “About Me”
รูปที่ 8-6
แสดงการสร้าง
ข้อความที่ชื่อว่า
strAbout
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) { 2
getMenuInflater().inflate(R.menu.activity_main, menu);
menu.add(0, 0, 0, R.string.strAbout);
return super.onCreateOptionsMenu(menu);
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 8-7
ผลการรัน
ตัวอย่างที่ 8-2
3. ที่ส่วนแสดงผลให้ออกแบบดังรูปที่ 8-9
รูปที่ 8-9
ส่วนแสดงผลที่ได้
<Button
android:id="@+id/cmdCallMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="14dp"
android:layout_marginTop="14dp"
android:text="@string/cmdMenu" />
</RelativeLayout>
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 1
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button cmd = (Button) findViewById(R.id.cmdCallMenu);
cmd.setOnClickListener(new View.OnClickListener() { 2
public void onClick(View v) {
PopupMenu pop = new PopupMenu(MainActivity.this, v);
pop.getMenuInflater().inflate(R.menu.activity_main,
pop.getMenu());
pop.setOnMenuItemClickListener(new
PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, arg0.toString(),
Toast.LENGTH_SHORT).show();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
5. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 8-10
ผลการรัน
ตัวอย่างที่ 8-3
คลิก 5.1
5.2 แสดงผล
กำ�หนดเงื่อนไข
เพิ่มเติม
ณ จุดนี้เมนูย่อยทั้ง 3 เมนูพร้อมแล้ว
3. การใช้งาน Action Bar ใน Activity ผู้อ่านต้องก�ำหนดเพิ่มเติมในไฟล์ AndroidManifest.xml
โดยการก�ำหนดแอตทริบิวต์ android:uiOptions=“splitActionBarWhenNarrow” ดังรูปที่ 8-2
รูปที่ 8-12
แสดงการก�ำหนด
แอตทริบวิ ต์ and
roid:uiOptions=
“splitActionBar
WhenNarrow”
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.mnu1:
Toast.makeText(this, "เมนู Action 1 ถูกเลือก", Toast.LENGTH_SHORT).show();
return true;
case R.id.mnu2:
Toast.makeText(this, "เมนู Action 2 ถูกเลือก", Toast.LENGTH_SHORT).show();
return true;
case R.id.mnu3:
Toast.makeText(this, "เมนู Action 3 ถูกเลือก", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
};
5. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 8-13
ผลการรัน
ตัวอย่างที่ 8-4
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(this, "รายการ : " + item.getTitle() + " ถูกเลือก",
Toast.LENGTH_SHORT).show();
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 8-16
ผลการรัน
ตัวอย่างที่ 8-5
4.2 แสดงผล
4.1 เลือก
สรุปท้ายบท
การสร้างเมนูทหี่ มาะสมและชัดเจน จะท�ำให้ผใู้ ช้งานสามารถเข้าถึงฟีเจอร์ตา่ งๆ ทีอ่ ยูใ่ น App ได้อย่าง
มีประสิทธิภาพ ดังนั้น การออกแบบเมนูจึงเป็นเรื่องที่ต้องให้ความใส่ใจเป็นอย่างมากอีกเรื่องหนึ่งเลยทีเดียว
\res\layout
โค้ด JAVA อยูใ่ นไฟล์ทช
ี่ อื่ ว่า MainActivity.java เก็บอยูใ่ นพาธ \src\ชือ่ package ของโปรเจ็กต์
Android App Development
รูปที่ 9-1
แสดงโปรเจ็กต์
Android ว่างๆ
รูปที่ 9-2
แสดงข้อความ
ทั้ง 4 ในไฟล์
strings.xml
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="23dp"
android:text="@string/FirstActivity"
tools:context=".MainActivity" />
<Button
android:id="@+id/cmdGotoSecondActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="28dp"
android:text="@string/cmdSecondActivity" />
</RelativeLayout>
5.1 คลิกขวา
5.2 เลือก
5.3 เลือก
5.4 คลิก
6.1 เลือก
6.2 คลิก
<TextView
android:id="@+id/textView1"
android:layout_width="92dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
<Button
android:id="@+id/cmdBackToFirstActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="16dp"
android:text="@string/cmdFirstActivity" />
</RelativeLayout>
ณ จุดนี้ส่วนแสดงผลทั้ง 2 หน้าจอพร้อมแล้ว
8. หน้าจอที่ 2 มีส่วนแสดงผลแล้วแต่ยังไม่มีส่วนของโค้ด JAVA ให้เพิ่มเข้ามาในโปรเจ็กต์ โดยการ
คลิกขวาทีโ่ ฟลเดอร์ src แล้วเลือกค�ำสัง่ New > Class เพือ่ เพิม่ คลาส JAVA เข้ามา ดังรูปที่ 9-8
รูปที่ 9-8
แสดงการเพิ่ม
คลาสว่างๆ เข้า
มาในโปรเจ็กต์ 8.1 คลิกขวา
ปัจจุบัน
8.2 เลือก
8.3 คลิก
8.4 เลือก
8.5 คลิก
9.1 กำ�หนด
9.2 คลิก
9.3 แสดงโค้ด
10.1 เลือก
เลือก 10.2
10.3 เลือก
10.4 คลิก
รูปที่ 9-11
แสดงเหตุการณ์
onCreate()
ของคลาส Main-
Activity2
10.5 แสดงโค้ด
11.2 คลิก
ดับเบิลคลิก 11.1
11.3 เลือก
11.4 เลือก
เลือก 11.5
11.6 เลือก
จากรูปที่ 9-13 ให้กำ� หนดรายละเอียดขัน้ ต้นเพิม่ เติมทีช่ อ่ ง Name (ชือ่ Activity) กับช่อง Label (ข้อความ
บนแถบด้านบน)
12. เขียนโค้ด JAVA เชื่อมโยงการท�ำงานระหว่าง 2 Activity ดังโค้ดต่อไปนี้
โค้ด JAVA ที่ 9-1 การสร้างส่วนแสดงผลที่มี 2 Activity และปุ่มเปลี่ยนส่วนแสดงผลไป-มา (\src\com.example.
multipleactivity\MainActivity.java)
package com.example.multipleactivity;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button cmd = (Button) findViewById(R.id.cmdGotoSecondActivity); 1
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent it = new Intent (getApplicationContext(),MainActivity2.class);
startActivity(it);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) { 2
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Button cmd = (Button) findViewById(R.id.cmdBackToFirstActivity); 3
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
}
13. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 9-14
ผลการรัน
ตัวอย่างที่ 9-1 13.2 แสดงผล
13.1 คลิก
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
การรับ-ส่งข้อมูลระหว่าง Activity
การสร้าง Android App ทีม่ ี Activity ตัง้ แต่ 2 Activity ขึน้ ไปย่อมทีจ่ ะต้องมีการรับ-ส่งข้อมูลจาก Activity
หนึง่ ไปสู่ Activity หนึง่ เพือ่ ให้ผอู้ า่ นสามารถน�ำข้อมูลทีร่ บั -ส่งระหว่างกันไปใช้ในการท�ำงานในระดับถัดไปนัน่ เอง
ตัวอย่างที่ 9-2 การรับส่งข้อมูลระหว่าง Activity มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SendData
2. ผู้เขียนใช้ส่วนแสดงผลที่ชื่อว่า activity_main.xml ท�ำหน้าที่ส่งข้อมูล และใช้ส่วนแสดงผลที่ชื่อ
ว่า secondscreen.xml ท�ำหน้าที่รับข้อมูล
3. ออกแบบส่วนแสดงผลในไฟล์ activity_main.xml ซึ่งท�ำหน้าที่ส่งข้อมูล ดังรูปที่ 9-15
รูปที่ 9-15
ส่วนแสดงผล
ของไฟล์ activ- EditText
ity_main.xml
EditText
Button
<EditText
android:id="@+id/edtFullName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:ems="10"
android:inputType="textPersonName" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/edtAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:inputType="textPersonName"
android:ems="10" />
<Button
android:id="@+id/cmdSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/strSend" />
</LinearLayout>
4. ให้เพิ่ม Android XML Layout File เข้ามาอีก 1 ไฟล์ ตั้งชื่อว่า secondscreen.xml ท�ำหน้าที่รับ
ข้อมูล โดยก�ำหนดให้ใช้ LinearLayout แบบแนวตัง้ (แอตทริบวิ ต์ android:orientation = vertical)
ใช้ TextView จ�ำนวน 3 ตัว ดังสคริปต์ XML ต่อไปนี้
สคริปต์ XML ที่ 9-2 การรับ-ส่งข้อมูลระหว่าง Activity (\res\layout\secondscreen.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tvView" />
<TextView
android:id="@+id/tvFullName"
<TextView
android:id="@+id/tvAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
เพิ่มอิลิเมนต์
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
@Override
public void onCreate(Bundle savedInstanceState) {
cmd.setOnClickListener(new View.OnClickListener() { 2
public void onClick(View v) {
Intent it = new Intent(getApplicationContext(), SecondView.class);
it.putExtra("f", edt_FullName.getText().toString());
it.putExtra("a", edt_Address.getText().toString());
startActivity(it);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
Intent it = getIntent(); 4
String strFullName = it.getStringExtra("f");
String strAddress = it.getStringExtra("a");
tvFullName.setText(strFullName);
tvAddress.setText(strAddress);
}
}
8.2 คลิก
อธิบายการท�ำงานของโค้ด
หลักการท�ำงานของตัวอย่างนี้แยกออกเป็น 2 ฝั่งคือ
z ฝั่งส่งข้อมูล (ส่วนแสดงผล activity_main.xml) ร่วมกับโค้ดใน MainActivity.java
1. เริม่ ต้นทีฝ่ ง่ั ส่งข้อมูลให้ใช้สว่ นแสดงผลทีช่ อื่ ว่า activity_main ในกรณีนผี้ เู้ ขียนก�ำหนดให้สง่ ข้อมูล
2 อย่าง โดยที่
อา ่ น EditText ทีช่ อื่ ว่า edtFullName เก็บไว้ทตี่ วั แปรออบเจ็กต์ EditText ทีช่ อื่ ว่า edt_Full-
Name
อา ่ น EditText ทีช่ อื่ ว่า edtAddress เก็บไว้ทตี่ วั แปรออบเจ็กต์ EditText ทีช่ อื่ ว่า edt_Address
อ่าน Button ที่ชื่อว่า cmdSend เก็บไว้ที่ตัวแปรออบเจ็กต์ Button ที่ชื่อว่า cmd
\src\com.example.senddata\MainActivity.java
public class MainActivity extends Activity {
EditText edt_FullName;
EditText edt_Address;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvFullName
อา ่ น TextView ทีช่ อื่ ว่า tvAddress เก็บไว้ทตี่ วั แปรออบเจ็กต์ TextView ทีช่ อื่ ว่า tvAddress
ผู้เขียนใช้ TextView ทั้ง 2 ตัวข้างต้นเข้ามาท�ำหน้าที่แสดงข้อมูลที่รับมาจาก Activity ที่ชื่อว่า Main-
Activity
\src\com.example.senddata\SecondView.java
public class SecondView extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondscreen);
4. ท้ายทีส่ ดุ ใช้ฟงั ก์ชนั ทีช่ อื่ ว่า getIntent() เข้ามาท�ำหน้าทีร่ บั ออบเจ็กต์ Intent ทีม่ าจาก MainActivity
เก็บไว้ที่ตัวแปรออบเจ็กต์ Intent ที่ชื่อว่า it เช่นกันโดยให้
อ่านข้อมูลชุดที่ 1 ออกมาจาก f เก็บไว้ที่ตัวแปร strFullName
tvFullName.setText(strFullName);
tvAddress.setText(strAddress);
}
<TextView
android:id="@+id/tvReceived"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
3. เขียนโค้ด JAVA ให้กบั ส่วนแสดงผลหลัก (activity_main.xml) ก่อนอยูใ่ นไฟล์ทชี่ อื่ ว่า MainActivity.
1
java ดังนี้
โค้ด JAVA ที่ 9-3 การสร้างลิงค์ใน ListActivity เชื่อมโยงไปยัง Activity อื่น (\src\com.example.usinglistactiv-
ity\MainActivity.java)
package com.example.usinglistactivity;
import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
String[] arrStr = new String[] {"เมนู 1","เมนู 2","เมนู 3","เมนู 4","เมนู 5"};
ArrayAdapter<String> arrAdt = new ArrayAdapter<String> (this,android.R.layout.
simple_list_item_1, arrStr);
setListAdapter(arrAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) { 3
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_second);
}
}
กำ�หนดอิลิเมนต์
String[] arrStr = new String[] {"เมนู 1","เมนู 2","เมนู 3","เมนู 4","เมนู 5"};
ArrayAdapter<String> arrAdt = new ArrayAdapter<String>(this,android.R.layout.
simple_list_item_1, arrStr);
setListAdapter(arrAdt);
}
สรุปท้ายบท
เทคนิคที่น�ำเสนอในบทนี้ผู้อ่านสามารถน�ำไปประยุกต์ใน App ประเภทต่างๆ มากมายเพราะว่า
นี่คือหลักการพื้นฐานของการท�ำงานตั้งแต่ 2 หน้าจอขึ้นไป
พื้นฐานการใช้งานฐานข้อมูล SQLite
ในหัวข้อนี้จะแนะน�ำให้ผู้อ่านได้รู้จักและฐานข้อมูล SQLite ในขั้นพื้นฐานได้ โดยผู้เขียนจะขออธิบาย
ผ่านตัวอย่างเพื่อให้ผู้อ่านสามารถเข้าใจการใช้งานร่วมกับ Android App ได้ชัดเจนยิ่งขึ้น
ตัวอย่างที่ 10-1 พื้นฐานการใช้งานฐานข้อมูล SQLite มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SimpleSQLite
2. การท�ำงานกับฐานข้อมูล SQLite เราควรสร้างคลาสขึ้นมาท�ำหน้าที่นี้ โดยคลิกขวาที่โฟลเดอร์ src
เลือกค�ำสั่ง New > Class ดังรูปที่ 10-1
รูปที่ 10-1
แสดงการสร้าง
คลาสใหม่ขึ้นมา
ใช้ในโปรเจ็กต์
ปัจจุบัน 2.1 คลิกขวา
2.2 เลือก
Android App Development
รูปที่ 10-1 (ต่อ)
แสดงการสร้าง
คลาสใหม่ขึ้นมา
ใช้ในโปรเจ็กต์
ปัจจุบัน 2.3 คลิกเพื่อเลือก Package
3.3 กรอกชื่อ
3.4 คลิก
จากรูปที่ 10-2 ผูเ้ ขียนตัง้ ชือ่ คลาสนีว้ า่ DbSQLite สืบทอดมาจากคลาสแม่ทชี่ อื่ ว่า android.database.
sqlite.SQLiteOpenHelper
รูปที่ 10-3
แสดงโครงสร้าง
ของคลาส DbS-
QLite ที่อยู่ใน
ไฟล์ DbSQLite.
java
คอนสตรัคเตอร์เป็นเมธอดพิเศษที่มีชื่อเดียวกับคลาส และถูกสั่งให้ท�ำงานโดยอัตโนมัติทันทีที่มีการ
ใช้ค�ำสั่ง new เพื่อสร้างออบเจ็กต์ขึ้นมาใช้งาน
5. คลาส DbSQLite ที่ผู้เขียนสร้างขึ้นมามีหน้าที่สร้างฐานข้อมูลที่ชื่อว่า Thaivb โดยที่
มีเพียง 1 ตาราง ชื่อว่า Customers
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase db) { 3
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + tableName +
"(CustomerID INTEGER PRIMARY KEY," +
" FullName TEXT(50)," +
" Address TEXT(200));");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 6
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DbSQLite db = new DbSQLite(this, null, null, 0);
db.getWritableDatabase();
Toast.makeText(MainActivity.this,"สร้างฐานข้อมูล เรียบร้อยแล้ว" ,Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
7. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 10-6
ผลการรัน
ตัวอย่างที่ 1
8.1 เลือก
8.2 เลือก
8.3 คลิก
9.2 เลือก
อธิบายการท�ำงานของโค้ด
1. ในคลาส DbSQLite เพื่อให้สะดวกต่อการแก้ไขผู้เขียนจึงสร้างตัวแปรขึ้นมา 3 ตัวกล่าวคือ
ตัวแปรที่ชื่อว่า dbName หมายถึง ชื่อฐานข้อมูล ในกรณีนี้คือ Thaivb
เวอร์ชัน 1 ใช้ในกรณีที่มีการปรับปรุงโครงสร้างของฐานข้อมูลใหม่ก็จะระบุหมายเลขเวอร์ชัน
ถัดไป
\src\com.example.simplesqlite\DbSQLite.java
public class DbSQLite extends SQLiteOpenHelper {
private static final String dbName = "Thaivb";
private static final String tableName = "Customers";
private static final int dbVersion = 1;
2. ที่คอนสตรัคเตอร์ของคลาสให้แก้ไขชื่อพารามิเตอร์ให้ตรงกับตัวแปรที่สร้างไว้ก่อนหน้านี้คือ
พารามิเตอร์ dbName กับ dbVersion
\src\com.example.simplesqlite\DbSQLite.java
public DbSQLite(Context context, String name, CursorFactory factory,
int version) {
super(context, dbName, factory, dbVersion);
// TODO Auto-generated constructor stub
}
การแสดงข้อมูลจากฐานข้อมูลด้วย ListView
การแสดงข้อมูลจากฐานข้อมูล SQLite ออกมาในส่วนแสดงผล ถือเป็นการท�ำงานในระดับเบื้องต้น
ที่พบเห็นได้ใน App หลายประเภท โดยที่ผู้เขียนเลือกใช้ ListView เข้ามาท�ำหน้าที่นี้
ตัวอย่างที่ 10-2 การแสดงข้อมูลจากฐานข้อมูลด้วย ListView มีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า SQLiteWithListView
2. ที่ส่วนแสดงผลหลัก (activity_main.xml) ให้ใช้ ListView จ�ำนวน 1 ตัว ดังรูปที่ 10-10
รูปที่ 10-10
ส่วนแสดงผลที่ได้
</RelativeLayout>
<TextView
android:id="@+id/tvCustomerID"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/tvFullName"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/tvAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
ณ จุดนี้ส่วนแสดงผลครบถ้วนตามที่ต้องการแล้ว ต่อไปเป็นขั้นตอนของการเขียนโค้ดท�ำงาน
220 Basic Android Programming
ความรู้พื้นฐานการพัฒนา Android App
4. สร้างคลาสที่ท�ำหน้าที่สร้างฐานข้อมูลและเพิ่มข้อมูลที่ต้องการทดสอบในฐานข้อมูล หลังจากนั้น
part
1
ให้แสดงข้อมูลทั้งหมดเท่าที่มีอยู่แบบไม่มีเงื่อนไข โดยการสร้างคลาสที่ชื่อว่า DbSQLite.java ใน
โฟลเดอร์ src ดังโค้ดต่อไปนี้
โค้ด JAVA ที่ z-1 ที่ 10-2 การแสดงข้อมูลจากฐานข้อมูลด้วย ListView (\src\com.example.sqlitewithlistview\
DbSQLite.java)
package com.example.sqlitewithlistview;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase db) { 1
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + tableName
+ "(CustomerID TEXT PRIMARY KEY," + " FullName TEXT(50),"
+ " Address TEXT(200));");
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
} catch (Exception e) {
return null;
}
}
}
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DbSQLite db = new DbSQLite(this, null, null, 0); 6
final ArrayList<HashMap<String, String>> CustomersLists = db.ShowAllData(); 7
ListView lsv = (ListView) findViewById(R.id.lsvCustomers); 8
SimpleAdapter adt = new SimpleAdapter(MainActivity.this,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 10-12
ผลการรัน
ตัวอย่างที่ 2
6.2 เลือก
6.1 แสดงข้อมูล
6.3 แสดงผล
\src\com.example.sqlitewithlistview\DbSQLite.java
public ArrayList<HashMap<String, String>> ShowAllData() {
try {
ArrayList<HashMap<String, String>> arr = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map;
วนลูปให้สร้างออบเจ็กต์ HashMap ทีช่ อ่ื ว่า map ขึน้ มาก�ำหนดให้เป็นข้อมูลแบบ 2 ชุด (<String,
String>()) และให้อ่านข้อมูลชุดปัจจุบันเก็บไว้ตามคอลัมน์ที่เราต้องการคือ CustomerID,
FullName และคอลัมน์ Address
เพิ่มข้อมูลของแถวปัจจุบันที่เก็บอยู่ในตัวแปร map ไว้ในตัวแปร arr ผ่านทางเมธอด add()
และวนลูปจนครบทุกรายการที่มีอยู่ในตัวแปร cur
\src\com.example.sqlitewithlistview\DbSQLite.java
if (cur != null) {
if (cur.moveToFirst()) {
do {
map = new HashMap<String, String>();
map.put("CustomerID", cur.getString(0));
map.put("FullName", cur.getString(1));
map.put("Address", cur.getString(2));
arr.add(map);
} while (cur.moveToNext());
}
}
cur.close();
db.close();
return arr;
การสร้างส่วนแสดงผลบันทึกข้อมูล
ในกรณีที่เราต้องการรับข้อมูลจากผู้ใช้งาน แล้วต้องการน�ำข้อมูลดังกล่าวไปบันทึกในฐานข้อมูลถือ
เป็นการท�ำงานพื้นฐานที่ผู้อ่านควรรู้ และสามารถน�ำไปประยุกต์ใช้ใน App ประเภทต่างๆ ได้มากมาย
ตัวอย่างที่ 10-3 การสร้างส่วนแสดงผลบันทึกข้อมูลมีขั้นตอนดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า InsertAndShow
2. สร้างส่วนแสดงผลหลัก (activity_main.xml) ดังรูปที่ 10-13
รูปที่ 10-13
ส่วนแสดงผลที่ได้ EditText
EditText
EditText
Button
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strCustomerID"
tools:context=".MainActivity" />
<EditText
android:id="@+id/edtCustomerID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strFullName" />
<EditText
android:id="@+id/edtFullName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/strAddress" />
<EditText
android:id="@+id/edtAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPostalAddress" />
<Button
android:id="@+id/cmdAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cmdAdd" />
</LinearLayout>
4. สร้างคลาสทีช่ อื่ ว่า DbSQLite ท�ำหน้าทีส่ ร้างฐานข้อมูล, เพิม่ ข้อมูล และแสดงข้อมูล ดังโค้ด JAVA
ต่อไปนี้
โค้ด JAVA ที่ 10-3 การสร้างส่วนแสดงผลบันทึกข้อมูล (\src\com.example.insertandshow\DbSQLite.java)
package com.example.insertandshow;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + tableName
+ "(CustomerID INTEGER PRIMARY KEY," + " FullName TEXT(50),"
+ " Address TEXT(200));");
}
try {
SQLiteDatabase db = this.getWritableDatabase();
SQLiteStatement sqlCom;
String sqlAdd = "INSERT INTO " + tableName
+ "(CustomerID,FullName,Address) VALUES (?,?,?)";
sqlCom = db.compileStatement(sqlAdd); 2
sqlCom.bindLong(1, _CustomerID);
sqlCom.bindString(2, _FullName);
sqlCom.bindString(3, _Address);
return sqlCom.executeInsert();
} catch (Exception e) { 3
return -1;
}
}
try {
List<Customers> CustomersLists = new ArrayList<Customers>();
SQLiteDatabase db = this.getReadableDatabase();
String strSQL = "SELECT * FROM " + tableName;
Cursor cur = db.rawQuery(strSQL, null);
if (cur != null) { 5
if (cur.moveToFirst()) {
do {
Customers c = new Customers();
c.setCustomerID(cur.getInt(0));
c.setFullName(cur.getString(1));
c.setAddress(cur.getString(2));
CustomersLists.add(c);
} while (cur.moveToNext());
}
}
cur.close();
db.close();
return CustomersLists;
} catch (Exception e) {
return null;
}
}
}
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
@Override
public void onCreate(Bundle savedInstanceState) { 6
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DbSQLite db = new DbSQLite(this, null, null, 0);
db.getWritableDatabase();
cmd.setOnClickListener(new View.OnClickListener() { 8
public void onClick(View v) {
try {
String CustomerID=edtCustomerID.getText().toString();
int _CustomerID=Integer.parseInt(CustomerID);
String _FullName=edtFullName.getText().toString();
String _Address=edtAddress.getText().toString();
long r = db.InsertData(_CustomerID,_FullName,_Address); 9
if (r > 0) {
Toast.makeText(MainActivity.this,
"เพิ่มข้อมูล 1 รายการแล้ว", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this,
"ไม่สามารถเพิ่มข้อมูลได้ !!!",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(MainActivity.this,
"ไม่สามารถเพิ่มข้อมูลได้ เนื่องจาก : "
+ e.getMessage(), Toast.LENGTH_SHORT).show();
}
List<Customers> CustomersLists = db.ShowAllCustomers();
if (CustomersLists != null) {
for (Customers c : CustomersLists) {
Toast.makeText(MainActivity.this,
"ข้อมูลลูกค้า : " + c.getCustomerID() + "-"
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
6. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 10-15
ผลการรัน
ตัวอย่างที่ 3
6.1 กรอกข้อมูล
6.2 คลิก
6.4 แสดงผล
6.3 แสดงผล
สร้างชุดค�ำสัง ่ SQL เพือ่ เพิม่ ข้อมูลลงในตารางตามชือ่ ทีเ่ ก็บอยูใ่ นตัวแปร tabaleName ได้แก่
ฟิลด์ CustomerID, FullName และ Address ถือเป็นชุดค�ำสัง่ SQL ที่ยังไม่สมบูรณ์เพราะว่า
ยังไม่มีการก�ำหนดค่าใดๆ ให้กับทั้ง 3 ฟิลด์
232 Basic Android Programming
\src\com.example.insertandshow\DbSQLite.java
ความรู้พื้นฐานการพัฒนา Android App
part
1
public long InsertData(int _CustomerID, String _FullName, String _Address) {
// TODO Auto-generated method stub
try {
SQLiteDatabase db = this.getWritableDatabase();
SQLiteStatement sqlCom;
String sqlAdd = "INSERT INTO " + tableName
+ "(CustomerID,FullName,Address) VALUES (?,?,?)";
2. สัง่ ให้รนั ชุดค�ำสัง่ SQL ทีเ่ ก็บอยูใ่ นตัวแปร sqlAdd ด้วยเมธอด compileStatement() ของตัวแปร
ออบเจ็กต์ db ผลการท�ำงานเก็บไว้ที่ตัวแปรออบเจ็กต์ sqlCom เนื่องจากชุดค�ำสั่ง sqlAdd เป็น
ชุดค�ำสั่ง SQL ที่ยังไม่สมบูรณ์ ต้องมีการก�ำหนดค่าให้ครบทั้ง 3 ฟิลด์เสียก่อนและให้ท�ำดังนี้
กำ � หนดค่าให้กบั ฟิลด์ CustomerID ผ่านทางเมธอด bindLong() เพราะว่าฟิลด์ CustomerID
มีชนิดข้อมูลเป็นตัวเลข int ในขณะสร้างขึ้นมา โดยอ่านค่าจากตารางมิเตอร์ _CustomerID
ก�ำหนดค่าให้กับฟิลด์ FullName ผ่านทางเมธอด bindString() เพราะว่าฟิลด์ FullName มี
try {
List<Customers> CustomersLists = new ArrayList<Customers>();
SQLiteDatabase db = this.getReadableDatabase();
String strSQL = "SELECT * FROM " + tableName;
Cursor cur = db.rawQuery(strSQL, null);
7. ที่ส่วนแสดงผลเราต้องการข้อมูลจากผู้ใช้ 3 อย่างคือ
รหัสลูกค้า ให้อ่านค่ามาเก็บไว้ที่ตัวแปรออบเจ็กต์ EditText ที่ชื่อว่า edtCustomerID
ชื่อ-สกุล ให้อ่านค่ามาเก็บไว้ที่ตัวแปรออบเจ็กต์ EditText ที่ชื่อว่า edtFullName
ที่อยู่ ให้อ่านค่ามาเก็บไว้ที่ตัวแปรออบเจ็กต์ EditText ที่ชื่อว่า edtAddress
8. ในเหตุการณ์ onClick() ของปุม่ cmd ซึง่ ท�ำหน้าทีเ่ พิม่ ข้อมูล ให้อา่ นค่ารหัสลูกค้า, ชือ่ -สกุล และที่
อยูท่ ผี่ ใู้ ช้ปอ้ นในส่วนแสดงผลเก็บไว้ในตัวแปร _CustomerID, _FullName และตัวแปร _Address
ตามล�ำดับก่อน
\src\com.example.insertandshow\MainActivity.java
cmd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
String CustomerID=edtCustomerID.getText().toString();
int _CustomerID=Integer.parseInt(CustomerID);
String _FullName=edtFullName.getText().toString();
String _Address=edtAddress.getText().toString();
สรุปท้ายบท
การท�ำงานกับระบบฐานข้อมูลที่ผู้เขียนเลือกมาน�ำเสนอในบทนี้ ผู้อ่านสามารถน�ำไปประยุกต์ต่อยอด
ได้มากมาย ขึ้นอยู่กับความต้องการของ App ว่าต้องการเก็บข้อมูลในฐานข้อมูลเพื่อจุดประสงค์ใด
<LinearLayout
android:layout_width="match_parent"
android:layout_height="35dp"
android:orientation="horizontal" >
<EditText
android:id="@+id/edtURL"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/cmdGo"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cmdGo" />
</LinearLayout>
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnKeyListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
@SuppressLint(“SetJavaScriptEnabled”)
public class MainActivity extends Activity { 3
EditText edt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 11-3
ผลการรันโปรเจ็กต์ 4.2 คลิก
MiniBrowser
4.1 กรอก URL
4.3 แสดงผล
เมธอด loadUrl()
\src\com.example.minibrowser\MainActivity.java
if ((CurrentURL.startsWith("http://")) || (CurrentURL.startsWith("https://"))) {
wv.loadUrl(CurrentURL);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
5. ท้ายที่สุดในกรณีนี้เราต้องการติดต่อกับเว็บไซต์ผ่านทางอินเทอร์เน็ตจึงต้องมีการก�ำหนดสิทธิ์
เพิม่ เติมในไฟล์ AndroidManifest.xml ให้กบั โปรเจ็กต์ เพือ่ ให้สามารถเข้าถึงอินเทอร์เน็ตได้นนั่ เอง
ดังรูปที่ 11 4
รูปที่ 11-4
แสดงการก�ำหนด
สิทธิ์เพิ่มเติม
<SurfaceView
android:id="@+id/sfMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
@Override
public void onCreate(Bundle savedInstanceState) { 2
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main); 3
getWindow().setFormat(PixelFormat.UNKNOWN);
sfv = (SurfaceView) findViewById(R.id.sfMain);
sfh = sfv.getHolder();
sfh.addCallback(this);
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 4
// TODO Auto-generated method stub
if (IsPreview) {
IsPreview = false;
cam.stopPreview();
}
if (cam != null) { 5
try {
IsPreview = true;
cam.setPreviewDisplay(sfh);
cam.startPreview();
} catch (Exception e) {
IsPreview = false;
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4. รันโปรเจ็กต์ได้ผลลัพธ์ดังนี้
รูปที่ 12-3
ผลการรันโปรเจ็กต์
MagicMirror บน
Android Emulator
แต่กล้องหน้าเท่านั้น
ตัวแปร IsPreview ท�ำหน้าที่บอกสถานะว่า ส่วนแสดงผลปัจจุบันก�ำลังแสดงผลด้วยกล้อง
SurfaceView
ตัวแปรออบเจ็กต์ SurfaceHolder ที่ชื่อว่า sfh ท�ำหน้าที่ผูกการท�ำงานเข้ากับ SurfaceView
FEATURE_NO_TITLE
แสดงผลแบบเต็มพืน ้ ทีโ่ ดยการใช้เมธอด addFlags() ของฟังก์ชนั getWindow() และก�ำหนด
ค่าเป็น FLAG_FULLSCREEN
\src\com.example.magicmirror\MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
\src\com.example.magicmirror\MainActivity.java
} catch (Exception e) {
IsPreview = false;
e.printStackTrace();
}
}
}
\src\com.example.magicmirror\MainActivity.java
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
int camNum = Camera.getNumberOfCameras();
Camera.CameraInfo camInfo = new Camera.CameraInfo();
\src\com.example.magicmirror\MainActivity.java
for (int i = 0; i < camNum; i++) {
Camera.getCameraInfo(i, camInfo);
if (camInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
try {
IsPreview = true;
cam = Camera.open(i);
} catch (Exception e) {
IsPreview = false;
e.printStackTrace();
}
}
}
}
·หยุดการใช้งานกล้องหน้าด้วยเมธอด stopPreview()
\src\com.example.magicmirror\MainActivity.java
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
IsPreview = false;
cam.stopPreview();
cam.release();
cam = null;
}
z เบอร์โทรสาธารณูปโภค
z เบอร์โทรธนาคาร
โดยมีขั้นตอนการพัฒนาดังนี้
1. สร้างโปรเจ็กต์ Android เวอร์ชัน 4.0.3 ตั้งชื่อว่า EmergencyCall
2. ออกแบบส่วนแสดงผล ดังรูปที่ 13-1
รูปที่ 13-1
ส่วนแสดงผลที่ได้
Android App Development
จากรูปที่ 13-1 แสดงสคริปต์ XML ได้ดังต่อไปนี้
สคริปต์ XML ที่ใช้ใน Workshop ที่ชื่อว่า EmergencyCall (\res\layout\activity_main.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@+id/tvMain"
android:textSize="20dp" />
</RelativeLayout>
import android.net.Uri;
import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainAdt = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, MainMenu);
subAdt2 = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, Sub2);
subAdt3 = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, Sub3);
setListAdapter(mainAdt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
4.2 แสดงผล
6. กรณีเลือกเมนูธนาคารผู้เขียนก�ำหนดไว้ 3 ธนาคาร
รูปที่ 13-4
กรณีเลือกที่เมนู
ธนาคาร
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainAdt = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, MainMenu);
subAdt2 = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, Sub2);
subAdt3 = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, Sub3);
setListAdapter(mainAdt);
}
5. แต่ถา้ ตัวแปร strMain เก็บค�ำว่า “ธนาคาร” สัง่ ให้แสดงเมนูยอ่ ยทีอ่ ยูใ่ นตัวแปรออบเจ็กต์ subAdt3
\src\com.example.emergencycall\MainActivity.java
} else {
if (strMain.trim() == "ธนาคาร") {
setListAdapter(subAdt3);
}
}
}
10.1 เลือก
10.2 คลิก
สรุปท้ายเล่ม
เนือ้ ทีน่ ำ� เสนอในหนังสือเล่มนีผ้ เู้ ขียนคิดว่าอย่างน้อยทีส่ ดุ เป็นการเตรียมความพร้อมเพือ่ เป็นรากฐานที่
ส�ำคัญก่อนเข้าสู่การพัฒนา Android App ที่มีความซับซ้อน มีขนาดใหญ่ขึ้น และมีการเรียกใช้งานฟีเจอร์ต่างๆ
ของ Android SDK เพิ่มมากขึ้นในระดับต่อไป
หากผู้อ่านท่านใดที่มีปัญหาในการเขียน Android App สามารถสอบถามปัญหาได้ที่แฟนเพจของ
ผู้เขียนที่ http://www.facebook.com/thaivb.net สวัสดีครับ...^_^
2 เลือก
รูปที่ 2
แสดงการตั้งชื่อ
Android App
ปัจจุบัน
3.1 ตั้งชื่อ
3.2 คลิก
4.3 เลือกพาธ
4.4 คลิก
5.2 คลิก
6.2 คลิก
7.2 คลิก
รูปที่ 7
แสดงการก�ำหนด
ให้ใช้ Android
เวอร์ชัน 4.0.3
รูปที่ 1
แสดงไฟล์ apk
บนอุปกรณ์
Android จริง
2.2 เลือก
2.1 เลือก
2.3 เลือก
3.1 เลือก
3.2 เลือก
Index 271
Android App Development
O SlidingDrawer............................................................94
onClick()......................................................................36 Spinner............................................................147, 150
onCreate()..............................................36, 213, 224 SQLite....................................................................... 211
onCreateOptionsMenu()...................................... 179 startActivity().......................................................... 199
onDrawerClosed()....................................................97 surfaceChanged().................................................. 249
onDrawerOpened()..................................................97 surfaceCreated().................................................... 249
onItemClick().......................................................... 226 surfaceDestroyed()......................................249, 251
OnItemClickListener().......................................... 126
T
onItemSelected()................................................... 150
TableLayout...............................................................85
OnItemSelectedListener()................................... 149
Toast............................................................................45
onListItemClick()...........................................107, 120
Toast.LENGTH_LONG............................................45
onMenuItemClick()................................................ 183
Toast Notification.....................................................78
onNothingSelected()............................................ 150
onOptionsItemSelected().................................... 186
onUpgrade()............................................................ 213
open()....................................................................... 250
P
Popup....................................................................... 180
PopupMenu............................................................ 180
R
R....................................................................................36
RelativeLayout...........................................................81
requestWindowFeature()..................................... 249
R.layout.activity_main.............................................36
S
setAdapter()............................................................ 126
setBackgroundResource().....................................51
setChecked().......................................................... 170
setChoiceMode()................................................... 137
setContentView().............................................. 36, 51
setJavaScriptEnabled()........................................ 242
setListAdapter()............................................107, 120
setOnClick..................................................................36
setOnItemSelectedListener()............................. 149
setRequestedOrientation()............................. 89, 93
setText().............................................................. 36, 41
show()..........................................................................45