Sei sulla pagina 1di 330

TABLE OF CONTENTS

Preface 1
Introduction 2

Chapter 1 :What is Android 5


Brief History of Embedded Device Programming 6
Open Handset Alliance and Android 9
Introduction to Android 10

Chapter 2 :Downloading and Installing Eclipse 13


Why Eclipse? 15
Downloading and Installing the JRE 16
Downloading and Installing Eclipse 22

Chapter 3 :Downloading and Installing the Android SDK 25


Downloading the Android SDK 27
Downloading and Installing the Android Plugin for Eclipse 28
Configuring the Android Plugin for Eclipse 33

Chapter 4 :Exploring the Android SDK 37


What is in the Android SDK 38
Android Doucmentation 39
Android Samples 41
Try This : Run the API Demos Sample Application 42
Android Tools 46

i
APIs 50
Application Life Cycle 51
Standard ASP Application Life Cycle 52
Android Application Life Cycle 53

Chapter 5 :Application : Hello World! 55


Creating Your First Android Project in Eclipse 57
Examining the Android-Created Files 62
AndroidManifest.xml 63
Referenced Libaries 64
Directories 65
Hello World! Again 72
Hello World! Using an Image 75
Hello World! Code-Based UI 79
Hello World! XML-Based UI 81
Try This: Use TextView and ImageView 85

Chapter 6 :Using the Command-Line Tools and the Android Emulator 87


Creating a Shell Activity Using the Windows CLI 88
Running the ActivityCreator.bat 89
The Project Structure 93
Creating the Hello World! Activity in the Windows CLI 99
Editing the Project Files 99
Adding the JAVA_HOME Variable 101
Compiling and Installing the Application 102
Hello World! on Linux 114
Configuring the PATH Statement 115
Try This: Create an Image-Based Hello World! in the CLI 121

ii
Chapter 7 :Using Intents and the Phone Dialer 123
What Are Intents? 125
Using the Dialer 131
Placing a Call from Your Activity 136
Adding the Intent to Your Activity 136
Editing Activity Permissions 139
Modifying the AndroidPhoneDialer 145
Adding a Button 145
Implementing an EditText View 151
Try This: Modify the AndroidPhoneDialer Project 155

Chapter 8 :Lists, Menus, and Other Views 159


Building the Activities 161
Intent Code for the .xml File 162
Intent Code for the .java File 164
Modifying the AndroidManifest.xml 165
Using the Menu 168
Creating the Activity for AutoComplete 175
Button 185
CheckBox 190
EditText 195
RadioGroup 200
Spinner 206
Try This: Modify More View Attributes 212

Chapter 9 :Using the Cell Phone's GPS Functionality 213


Using the Android Location-Based API 214
Creating a kml File 215
What Is a track File? 218
Getting the nmea File in Windows 218

iii
Getting the nmea File in Linux 220
Reading the GPS with the Android Location-Based API 223
Creating the AndroidLBS Activity 223
Passing Coordinates to Google Maps 233
Adding Zoom Controls 237
Try This : Toggling Between MapView's Standard
and Satellite Views 244

Chapter 10 :Using the Google API with GTalk 249


Configuring the Android Emulator for GTalk 251
Implementing GTalk in Android 254
Creating the Activity's Layout in the GoogleAPI.xml 255
Adding Packages to GoogleAPI.java 257
Implementing the View.OnClickListener 258
Compiling and Running GoogleAPI 263
Try This : Add a Settings Feature to Your GoogleAPI Activity 266

Chapter 11 :Application : Find a Friend 267


Creating a SQLite Database 270
Creating a Custom Content Provider 274
Editing the strings.xml 274
Creating Your Content Provider 277
Creating the FindAFriend Activity 287
Editing AndroidManifest.xml 287
Creating the NameEditor Activity 289
Creating the LocationEditor Activity 294
Creating the FrinedsMap Activity 303
Creating the FindAFriend Activity 309
Running the FindAFriend Activity 312
Try This: Real-Time Location Updating 315

iv
Chapter 12 :Android SDK Tool Reference 317
Android Emulator Commands 318
Android Debug Bridge Commands 321

v
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Preface
နိဒါနး့

မ္ကးပျငးံစာေပ 1
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Introduction
Android: Programmer Guide မြ ႀကိဳဆိုပါသညး၈ ယခုစာအုပးသညး Mobile Developer တစးဦ့ကို
အလြ္ငးအ်မနးႏြငးံအခ္ိနးတိုတုိအတျငး့တျငး ေနရာစဵုမြ စဥး့စာ့ေတျ့ေခၚတတးေစရနး လိုအပးေသာ ပထမ
အဆငးံကိုလမး့ညႊနးေပ့ထာ့ပါသညး၈ Android ဆိုသညးမြာ ေနာကးဆဵု့ေပၚ Mobile device မ္ာ့တျငး
အသဵု့်ပဳေသာ Operating System တစးခု်ဖစးၿပီ့ ထိုသို႕ေသာ OS ကိုအေ်ခခဵ၍ Application မ္ာ့တညး
ေဆာကးရနးအတျကးယခုစာအုပးမြ အေကာငး့ဆဵု့အေထာကးအပဵံ်ဖစးေစမညး်ဖစးပါသညး၈

ယခုစာအုပးတျငးသငးၾကာ့ရမညး႕သငးခနး့စာမ္ာ့ထဲတျငး Mobile Device application development ကို


Open Handset Alliance ၏ Android Platform ကိုအသဵု့်ပဳ၍ အေ်ခခဵမြ စတငးေလံလာရပါမညး၈ ယခု
စာအုပး၏အဆဵု့ထိကိုေလံလာၿပီ့စီ့ေသာအခါတျငး ကိုယးပိုငး mobile device program မ္ာ့ကို အခကးအခဲ
မရိြတညးေဆာကးရနး ယဵုၾကညးမႈရရိြေစမညး်ဖစးပါသညး၈

ယခုစာအုပး၏ အစီအစဥးအရ Android application development ကို လကးေတျ႕ေလံလာရမညး်ဖစးၿပီ့


ေရြ့ဦ့စျာ Android Platform ၏ architecture ကိုေလံလာ်ခငး့၇ မညးကဲံသို႕ Develop ်ပဳလုပးႏိုငးသညး ဆို
ေသာအခ္ကးကိုေလံလာ်ခငး့၇ မညးကဲံသို႕ေမာငး့နြငးရမညးဆုိသညး႕အခ္ကးကိုေလံလာ်ခငး့ ႏြငးံ Develop ်ပဳ
လုပးရနးအတျကး လိုအပးသညး႕ Tool မ္ာ့ကိုေလံလာ်ခငး့စသညး႕အခ္ကးမ္ာ့ကို ဦ့စျာေလံလာရမညး်ဖစးပါ
သညး၈ Development Tool မ္ာ့်ဖစးသညး႕ Android SDK ႏြငးံ Eclipse development environment မ္ာ့
ကို ေလံလာေဆျ့ေႏျ့၍ Install ်ပဳလုပးၿပီ့သညး႕ေနာကးပိုငး့တျငး Android Application မ္ာ့ကို တိုကးရိုကး
ပငးဒီဇိုငး့်ပဳလုပးေရ့သာ့ရမညး်ဖစးပါသညး၈

ယခုစာအုပး၏အဆဵု့သတးပိုငး့တျငး Google Maps ႏြငးံ GTalk ကဲံသို႕ေသာ Google Tool မ္ာ့ကိုအသဵု့်ပဳ


၍ Application မ္ာ့ကိုတညးေဆာကး်ခငး့ကိုေဖား်ပေပ့ထာ့ပါသညး၈ ထို႕အ်ပငး Android Tool မ္ာ့
အတျကး Reference Guide ကိုေနာကးဆဵု့အခနး့တျငးေဖား်ပေပ့ထာ့ပါသညး၈ ယခုစာအုပးသည
Programmer Guide သာ်ဖစးၿပီ့ Beginner Guide မဟုတးပါ၈ ထို႕ေၾကာငးံ ယခုစာအုပးကုိေလံလာရန
ကျနးပ္ဴတာအေ်ခခဵႏြငးံ Programming သေဘာတရာ့မ္ာ့ကိုပိုငးႏိုငးကၽျမး့က္ငးေနေစရမညး်ဖစးပါသညး၈
အထူ့သ်ဖငးံ Android ကို Java Language ်ဖငးံေရ့သာ့ရသညး႕အတျကး Java Programming ကဲံသို႕
ေသာ OOP (Object Orient Programming) တစးခုခုကို အေ်ခခဵဗဟုသုဓရိြသငးံပါသညး၈

2 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android Application မ္ာ့ကို Java တျငး Develop ်ပဳလုပးၿပီ့ Linux 2.6 kernel တျငးေမာငး့ႏြငးပါသညး၈
အခနး့ (ဿ) တျငး Eclipse IDE (Integrated development environment) ကို မညးကဲံသို႕ Download
်ပဳလုပးသညးဟူေသာအခ္ကးႏြငးံ Install ်ပဳလုပးရမညး႕ အဆငးံမ္ာ့ကိုေဖား်ပေပ့ထာ့ပါသညး၈ Android
Application မ္ာ့နမူနာတညးေဆာကးရာတျငးလအ
ို ပးေသာ Code မ္ာ့ႏြငးံ ပဵုမ္ာ့ကို ်ပညး႕စဵုစျာ်ဖငးံေဖား်ပ
ထာ့ပါသညး၈ ယခုစာအုပးပါ နမူနာ Application မ္ာ့တညးေဆာကးရာတျငး Eclipse ႏြငးံ Eclipse အတျကး
ဦ့တညး်ပဳလုပးထာ့ေသာ Android Plugin ကိုအသဵု့်ပဳပါသညး၈ လိုအပးေသာ ပစၥညး့ပစၥယ Tool မ္ာ့အာ့
လဵု့ကို ယခုစာအုပးႏြငးံပူ့တျဲပါ DVD ေချထဲတျငးထညး႕သျငး့ေပ့ထာ့ၿပီ့်ဖစးပါသညး၈

အခ္ဳပးအာ့်ဖငးံဆိုရလြ္ငး မြတးခ္ကး်ပဳလိုသညး်ဖစေစ၇ ေမ့ချနး့မ္ာ့ေမ့်မနး့လို၍်ဖစးေစ၇ အႀကဵ်ပဳခ္ကးမ္ာ့ ်ပဳ


လို၍်ဖစးေစ စာေရ့သူႏြငးံဆကးသျယးလိုပါက telecomtech88@gmail.com ဟူေသာ email သို႕်ဖစးေစ၇
စာေရ့သူ၏ Facebook စာမ္ကးႏြာ်ဖစးေသာ https://www.facebook.com/Telecomtechnicaltraining
သို႕်ဖစးေစ ဆကးသျယးေမ့်မနး့ ေွဖနးအၾကဵ်ပဳႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 3
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

4 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 1
What Is Android?

မ္ကးပျငးံစာေပ 5
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- History of embedded device programming
- Explanation of Open Handset Alliance
- First look at the Android home screen

အရြငး့ဆဵု့ဆိုရလြ္ငး သာမနး Programmer တစးေယာကးေရ့သာ့ေသာ Desktop Application


Development သညးအ်ခာ့ေသာ Application Development မ္ာ့ႏြငးံႏိႈငး့ယြဥးလြ္ငးအလျယးကူဆဵု့်ဖစးပါ
သညး၈ သို႕ရာတျငး အဆိုပါ Desktop Application Development သညးယခုအသဵု့်ပဳေနေသာ Computer
Application မ္ာ့ပငး်ဖစးသညး႕အတျကး အထငးမေသ့သငးံပါ၈ ထို႕အ်ပငး အ်ခာ့ေသာ Application
Development မ္ာ့ကို်ပဳလုပရ
း နးအတျကး Desktop Application Development ကိုသာနာ့လညးပါက
တတးေ်မာကးမႈပိုမိုအာ့ေကာငး့လြ္ငး်မနးေစမညး်ဖစးပါသညး၈

Brief History of Embedded Device Programming


ၾကာ်မငးံေသာအခ္ိနးကာလတစးခုကတညး့ကပငး Cell Phone Developer မ္ာ့ကို Embedded Device
Developer မ္ာ့အ်ဖစး လူနညး့စုအသျငး်ဖငးရ
ံ ိြခဲံၾကၿပီ့်ဖစးသညး၈ Desktop Developer မ္ာ့၇ Web
Developer မ္ာ့်ဖငးံႏိႈးငး့ယြဥးလြ္ငး Embedded Device Developer မ္ာ့သညးအေရအတျကး နညး့ပါ့သညး႕
အ်ပငး အဆိုပါ Developer မ္ာ့ႏြငးံေရာေထျ့ေနေသာေၾကာငးံ Embedded Device Developer မ္ာ့အ်ဖစး
သီ့သနး႕သတးမြတႏ
း ိုငးခဲံ်ခငး့မရိြပါ၈ Embedded Device Developer မ္ာ့သညးသီ့သနး႕ဆနးေသာ Device
၏ Hardware ေပၚတျငးမူတညး၍ေရ့သာ့လုပးေဆာငးရ်ခငး့ေၾကာငးံ အခကးအခဲတစးခုသဖျယး်ဖစးလာေစခဲံပါ
သညး၈ ထို႕အ်ပငး ထုတးလုပးသူမ္ာ့ဘကးမြလညး့ ၁ငး့တို႕၏ Hardware ပစၥညး့မ္ာ့ကို ်ပငးပသို႕မေပါကး
ၾကာ့ေအာငး ထိနး့သိမး့ခဲံၾကပါသညး၈ ထို႕ေၾကာငးံလညး့ Development ်ပဳလုပးရာတျငး အသဵု့်ပဳရသညး႕
Library မ္ာ့နညး့ပါ့ခဲံပါသညး၈

Embedded Device မ္ာ့ႏြငးံ Desktop မ္ာ့၏ကျဲ်ပာ့်ခာ့နာ့မႈမြာ Embedded Device မ္ာ့သညး ပဵုမြနး


အာ့်ဖငးံ Chip တစးခုေပၚမြ Computer သဖျယးသာ်ဖစးပါသညး၈ ဥပမာအာ့်ဖငးံ ယခငးမ်မငးဖူ့ခဲံၾကသညး႕
နညး့ပညာတီထျငးဆနး့သစးေအာငး်မငးမႈတစးခု်ဖစးေသာ TV Remote Control တစးခုကို နမူနာအ်ဖစး မြတး
ယူႏိုငးပါသညး၈ ထို Remote ေပၚမြ ခလုတးတစးခုကိုႏိြပးလိုကးေသာအခါ Chip သညး Device သို႕အလုပး

6 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

လုပးေဆာငးႏိုငးရနး program ေရ့သာ့ထာ့ေသာ Signal တစးခုထတ


ု းလႊတးေပ့ေစမညး်ဖစးသညး၈ ထိုသို႕
လုပးေဆာငးခ္ကးသညး Input Device (Key pad) မြထုတးလႊတးလိုကးေသာ Signal ကို Device (TV) မြ
သိရိြေစၿပီ့ လုပးေဆာငးမညး႕ ခိုငး့ေစခ္ကးမ္ာ့ကို တုဵ႕်ပနးေဆာငးရျကးေပ့မညး်ဖစးသညး၈ (ဥပမာ- TV ကို
ဖျငးံ်ခငး့) အထကးပါေဖား်ပခ္ကးသညး Embedded Device Programming အတျကးရို့ရြငး့ေသာ ဥပမာ
တစးရပးပငး်ဖစးပါသညး၈ သို႕ရာတျငး ယဵုခ္ငးယဵု၇ မယဵုခ္ငးေန ရို့ရြငး့ေသာ ထိုကဲံသို႕ေသာလုပးေဆာငးခ္ကးမ္ာ့
်ဖငးံ ေရြ့ဦ့ Cell Phone Device မ္ာ့ကို Develop ်ပဳလုပးခဲံၾကပါသညး၈

Embedded Device အမ္ာ့စုသညး ကိုယးပိုငး Operating System ကိုအသဵု့်ပဳၾကပါသညး၈ ထိုသို႕ ဘဵု


Operating System (ဥပမာ Linux) ကဲံသို႕ေသာ OS မ္ာ့ကိုမသဵု့ပဲ ကိုယးပိုငး OS ကိုသာသဵု့စျဲရ်ခငး့မြာ
ထုတးကုနး Device မ္ာ့၏လိုအပးခ္ကးမ္ာ့ေၾကာငးံ်ဖစးပါသညး၈ ရို့ရြငး့ Device အမ္ာ့စုသညး ေကာငး့မျနး
ေသာ၇ ႀကဵ႕ခိုငးေသာ Operating System မ္ာ့ကိုအသဵု့်ပဳရနးမလိုအပး်ခငး့သညးလညး့ ကိုယးပိုငး OS ကို
အသဵု့်ပဳရ်ခငး့၏ အခ္ကးတစးခ္ကး်ဖစးေစပါသညး၈

ီထုတးကုနး Device မ္ာ့၏အဆငးံဆငးံတို့တကးမႈတျငး ပိုမိုရႈပးေထျ့ေသာ embedded Device မ္ာ့်ဖစးၾက


သညး႕ အေစာပိုငး့ PDA ပစၥညး့မ္ာ့၇ အိမးတျငး့လဵုၿခဵဳေရ့စနစးမ္ာ့ႏြငးံ GPS ပစၥညး့မ္ာ့သညး စဵ်ပဳဖျယးရာ်ဖစး
ေသာ Operting System Platform မ္ာ့ကို လျနးခဲံေသာငါ့ႏြစးခနး႕ကပငး ရြာေဖျလာခဲံၾကပါသညး၈
ထို႕ေၾကာငးံပငး Linux OS ကိုအေ်ခ်ပဳထာ့ေသာ Device မ္ာ့၇ Microsoft ၏ Windows OS ကိုအေ်ခ်ပဳ
ထာ့ေသာ Device မ္ာ့သညးအ်ခာ့ ကိုယးပိုငး OS သဵု့ Device မ္ာ့ထကးပိုမိုသာလျနးလာခဲံပါသညး၈
ထိုအခ္ိနးက Device မ္ာ့၏အဆငးံဆငးံတို့တကးလာမႈတျငး Cell Phone မ္ာ့့သညး ကိယ
ု းပိုငး
Development မ္ာ့်ဖငးံ ေရြ႕ဆကးေနခဲံၾကပါသညး၈ ထိုအေၾကာငး့ကို ၁ငး့ Cell Phone မ္ာ့၏
Architecture ကိုလိုကးလဵေလံလာ်ခငး့်ဖငးံ သိရိြေစႏိုငးပါသညး၈

ထို Cell Phone မ္ာ့တျငး ကိုယးပိုငး Software မ္ာ့သာပါွငးၿပီ့အသစးထပးတို့်ခငး့၇ ထုတးပယး်ခငး့မ္ာ့က


မ်ပဳလုပးႏင
ို းပါ၈ ထို Software မ္ာ့ကိုလညး့ ဖုနး့ထုတးလုပးသူမ္ာ့မြသာပိုငးဆိုငးထိနး့ခ္ဳပးထာ့်ခငး့ေၾကာင
အဆိုပါ Software မ္ာ့ကို Close System ဟုသတးမြတးႏိုငးမညး်ဖစးသညး၈ ထိုကဲံသို႕ထိနး့ခ္ဳပးထာ့မႈသည
လညး့ ထုတးလုပးသူမ္ာ့ဘကးမြၾကညး႕လြ္ငး ဆီေလြ္ားမႈရိြပါသညး၈ ထုတးလုပးေသာ Cell Phone မ္ာ့၏
Hardware ပိုငး့ႏြငးံကိုကးညီမႈရိြေအာငး ထုတးလုပးရေသာေၾကာငးံ မေတားမတညး႕မႈမ္ာ့လညး့ ရိြခဲံပါသညး၈
ထုတးလုပးေသာ Hardware မ္ာ့ကိုလညး့ နညး့စနစးမ္ာ့လြ္ိဳ႕ွြကးထာ့ရ်ခငး့ေၾကာငးံလညး့ Open Source

မ္ကးပျငးံစာေပ 7
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

်ဖစးေအာငး ်ပဳလုပးႏိုငးခဲံခ်ခငး့မရိြခဲံပါ၈ ထိုသို႕ေသာအ်ခငး့အရာမ္ာ့ေၾကာငးံ အဆိုပါ Cell Phone


မ္ာ့အတျကး Application Development မ္ာ့ကို်ပဳလုပးႏိုငး်ခငး့မရိြခဲံပါ၈ Development ်ပဳလုပးရနးအတျက
ကိုလညး့ ထုတးလုပးသူမ္ာ့ထဵမြ Tool မ္ာ့ကို ေစ့္ႀကီ့ေပ့ွယးခဲံၾကရပါသညး၈ ထို႕ေၾကာငးံ အဆိုပါ
Development ်ပဳလုပးသူမ္ာ့ကို homebrew developer မ္ာ့ဟုေခၚဆိုၾကပါသညး၈ homebrew
developer ဆိုသညးမြာ Cell Phone Developer Company မ္ာ့အတျကး အလုပးလုပးေပ့်ခငး့မဟုတးဘ
ကိုယးပိုငးအာ့လပးခ္ိနးတျငး Application အေသ့မ္ာ့ေရ့သာ့သူမ္ာ့ကိုဆိုလိုပါသညး၈

အ်ခာ့ေသာ Development ်ပဳလုပးမႈမေအာငး်မငးရေသာအ်ခာ့အခ္ကးတစးခုမြာ Cell Phone ၏ Memory


နညး့ပါ့မႈ်ပသနာတစးခုပငး်ဖစးပါသညး၈ ထိုအခ္ိနးက Cell Phone မ္ာ့သညး ဖုနး့အွငး၇အထျကးေခၚဆို်ခငး့
မ္ာ့၇ Contact မ္ာ့သိမး့ဆညး့်ခငး့၇ SMS မ္ာ့လကးခဵ်ခငး့ထကးအနညး့ငယးမြ္ သာလျနးရဵုမြ္သာရိြခဲံပါသညး၈
ဿွွဿ ခုႏြစးေနာကးပိုငး့တျငးပငး ကငးမရာပါွငးေသာ Cell Phone မ္ာ့ကို မ္ာ့စျာမေတျ႕ရေသ့ပါ၈ ှ၆၆၄
ခုႏြစးက Calculator ႏြငးံ Game အခ္ိဳ႕ကို ထုတးလုပးသူမ္ာ့မြ ေပါငး့ထညး႕ေပ့ေသားလညး့ မ္ာ့စျာအသဵု့
မွငးခဲံပါ၈ ထိုေခတးက Cell Phone မ္ာ့သညး multiuse ႏြငးံ multifunction မ္ာ့မပါရိြဘဲ ယေန႕ေခတး ဖုနး့
အမ္ာ့စုတျငး အသဵု့်ပဳေနသညး႕ internet ၾကညး႕်ခငး့၇ MP3 သီခ္ငး့မ္ာ့နာ့ေထာငး်ခငး့ကဲံသို႕ေသာ
လုပးေဆာငးခ္ကးမ္ာ့ကိုအသဵု့်ပဳႏိုငးခဲံ်ခငး့မရိြပါ၈ ထို႕ေၾကာငးံ ထိုအခ္ိနးက ဖုနး့ထုတးလုပးသူမ္ာ့သည
သဵု့စျဲသူမ္ာ့၏ လိုအပးခ္ကးကိုၿဖညး႕ဆညး့ေပ့ႏိုငး်ခငး့မရိြခဲံပါ၈ လိုအပးခ္ကးမ္ာ့ထဲတျငးမြ အေရ့အႀကီ့ဆဵု့
်ဖစးသညး႕ Device Memory နညး့ပါ့်ခငး့ႏြငးံ သိမး့ဆညး့ႏိုငးမႈပမာဏ နညး့ပါ့်ခငး့တို႕သညး အႀကီ့ဆဵု့
စိနးေခၚမႈမ္ာ့်ဖစးၾကပါသညး၈ သဵု့စျဲသူမ္ာ့သညး မိမိအသဵု့်ပဳသညး႕ Cell Phone မ္ာ့ကို All-In-One Tool
မ္ာ့အ်ဖစးသို႕ေရာကးရိြေစလိုေသားလညး့ ထုတးလုပးသူမ္ာ့ဘကးတျငးမူ Memory အတာ့အဆီ့ကိုပင
မေက္ားလႊာ့ႏိုငးခဲံပါ၈

်ပသနာကိုရို့ရြငး့စျာသဵု့သပးရလြ္ငး Cell Phone မ္ာ့အပါအွငး မညးသညး႕ Device တျငးမဆို Application


မ္ာ့ကို သိမး့ဆညး့ေမာငး့ႏြငးရနးအတျကး Memory ကိုအသဵု့်ပဳရပါသညး၈ Cell Phone မ္ာ့သညး
အ်ခာ့ေသာအသဵု့တညး႕အပို Program မ္ာ့ကို ေမာငး့ႏြငးရနး Memory လဵုေလာကးမႈမရိြ်ခငး့သညး်ပသနာ
တစးရပးပငး်ဖစးပါသညး၈ လျနးခဲံေသာႏြစး ႏြစးေက္ားအခ္ိနးကာလတစးခုအတျငး့မြာပငး Memory မ္ာ့ထုတးလုပး
ေရာငး့ခ္သညး႕ေစ့္ႏႈနး့သညး မြနး့ဆ၍ မရေအာငးပငး က္ဆငး့လာခဲံပါသညး၈ ထို႕ေၾကာငးံ Device
ထုတးလုပးသူမ္ာ့ဘကးမြလညး့ ပိုမိုေသာ မြတးဥာဏးပမာဏပါွငးေသာ Device မ္ာ့ကိုေစ့္ႏႈနး့ခ္ိဳသာစျာ

8 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

်ဖငးံ ေရာငး့ခ္လာေစႏိုငးပါသညး၈ ယေန႕ေခတး Cell Phone တစးလဵု့၏ မြတးဥာဏးပမာဏသညး Computer


တစးလဵု့၏ မြတးဥာဏးအသဵု့်ပဳမႈအထိပငး ်မငးံမာ့လာခဲံပါသညး၈ သို႕ရာတျငး မြတးဥာဏးပမာဏ်မငးံတကးလာ
်ခငး့ေၾကာငးံ Application Development တို့တကးလာရ်ခငး့မဟုတးပါ၈ Java အေ်ခ်ပဳ Application
အနညး့အက္ဥး့ကိုသာလြ္ငး Cell Phone အတျငး့ထညး႕သျငး့အသဵု့်ပဳႏိုငးၿပီ့ System ၏ Core ကို
ပိတးထာ့ ်ခငး့ေၾကာငးံ အဓိက အသဵု့တညး႕ Application မ္ာ့ကို ထညး႕သျငး့အသဵု့်ပဳႏိုငးခဲံ်ခငး့မရိြဘ
Android ထျကးေပၚလာသညး႕အခ္ိနးတျငးမြ Application Development သညး တစးဆစးခ္ိဳ့ေ်ပာငး့လ
တို့တကးလာေစခဲံပါသညး၈

Open Handset Alliance and Android


ထိုကဲံသို႕ေသာ ကျဲ်ပာ့ေသာ Device မ္ာ့အတျကး Application Development ကနး႕သတးခ္ကးမ္ာ့က
ပယးရြာ့ရနးအတျကး ဿွွ၄ခုႏြစး ႏိွ
ု ငးဘာလတျငး Google သညး Open Handset Alliance ၏အမညး်ဖငးံ
Android ကိုထုတးေွခဲံပါသညး၈ Open Handset Alliance ဆိုသညးမြာ Hardware ႏြငးံ Software
Devloper မ္ာ့စုေပါငး့ထာ့ေသာ အဖျဲ႕အစညး့တစးခု်ဖစးၿပီ့ ထိုအဖျဲ႕အစညး့တျငး နာမညးႀကီ့ Google ႏြငးံ
တကျ NTT DoCoMo အပါအွငး Sprint Nextel ႏြငH
းံ TC တို႕ပါွငးခဲံၾကပါသညး၈ ထိုအဖျဲ႕အစညး့၏
ရညးရျယးခ္ကးမြာ ပိုမိုေကာငး့မျနးေသာပျငးံလငး့သညး႕ Cell Phone Environment တစးခုကိုတညးေဆာက
ရနး်ဖစးပါသညး၈ ထိုအဖျဲ႕အစညး့မြ ပထမဆဵု့ထျကးရိြလာေသာ ထုတးကုနးမြာ ေနာငးတျငးနာမညးၾကီ့လာ
သညး႕ Mobile Device သဵု့ Opeatring System တစးခု်ဖစးသညး႕ Android ပငး်ဖစးပါသညး၈ (Open
Handset Alliance အဖျဲ႕အစညး့အေၾကာငး့ကို ပိုမိုသိရိြလိုပါက www.openhandsetalliance.com တျငး
ွငးေရာကးေလံလာႏိုငးပါသညး၈)

Android ကိုထုတးေွၿပီ့ေနာကးမြာပငး Google သညး ထုတးေွလိုကးေသာ System ႏြငးံအသာ့က္ေစရနး


Development Tool မ္ာ့ႏြငးံ Tutorial မ္ာ့ကို်ဖနး႕ခ္ီခဲံပါသညး၈ Help ဖိုငးမ္ာ့၇ Software Development
Kit (SDK) မ္ာ့သာမက Developers မ္ာ့၏ Community ်ပဳလုပးမႈမ္ာ့ကိုပငး Google ၏ Android
Website ်ဖစးေသာ http://code.google.com/android တျငးေတျ႕်မငးႏိုငးပါသညး၈ ထို Website သညး
Android ၏ အစ်ပဳရာ Website တစးခု်ဖစးေသာေၾကာငးံ ွငးေရာကးၾကညး႕ရြဳသငးံလြပါသညး၈

မ္ကးပျငးံစာေပ 9
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Linux, Windows ႏြငးံ PalmOS ကဲံသို႕ OS မ္ာ့ကိုအသဵု့်ပဳေသာ Cell Phone မ္ာ့ မ္ာ့်ပာ့စျာေတျ႕ရိြရ
ခ္ိနးတျငး Android ်ဖငးံေမာငး့ႏြငးႏိုငးေသာ မညးသညး႕ Hardware ပစၥညး့မ္ာ့ကိုမြ ထုတးလုပးေၾက်ငာခဲံ်ခငး့
မရိြခဲံပါ၈ သို႕ရာတျငး LG Electronics, Motorola ႏြငးံ Samsung ကဲံသို႕ေသာ ကုမၸဏီႀကီ့မ္ာ့ Open
Handset Alliance အဖျဲ႕၏ အဖျဲ႕ွငးမ္ာ့်ဖစးလာခ္ိနးတျငး Android Development သညးလညး့ တရိြနးထို့
တို့တကးသျာ့ခဲံေသားလညး့ ဿွွ၄ခုႏြစး ႏိွ
ု ငးဘာလတျငးမူ Android သညး Software Beta အဆငးံသာ
ရိြခဲံပါသညး၈ ယေန႕တျငး Android သဵု့ Handset မ္ာ့ကိုေတျ႕်မငးေနရၿပီ်ဖစးကာ မ္ာ့စျာေသာ ကုမၸဏီမ္ာ့
မြလညး့ Android ကိုအသဵု့်ပဳရနး Hardware ပစၥညး့မ္ာ့လညး့ ထုတးလုပးေနၾကၿပီ်ဖစးပါသညး၈

Introduction to Android
Android ဆိုသညးမြာ Java အေ်ခ်ပဳ Operting System တစးခု်ဖစးၿပီ့ linux 2.6 kernel ေပၚတျငးေမာငး့
ႏြငးပါသညး၈ အဆိုပါ System သညးအလျနးေပါံပါ့ၿပီ့ Feature မ္ာ့်ဖငးံလညး့ ်ပညး႕စဵုပါသညး၈ ေအာကးတျငး
ေဖား်ပထာ့ေသာပဵုတျငး မ်ပငးဆငးထာ့ေသာ Android Home Screen ကိုေတျ႕်မငးၾကရမညး်ဖစးပါသညး၈

10 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android Application မ္ာ့ကို Java ကိုအသဵု့်ပဳ၍ Develop ်ပဳလုပးရ်ခငး့ေၾကာငးံ Android ဟူေသာ


Platform အသစးအတျကး လျယးကူလာေစပါသညး၈ Android တျငးပါွငးေသာ အ်ခာ့ေသာ Feature
မ္ာ့မြာ Acclerated 3-Dgraphics engine၇ SQLite ကိုအသဵု့်ပဳေသာDatabase ႏြငးံ Integrated Web
Browser တို႕်ဖစးပါသညး၈ အကယး၍ Java Programming သို႕မဟုတး OOP ဘာသာစကာ့တစးခုခုက
သာကၽျမး့က္ငးပိုငးႏိုငးမႈရိြခဲံပါက Programmatic User Interface (UI) Development ကိုေကာငး့စျာ
အသဵု့်ပဳတတးမညး်ဖစးပါသညး၈ UI placement သညး Program Codeမြတိုကးရိုကးအသဵု့်ပဳ်ခငး့်ဖစးေသာ
ေၾကာငးံ Android သညးလညး့ Programmatic UI development ဟုပငးဆိုႏိုငးမညး်ဖစးသညး၈ ထို႕အ်ပငး
နညး့ပညာအသစးအ်ဖစး UI Layout တျငးအေ်ခခဵေသာ XML ကိုပါေထာကးပဵံၿပီ့အသဵု့်ပဳႏိုငးပါသညး၈ XML
UI Layout ဆိုသညးမြာ Desktop Developer တစးေယာကးအတျကးအသစးအဆနး့ေသာ နညး့ပညာဟု
ယူဆႏိုငးမညး်ဖစးပါသညး၈ ေနာကးလာမညး႕အခနး့မ္ာ့တျငး XML UI Layout သာမက Programmatic UI
Development ကိုပါရြငး့လငး့ေဖား်ပေပ့သျာ့မညး်ဖစးပါသညး၈

အာ့လဵု့ထကးပိုမို၍ Android ၏အထူ့ကဲဆဵု့ေသာအခ္ကးတစးခုမြာ ၁ငး့၏ဖျဲ႕စညး့တညးေဆာကးပ


architecture ေၾကာငးံ တစးခါတညး့ပါွငးလာေသာ application မ္ာ့အပါအွငး third party application
မ္ာ့ကို Execute ်ပဳလုပးေမာငး့ႏြငးေသာအခါတျငး ၁ငး့၏ Core System ႏြငးံအတူတူပငး system priority
မ္ာ့အ်ဖစးေမာငး့ႏြငးပါသညး၈ ထိုအခ္ကးသညးအ်ခာ့ေသာ system မ္ာ့ႏြငးံကျာဟသျာ့ၿပီ့ embedded
system apps မ္ာ့ကို ေကာငး့မျနးေသာ priority ်ဖငးံေမာငး့ႏြငးႏိုငးသကဲံသို႕ third-party app မ္ာ့ေရ့
သာ့ေသာ Developer မ္ာ့ကိုလညး့ အဆငးေ်ပေခ္ာေမျ႕ေစပါသညး၈ ထို႕အ်ပငး application တစးခုစီကို
ကိုယးပိုငး thread တစးခုအေန်ဖငးံ အလျနးေပါံပါ့ေသာ virtual machine ကိုအသဵု့်ပဳ၍ ေမာငး့ႏြငးႏိုငးေစ
ပါသညး၈

သဵု့စျဲေနက္်ဖစးခဲံေသာ Desktop အေ်ခ်ပဳ SDK မြေသျဖယး၍ Android Developer မ္ာ့အတျကးအေကာငး့


ဆဵု့ေသာအခ္ကးတစးခုမြာ Android သညး Operting System ၏ Kernal အထိ အတာ့အဆီ့မရိြ ွငး
ေရာကးချငးံ်ပဳ်ခငး့ပငး်ဖစးသညး၈ တစးနညး့ဆိုရလြ္ငး Phone ဆကးမညး႕ Application တစးခုေရ့သာ့သည
ဆိုေသာအခါ Phone ၏ Dialer အတျငး့သို႕ွငးေရာကးရေပမညး၈ ထို႕အတူ Internal GPS ႏြငးံသကးဆိုငး
ေသာ Application တစးခုကိုေရ့သာ့လိုေသာအခါ ဖုနး့၏ GPS လုပးေဆာငးခ္ကးအတျငး့သို႕ွငးေရာကး
ရေပမညး၈ ထိုကဲံသို႕ ွငးေရာကးအသဵု့်ပဳချငးံကို Android မြကနး႕သတးခ္ကးမထာ့ဘဲ ချငးံ်ပဳေပ့ပါသညး၈
Windows OS တျငးမူ Kernal ကိုကနး႕သတးထာ့်ခငး့ေၾကာငးံ အဆိုပါ Application မ္ာ့ကိုေရ့သာ့ေသာ
မ္ကးပျငးံစာေပ 11
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အခါ အလျနးခကးခဲေလံရိြပါသညး၈ ထို႕ေၾကာငးံပငး Developer မ္ာ့အတျကး dynamic ႏြငးံ ေနာကးကယ


ျ းမြ
လုပးေဆာငးခ္ကးမ္ာ့အတျကး လုပးေဆာငးရသညး႕ application မ္ာ့ကိုတညးေဆာကးရာတျငး ႀကီ့စျာ ပဵံပို့
ေပ့ပါသညး၈

အထကးတျငးေဖား်ပထာ့ေသာ Andorid ၏ feature မ္ာ့အ်ပငး Google မြ Google Maps ႏြငးံ Google


Search ကဲံသို႕ေသာအသဵု့ွငးဖျယးရာ feature မ္ာ့ကိုေပါငး့ထညး႕ေပ့ခဲံပါသညး၈ ထို႕ေၾကာငးံ ဖုနး့ွငးလာ
ေသာအခါတျငး ေခၚဆိုေသာဖုနး့၏ တညးေနရာကို်ပသႏိုငးေသာ application တစးခုေရ့သာ့ေသာအခါမ္ိဳ့
ႏြငးံ Contacts မ္ာ့ႏြငးံသကးဆုိငးေသာအခ္ကးအလကးမ္ာ့ကို Google Search တျငးရြာေဖျရနး စေသာ
application တစးခုခုကို ေရ့သာ့လိုေသာအခါမ္ိဳ့တျငး အလျနးအသဵု့ွငးေစၿပီ့ Google မြလညး့ ထိုသို႕
Developer Friendly ်ဖစးေစရနး လမး့ဖျငးံေပ့ထာ့ပါသညး၈

အခနး့ ဿ တျငး Android Development အေၾကာငး့ကိုစတငးေလံလာၾကညး႕ၾကရမညး်ဖစးပါသညး၈ ထို


အခနး့တျငး သတးမြတးထာ့ေသာ development environment မ္ာ့ သို႕မဟုတး integrated develop-
ment environments (IDE) မ္ာ့ကို မညးကဲံသို႕ႏြငးံ မညးသညး႕ရညးရျယးခ္ကးမ္ာ့်ဖငးံ အသဵု့်ပဳရသညး
ကိုလညး့ ေလံလာရမညး်ဖစးပါသညး၈ ထို႕အ်ပငး Java IDE Eclipse ကို Download ်ပဳလုပးၿပီ့ Install
်ပဳလုပးပဵုမ္ာ့ကိုလညး့ေတျ႕်မငးၾကရမညး်ဖစးပါသညး၈

12 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 2
Downloadng and Installing Eclipse

မ္ကးပျငးံစာေပ 13
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skils & Concepts


- Selecting a development environment
- Downloading Eclipse
- Installing and Configuring Eclipse

Android Application မ္ာ့ကို Java ်ဖငးံေရ့သာ့ၾကပါသညး၈ Android ကိုယးတိုငးက Langauge တစးခု


မဟုတးေသားလညး့ ထို Environment တျငး Application မ္ာ့ကိုေမာငး့ႏြငးႏိုငးေစပါသညး၈ ထို႕ေၾကာငးံ
အဆိုပါ Development ကိုစတငးရနးအတျကး သီအိုရီအာ့်ဖငးံ မညးသညး႕ Integrated development
Environment (IDE) ကိုမဆိုအသဵု့်ပဳႏိုငးပါသညး၈ စငးစစးအာ့်ဖငးံမညးသညး႕ IDE ကိုမြ္အသဵု့မ်ပဳဘဲလညး့
Development ်ပဳလုပးေစႏိုငပ
း ါသညး၈ အကယး၍ အ်ခာ့ေသာ Tool မ္ာ့်ဖငးံႏိႈငး့ယြဥးလြ္ငး Borland မြ
ထုတးေသာ JBuilder သို႕မဟုတး NetBeans ကဲံသို႕ေသာ Tool မ္ာ့ကိုအသဵု့်ပဳေနက္ ်ဖစးလြ္ငး အဆိုပါ
Tool မ္ာ့်ဖငးံပငး လျတးလပးစျာအသဵု့်ပဳႏိုငးပါသညး၈

ထို Tool မ္ာ့ကို သဵု့၍ Programming အနညး့ငယးေရ့တတးရဵု်ဖငးပ


ံ ငး ယခုစာအုပးပါ ဥပမာမ္ာ့ကို
ေရ့သာ့ႏိုငးစျမး့ရိြေသားလညး့ Open Handset Alliance ႏြငးံ Google တို႕ပါကမူ အဆိုပါ Java IDE မ္ာ့ကို
အသဵု့်ပဳ်ခငး့ထကး Eclipse ကိုအသဵု့်ပဳရနးသာ တိုကးတျနး့ထာ့ပါသညး၈ အကယး၍ ယခုစာအုပးပါ ဥပမာ
မ္ာ့ကို Eclipse ကိုအသဵု့မ်ပဳဘဲေရ့သာ့မညးဆိုပါက အသဵု့်ပဳမညး႕ IDE Tool မ္ာ့၏ Documentation
ကို ေကာငး့မျနးစျာ Compling ်ပဳလုပးရနးႏြငံး ေရ့သာ့ထာ့ေသာ Android Apps မ္ာ့ကိုေမာငး့ႏြငးႏိုငး်ခငး့
ရိြမရိြကို စစးေဆ့သငးံပါသညး၈ ယခုစာအုပးပါ ဥပမာမ္ာ့ကို ယခုစာအုပးတျငး Google မြအဆို်ပဳထာ့ေသာ
Eclipse ကိုသာအသဵု့်ပဳ၍ ေရ့သာ့မညး်ဖစးပါသညး၈

ယခုအခနး့တျငးမူ Eclipse Tool ႏြငးံ Program ေရ့သာ့ရာတျငးလိုအပးသညး႕ Java Runtime


Environment (JRE) မ္ာ့ကို Download ်ပဳလုပးကာ ရရိြလာေသာဖိုငးမ္ာ့ကို Install ်ပဳလုပးပဵုမ္ာ့ကို
ေဖား်ပေပ့မညး်ဖစးပါသညး၈ ကၽျမး့က္ငးသူမ္ာ့အေန်ဖငးံ Download ်ပဳလုပး်ခငး့၇ Install ်ပဳလုပး်ခငး့တို႕တျင
အခကးအခဲမရိြႏိုငးေသားလညး့ သာမာနးေလံလာသူတစးဦ့အေန်ဖငးံ လိုအပးမညးဟုယူဆ်ခငး့ေၾကာင
ထညး႕သျငး့ေဖား်ပ်ခငး့်ဖစးၿပီ့ အဆိုပါလုပးေဆာငးခ္ကးမ္ာ့ကို နာ့လညးတတးကၽျမး့ပါက ယခုအခနး့ကို
ေက္ားဖတးသျာ့ႏိုငးပါသညး၈

14 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Why Eclipse?
Eclipse ကို Android Application မ္ာ့အတျကး အသဵု့်ပဳသငးံသညး႕ IDE အ်ဖစးသတးမြတးရ်ခငး့မြာ
ေအာကးေဖား်ပပါ အခ္ကးမ္ာ့ေၾကာငးံ ်ဖစးပါသညး၈

 Open Handset Alliance ၏ Mobile Development market ၏အဆိုအရ Eclipse သညး


feature မ္ာ့ ်ပညး႕စဵုစျာပါွငးရဵုသာမက အခမဲံရရိြႏိုငးေသာ Java IDE ်ဖစးေသာေၾကာင
်ဖစးပါသညး၈ Eclipse သညး အသဵု့်ပဳရလျယးကူၿပီ့ သငးၾကာ့ရနးလညး့ မခကးခဲလြပါ၈ ထို႕ေၾကာငးံ
Eclipse သညး Open Java development အတျကး အေကာငး့ဆဵု့ေသာ IDE တစးခုလညး့
်ဖစးလာပါသညး၈
 Open Handset Alliance မြ Eclipse အတျကး Android Plugin တစးခုထုတးေပ့ခဲံၿပီ့ ၁ငး့သညး
Android သီ့သနး႕ Project မ္ာ့ကိုေရ့သာ့ႏိုငးကာ ထို Project မ္ာ့ကို Compile လုပး်ခငး့ႏြငးံ
Android Emulator ကိုအသဵု့်ပဳ၍ ေမာငး့ႏြငး်ခငး့၇ Debug ်ပဳလုပး်ခငး့တို႕ကို်ပဳလုပးႏိုငးပါသညး၈
ထို Tool မ္ာ့သညး ေနာကးပိုငး့တျငးေဖား်ပမညး႕ ပထမဆဵု့ေသာ Android app မ္ာ့ကိုေရ့သာ့
သညး႕အခါ မညးကဲံသို႕အသဵု့ွငးသညးဆိုေသာအခ္ကးကို သိ်မငးလာေစမညး်ဖစးသညး၈ Android
app မ္ာ့ေရ့သာ့ရနးအတျကးအ်ခာ့ေသာ IDE မ္ာ့ကိုအသဵု့်ပဳႏိုငးေသားလညး့ Eclipse အတျကး
သာ ထုတးေပ့ထာ့ေသာ Android Plugin မြ ထုတးေပ့ေသာ တိက္ေသာ Settings မ္ာ့ခ္ိနးညိြ
ေပ့်ခငး့ကိ ုအ်ခာ့ေသာ IDE မ္ာ့တျငးရရိြိႏိုငးမညးမဟုတးပါ၈ ထိုကဲံသို႕ Eclipse အတျကးထုတးေပ့
ထာ့ေသာ Android Plugin ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ အခ္ိနးကုနးသကးသာေစပါသညး၇ သငးၾကာ့ရ
လျယးကူေစပါသညး၈ ထုိ႕ေၾကာငးံ Application မ္ာ့ေရ့သာ့ရာတျငး အခ္ိနးတို်ဖငးံ ထိေရာကးမႈအရိြ
ဆဵု့်ဖစးေသာေၾကာငးံ Android application မ္ာ့ေရ့သာ့ရာတျငး Eclipse ကိုသာအသဵု့်ပဳၾက်ခငး့
်ဖစးပါသညး၈

Eclipse ကို MAC OS ႏြငးံ Linux OS အတျကးလညး့အသဵု့်ပဳႏိုငးပါသညး၈ ထိုသို႕အခ္ကးမ္ာ့ေၾကာင


Eclipse ကိုမညးသညး႕ကျနးပ္ဴတာတျငးမဆိုအသဵု့်ပဳႏိုငးသညးဟု ယူဆႏိုငးပါလိမးံမညး၈ သို႕ရာတျငး ယခုစာ
အုပးပါအေၾကာငး့အရာမ္ာ့ကို Microsoft ၏ Windows စနစးတျငးသာ တညးမီ၍ေရ့သာ့ထာ့်ခငး့်ဖစ
ေသာေၾကာငးံ အခ္ိဳ႕ေသာ MaC OS ႏြငးံ Linux OS ကိုအသဵု့်ပဳသူမ္ာ့အတျကးအနညး့ငယးကျဲလျဲမႈရိြႏိုင
ပါသညး၈ သို႕ရာတျငး သေဘာတရာ့ပိုငး့သညးအတူတူပငး်ဖစးသညး႕အတျကး အနညး့ငယးမြ္ ထပးမဵအာ့စိုကး

မ္ကးပျငးံစာေပ 15
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ရဵု်ဖငးံ နာ့လညးေစမညး်ဖစးပါသညး၈ ထို႕အ်ပငး အခ္ိဳ႕ေသာအခနး့မ္ာ့တျငး Linux Environment မ္ာ့


အတျကးပါဦ့တညးေရ့သာ့ထာ့ပါသညး၈ ယခုစာအုပးပါ ဥပမာအမ္ာ့စုကို Linux/Android Command line
environment မြေကာကးႏႈတးေဖား်ပထာ့်ခငး့လညး့ ်ဖစးပါသညး၈

Downloading and Installing the JRE


Eclipse ကုိ Download ်ပဳလုပးၿပီ့ Install မ်ပဳလုပးမီတျငး အသဵု့်ပဳမညး႕ ကျနးပ္ဴတာတျငး Java Runtime
Environment (JRE) ကို Download ်ပဳလုပး၍ Install ်ပဳလုပးထာ့ရနးလိုအပးပါသညး၈ Eclipse ်ဖငံး
Application တစးခုကိုေရ့သာ့သညး႕အခါတျငး Java Language ကိုအသဵု့်ပဳ၍ေရ့သာ့ရေသာေၾကာငးံ
Application ကိုေမာငး့ႏြငးရနး JRE ကိုလိုအပးပါသညး၈ အကယး၍ JRE ကို Install ်ပဳလုပးထာ့်ခငး့မရိြပါက
Eclipse Environment ကိုစတငးဖျငးံလြစးသညး႕အခါတျငးေအာကးေဖား်ပပါ Error Message ကိုေတျ႕်မငးရ
မညး်ဖစးပါသညး၈

အကယး၍ Java ကိုအသဵု့်ပဳဖူ့ပါက JRE ကိုစကးအတျငး့ Install ်ပဳလုပးထာ့ၿပီ့်ဖစးေကာငး့်ဖစးႏိုငးေသာ


လညး့ မြနးကနးေသာ Version ကို Install ်ပဳလုပးထာ့ရနးလိုအပးမညး်ဖစးပါသညး၈ Website ၾကညး႕ရြဳသူမ္ာ့
အပါအွငး Web အေ်ခ်ပဳ Application သဵု့စျဲသူမ္ာ့သညး JRE ကို install ်ပဳလုပးထာ့ၿပီ့်ဖစးေလံရိြပါ
သညး၈ JRE သညး Java အေ်ခ်ပဳ Application မ္ာ့ကိုေမာငး့ႏြငးေစႏိုငးေသားလညး့ Java Application ႏြငးံ
စပးလ္ဥး့ေသာ Program မ္ာ့ကိုေရ့သာ့ႏိုငး်ခငး့မရိြပါ၈ ထို႕ေၾကာငးံ Java Application မ္ာ့ကိုေရ့သာ့ရန
အတျကး Java Development Kit (JDK) ကို Install ်ပဳလုပးထာ့ရနးလိုအပးပါမညး၈ အဆိုပါ JDK တျငး
Java Application မ္ာ့ကိုေရ့သာ့ရနးအတျကး လိုအပးေသာ Tool မ္ာ့ႏြငးံ Library ဖိုငးမ္ာ့ကို ထညး႕သျငး့
ေပ့ထာ့ပါသညး၈ ထို႕ေၾကာငးံ JRE ကိုသီ့သနး႕ Download ဆျဲကာ Install ်ပဳလုပးမညး႕အစာ့ JDK တစးခု

16 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

လဵု့ကို Install ်ပဳလုပး်ခငး့်ဖငးံ JRE ပါတစးပါတညး့ပါွငးလာသညး႕အတျကး JDK တစးခုတညး့ကိုသာ


Install ်ပဳလုပး်ခငး့်ဖငးံလဵုေလာကးေစမညး်ဖစးပါသညး၈

Mozilla ကံဲသို႕ေသာ Web Browser ကိုအသဵု့်ပဳ၍ ေအာကးေဖား်ပပါပဵုအတိုငး့ Sun Developer Network


(SDN) ၏ Web Page ်ဖစးေသာ http://develpers.sun.com/downloads/ သို႕သျာ့ေရာကးပါ၈ Eclipse
ကိုေမာငး့ႏြငးရနးအတျကး JRE တစးခုတညး့ကိုသာ လိုအပးေသားလညး့ ေနာကးပိုငး့လုပးေဆာငးခ္ကးမ္ာ့
အတျကး JDK တစးခုလဵု့ကို Download ်ပဳလုပးသငးံပါသညး၈ ထို JDK ကုိအသဵု့်ပဳ၍ Eclipse ကိုအသဵု့မ်ပဳ
ဘဲ Android Application ေရ့သာ့်ခငး့မ္ာ့ကို ေနာကးပိုငး့သငးခနး့စာမ္ာ့တျငးေဖား်ပေပ့ထာ့ပါသညး၈
အဆိုပါ သငးခနး့စာမ္ာ့ကိုေလံလာရနးအတျကး JDKတစးခုလဵု့ကို Download ်ပဳလုပးသငးံပါသညး၈

SDN Download Page မြ Proper JDK အတျကး Download Section သို႕သျာ့ေရာကးရပါမညး၈


ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Download ်ပဳလုပးႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 17
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ယခုစာအုပးပါဥပမာမ္ာ့အရ Java 5 JDK update14 ကိုေရျ့ခ္ယးထာ့ပါသညး၈ Eclipse မြလညး့အဆိုပါ


Java 5 ကိုသာ Install ်ပဳလုပးရနးအၾကဵ်ဳထာ့ပါသညး၈ Java 5 JDK ကို Download ်ပဳလုပးရနးအတျကး
အသဵု့်ပဳလိုသညး႕ Platform ကိုေရျ့ခ္ယးေပ့ရနးလိုအပးမညး်ဖစးပါသညး၈ အကယး၍ Java 6 JDK ကို
Install ်ပဳလုပးလိုပါက ်ပဳလုပးႏိုငးမညး်ဖစးေသားလညး့ Java JDK 5 ထကးပိုမို နိမးံေသာ Version ကို
Download ်ပဳလုပးလိုပါက ေအာကးတျငးေဖာ်းပထာ့သညး႕ပဵုအတိုငး့ Previous Release Link ကို Click ႏိြပး
ေပ့ရမညး်ဖစးပါသညး၈ အကယး၍ Download ခလုတးႏိြပး၍ ေပၚလာေသာ Sun licensing agreement
တျငး Accept ်ပဳလုပးကာ Download ကိုစတငး်ပဳလုပးႏိုငးမညး်ဖစးပါသညး၈

18 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Java SE Previous Release Download Page ေပၚတျငး J2SE 5.0 ဟူေသာ Download link ကို Click
ႏိြပး၍ အလိုရိြေသာ JDK 5.0 Update x ေဘ့မြ Download ခလုတးကိုတစးခ္ကးႏိြပးေပ့ပါ၈ ယခုေနရာမြ x
သညး ေနာကးဆဵု့ထျကး update number အ်ဖစးမြတးယူရပါမညး၈

Microsoft ၏ Window Environment ကိုသာအသဵု့်ပဳခဲံပါက အထကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့


File Download Dialogbox ကိုေတျ႕်မငးရမညး်ဖစးၿပီ့ တိုကးရိုကး Install ်ပဳလုပးလိုပါက Run ဟူေသာ
ခလုတးကို ႏိြပးသငးံၿပီ့ မိမိကျနးပ္ဴတာတျငးပါ Installation File ကိုသိမး့ဆညး့ထာ့လိုပါက Save
ခလုတးကိုေရျ့ခ္ယးသငးံပါသညး၈ ထိုကဲံသို႕ Save ခလုတးကိုသာႏိြပးခဲံပါက Download ်ပဳလုပးထာ့ေသာ

မ္ကးပျငးံစာေပ 19
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

လမး့ေၾကာငး့ကိုမြတးသာ့ထာ့ရ မညး်ဖစးၿပီ့ Download လုပးေဆာငးမႈၿပီ့ဆဵု့ေသာအခါတျင


ထိုလမး့ေၾကာငး့အတိုငး့ွငးေရာကး၍ Installation Setup File ကို Double Click ႏိြပး၍
ေမာငး့ႏြငးထညး႕သျငး့ႏိုငးမညး်ဖစးပါသညး၈
Installation ်ပဳလုပးေနစဥးအေတာအတျငး့တျငး ေအာကးေဖား်ပပါပဵုအတိုငး့ Lincense Agreement
ကိုေတျ႕ရိြရပါက I Accept ကိုေရျ့ခ္ယးကာ Next ခလုတးကိုႏိြပး၍ ေရြ႕ဆကးေပ့ရပါမညး၈

ထို႕ေနာကး ေအာကးေဖား်ပပါပဵုအတိုငး့ေပၚလာေသာအခါတျငး အသဵု့်ပဳမညး႕ရညးရျယးခ္ကးအေပၚမူတညးကာ


အေ်ပာငး့အလဲအနညး့ငယး ်ပဳလုပးေပ့ရနး လိုအပးေကာငး့လိုအပးမညး်ဖစးပါသညး၈ အၾကဵေပ့လိုသညးမြာ
အနာဂတးအစီအစဥးကိုမူတညး၍ အာ့လဵု့ေသာ Install လုပးေဆာငးခ္ကးမ္ာ့ကို ထညး႕သျငး့ေပ့သငးံပါ
သညး၈ ထို႕အ်ပငး Install ဖိုငးမ္ာ့သိမး့ဆညး့မညး႕လမး့ေၾကာငး့ကိုလညး့ သတးမြတးေပ့ႏိုငးေသားလညး့
အကယး၍ မလိုအပးပါက Install path ကုိမေ်ပာငး့လဲသငးံပါ၈

20 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကးေအာကးေဖား်ပပါပဵုအတိုငး့ ေတျ႕်မငးရပါက Finish ခလုတးကိုတစးခ္ကးႏိြပးေပ့်ခငး့်ဖငးံ Install


လုပးငနး့စဥးကို အဆဵု့သတးႏိုငးပါသညး၈

အထကးပါပဵအ
ု တိုငး့ Java SDK ကို Install ်ပဳလုပးၿပီ့ေသာအခါ JRE ကိုပါ တစးပါတညး့ Install ်ပဳလုပးၿပီ့
်ဖစးသညး႕အတျကး Eclipse ကိုစတငးအသဵု့်ပဳႏိုငးၿပီ်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 21
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Downloading and Installing Eclipse


Eclipse ကို Download ်ပဳလုပးရနးအတျကး Eclipse ၏ Download Page ်ဖစးေသာ http://www.
eclipse.org/downloads သို႕ Mozilla ကဲံသို႕ေသာ Browser တစးခုကိုအသဵု့်ပဳ၍ သျာ့ေရာကးေပ့ရ
ပါမညး၈ ထို Page ၏အဖျငးံမြာပငး Eclipse ကိုအသဵု့်ပဳရနးအတျကး JRE (Java 5 JRE) ကိုလိုအပးေၾကာငး့
ေဖား်ပထာ့သညးကိုေအာကးေဖား်ပပါပဵုအတိုငး့ ေတျ႕်မငးရမညး်ဖစးပါသညး၈ ထို႕ေနာကး Eclipse IDE for
Java Developer ကိုေရျ့ခ္ယး၍ Download ်ပဳလုပးရပါမညး၈ Package သညး 79MB ခနး႕သာရိြေသာ
ေၾကာငးံလြ္ငး်မနးစျာ Download ်ပဳလုပးႏိုငးမညး်ဖစးပါသညး၈ သတိ်ပဳရမညး႕အခ္ကးမြာ Eclipse IDE for
Java EE Developers ဟူေသာ Option ကိုမြာ့ယျငး့ကာ Download မ်ပဳလုပးမိေစရနး်ဖစးသညး၈

Eclipse ကို Download ်ပဳလုပးၿပီ့ေနာကး Install ်ပဳလုပးရနးလိုအပးမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ Download


်ပဳလုပးထာ့ခဲံေသာ လမး့ေၾကာငး့သို႕သျာ့ေရာကး၍ ဖျငးံေပ့ရပါမညး၈ ထို႕ေနာကး Download ်ပဳလုပး၍ ရရိြ
ထာ့ေသာ Eclipse Package ZIP ဖိုငးကို Extract ်ပဳလုပးၿပီ့ ရရိြလာေသာ Folder ထဲမြ Eclipse.exe ကို

22 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Double Click ႏိြပး၍ ေမာငး့ႏြငးေပ့ရပါမညး၈ ထိုအခါ User directory (folder) ေအာကးတျငး Eclipse ကို
Install ်ပဳလုပးသျာ့မညး်ဖစးၿပီ့ ေအာကးေဖား်ပပါပဵုအတိုငး့ Eclipse Spendist Screen ေပၚလာသညးက
ေတျ႕်မငးရမညး်ဖစးသညး၈

Eclipse ပျငးံလာၿပီ့သညး႕ေနာကးတျငး ေအာကးေဖား်ပပါအတိုငး့ Workspace ကိုေရျ့ခ္ယးႏိုငးရနးအတျက


Workspace Launcher ဟူေသာ Dialogbox ကိုေတျ႕်မငးႏိုငးမညး်ဖစးပါသညး၈ ထို Workspace Folder ကို
ေရျ့ခ္ယးရ်ခငး့မြာ ေရ့သာ့ထာ့ေသာ Application Project မ္ာ့ကို သိမး့ဆညး့ရနးအတျကး ေနရာ
သတးမြတးခိုငး့်ခငး့ပငး်ဖစးပါသညး၈ နဂိုမူလေပ့ထာ့ေသာ လမး့ေၾကာငး့မြာ User Directory ထဲတျငးရိြမညး
်ဖစးၿပီ့ ေ်ပာငး့လဲလိုပါက ေဘ့ဘကးတျငးရိြေသာ Browse ခလုတးတျငးတစးခ္ကးႏိြပးၿပီ့သတးမြတးေပ့ႏိုငးပါ
သညး၈

မ္ကးပျငးံစာေပ 23
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Use this as the default and do not ask again ဟူေသာ Check Box ကိုသာေရျ့ခ္ယးအမြနး်ခစးေပ့
ထာ့ခဲံပါက အာ့လဵု့ေသာ Application Project မ္ာ့ကို ေဖား်ပပါ Workspace ထဲတျငးသာ သိမး့ဆညး့
မညး်ဖစးၿပီ့ ေနာကးတစးႀကိမးထပးမဵေရျ့ခ္ယးခိုငး့ေတာံမညးမဟုတးပါ၈ ထို႕ေၾကာငးံအဆိုပါ Check Box ကို
ေရျ့ခ္ယးရနးအႀကဵ်ပဳလိုပါသညး၈ ထို႕ေနာကး ေရျ့ခ္ယးစရာမ္ာ့ကို ေရျ့ခ္ယးၿပီ့ပါက OK ကို Click ႏိြပးေပ့ရပါ
မညး၈

ထို႕ေနာကး Development ်ပဳလုပးမညး႕ Environment ကိုေအာငး်မငးစျာပငး Download ်ပဳလုပး၍ Install


လညး့်ပဳလုပးၿပီ့စီ့ၿပီ့်ဖစးပါသညး၈ Eclipse ကို Install ်ပဳလုပးရာတျငး လြ္ငး်မနးသညးဟုခဵစာ့ရပါက
အ်ခာ့ေသာ Configure ်ပဳလုပး်ခငး့မ္ာ့ကို Application Project မေရ့သာ့မီတျငး ်ပဳလုပးရနးလိုအပးပါ
ေသ့သညး၈ Android SDK ကို Configure ်ပဳလုပး်ခငး့၇ Eclipse အတျကး Android Plugin မ္ာ့ထညး႕သျငး့
်ခငး့စသညးတို႕ကို လုပးေဆာငးေပ့ရဦ့မညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Android SDK ကို Download ဆျဲ၍
Install ်ပဳလုပး်ခငး့၇ Android Plugin မ္ာ့ထညး႕သျငး့်ခငး့ႏြငးံ Eclipse Setting မ္ာ့ကိုခ္ိနးညိြ်ခငး့တို႕က
ေနာကးလာမညး႕အခနး့တျငး ေတျ႕်မငးရေစမညး်ဖစးကာ အခနး့ ၂ တျငး ပထမဆဵု့ Android Application ကို
စတငးေရ့သာ့ရေတာံမညး်ဖစးပါသညး၈

24 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter3
Downloading and Installing the
Android SDK

မ္ကးပျငးံစာေပ 25
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Downloading the Android SDK
- Using the Update feature of Eclipse
- Downloading, Insalling, and configuring the Android plugin for Eclipse
- Checking the PATH statement

လျနးခဲံေသာအခနး့တျငး Eclipse ကို Download ဆျဲ၍ Install ်ပဳလုပး်ခငး့ကို ေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈


Eclipse သညး Java IDE ်ဖစးေသာေၾကာငးံ Java Application မ္ာ့ကိုစတငးေရ့သာ့ႏိုငးၿပီ်ဖစးေသားလညး့
Mobile Application မ္ာ့ကို ဖနးတီ့တညးေဆာကးရနးအတျကး ်ပဳလုပးစရာမ္ာ့ က္နးရိြပါေသ့သညး၈ ထို႕
ေၾကာငးံ Android Application မ္ာ့ကို Development မ္ာ့ကုိေရ့သာ့ႏိုငးရနးအတျကး လိုအပးေသာ Tool
မ္ာ့ကုိထညး႕သျငး့ေပ့ရဦ့မညး်ဖစးပါသညး၈ Eclipse သညး Java Development Environment ်ဖစးသညး႕
အတျကး Java Application မ္ာ့ေရ့သာ့ႏိုငးၿပီ်ဖစးေသားလညး့ Android Application ်ဖငးံသကးဆင
ို းေသာ
Library မ္ာ့မရိြေသ့သညး႕အတျကး Android Development အတျကးအသဵု့်ပဳႏိုငးဦ့မညးမဟုတးပါ၈ ထို႕
ေၾကာငးံ Android Application Project မ္ာ့ကို ေရ့သာ့ႏိုငးရနးအတျကး Android SDK ကို Download ်ပဳ
လုပး၍ Install ်ပဳလုပးရနးလိုအပးမညး်ဖစးပါသညး၈ ထို႕ေနာကး Eclipse အတျကးအသဵု့်ပဳႏိုငးသညး႕ Android
plugin ကိုလညး့ Download ်ပဳလုပးရမညး်ဖစးသညး၈ Android SDK သညးအ်ခာ့ေသာ SDK မ္ာ့ႏြငးံ
သေဘာတရာ့ခ္ငး့အတူတူပငး်ဖစးၿပီ့ ၁ငး့တျငး Java ်ဖငးံေရ့သာ့ထာ့ေသာ library ဖိုငးမ္ာ့ကို Android
Platform တျငး Application မ္ာ့ေရ့သာ့ႏိုငးရနးအလို႔ငြါ ထညး႕သျငး့ေပ့ထာ့ပါသညး၈ ထို႕အ်ပငး Android
SDK တျငး Help file မ္ာ့၇ Documentation မ္ာ့၇ Android Emulator တို႕အ်ပငး အ်ခာ့ေသာ
Devleopment ၏ host ႏြငးံ Debugging Tool မ္ာ့ပါွငးပါသညး၈

Android SDK ကိုစတငး Download ်ပဳလုပးရနးအတျကး Google Android Development Site ်ဖစးေသာ
http://code.google.com/android သို႕သျာ့ေရာကးရပါမညး၈ Home Page တျငးပငး Android Platform
အတျကးအသဵု့ွငးေစမညး႕ Tool မ္ာ့၇ Document မ္ာ့အ်ပငး Android developer forum ်ဖငးံ
ခ္ိတးဆကးႏိုငးရနး Community ်ပဳလုပး်ခငး့တို႕ကိုပါေဆာငးရျကးေစႏိုငးမညး်ဖစးပါသညး၈ ေအာကးတျငး
Google Android Development ၏ Home Page ကိုေဖား်ပေပ့ထာ့ပါသညး၈

26 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Downloading the Android SDK


Android SDK ကို http://code.google.com/android ဟူေသာ Website တျငးရရိြႏိုငးပါသညး၈ Home
Page တျငး Getting Start ေအာကးမြ Download the SDK ဟူေသာ Link ကို Click ႏိြပးပါ၈ Android SDK
License Agreement ကို Agree ်ပဳလုပးၿပီ့ေနာကးတျငး Android SDK ကို Download ်ပဳလုပးႏိုငးမညး႕
Page ကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈ Android SDK သညး 79MB ခနး႕သာရိြေသာေၾကာငးံအလျယးတကူပင
Download ်ပဳလုပးႏိုငးမညး်ဖစးပါသညး၈ ထို႕ေနာကး လကးရိြအသဵု့်ပဳေနသညး႕ OS ႏြငးံကိုကးညီေသာ
Package Name ကို Download ်ပဳလုပးႏိုငးမညး်ဖစးပါသညး၈ Android SDK ကို Setup ်ပဳလုပးရနး အေထျ
အထူ့ေ်ပာစရာမရိြဘဲ Eclipse Development Environment တျငးအသဵု့်ပဳရနး ညႊနးၾကာ့ခ္ကးအတိုငး့သာ
်ပဳလုပးေဆာငးရျကးေပ့ရမညး်ဖစးပါသညး၈ ထို႕ေနာကး Android SDK ကို Confgure ်ပဳလုပးၿပီ့ေနာကး
Elipse အတျကး Android Plugin ကိုရယူရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 27
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Downloading and Instaling the Android Plugin for


Eclipse
Elipse Development Environment အတျငး့တျငး Android SDK ကို Setup ်ပဳလုပးရနးအတျက
ပထမဆဵု့လုပးေဆာငးရမညး႕ လုပးေဆာငးခ္ကးမြာ Eclipse အတျကး Android Plugin ကို Download ဆျဲ၍
Install လုပးေဆာငးရနး်ဖစးပါသညး၈ Download ်ပဳလုပး်ခငး့ႏြငးံ Install ်ပဳလုပး်ခငး့ စေသာလုပးေဆာငးခ္ကး
ႏြစးခုစလဵု့ကို တစးၿပိဳငးတညး့လုပးေဆာငးႏိုငးၿပီ့ ထိုသို႕လုပးေဆာငးရနးအတျကး လိုအပးေသာအခ္ကးမ္ာ့က
ေအာကးတျငးအဆငးံအလိုကးေဖား်ပထာ့ပါသညး၈

ှ၈ Eclipse Applicaton ကို ဦ့စျာဖျငးံပါ၈

ဿ၈ Help Menu မြ Software Updates ထိုမြ Find and Installကိုေရျ့ခ္ယးပါ၈

28 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

၀၈ ထို႕ေနာကး Install/Update Window တျငး Search for New Features to install ဟူေသာ Radio
button ကိုေရျ့ခ္ယးၿပီ့ေနာကး Next တျငး Click ႏိြပးပါ၈

၁၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Option မ္ာ့ကုိအသဵု့်ပဳ်ခငး့်ဖငးံ Android Plugin ကိုမရရိြႏိုငးေသာ


ေၾကာငးံ New Remote Site ဟူေသာ ခလုတးကို Click တစးခ္ကးႏိြပးေပ့ရပါမညး၈

မ္ကးပျငးံစာေပ 29
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

၂၈ ေအာကးေဖား်ပပါပဵုအတိုငး့ New Update Site ေပၚလာေသာအခါတျငး Name တျငး Androd Plugin


ဟုရိုကးထညး႕ၿပီ့ URL တျငး https://dl-ssl.google.com/android/eclipse ဟုရက
ို းထညး႕ၿပီ့ OK တျငး
Click ႏိြပးပါ၈

၃၈ ေအာကးေဖား်ပပါပဵုအတိုငး့ Android Plugin ဟူေသာ CheckBox တစးခုတို့လာသညးကို ေတျ႕ရမညး


်ဖစးသညး၈

30 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

၄၈ ထို CheckBox ကိုအမြနး်ခစးေပ့၍ေရျ့ခ္ယးၿပီ့ Finish တျငး Click ႏိြပးပါ၈ Eclipse သညး ရိုကးထညး႕ထာ့
ေသာ URL ႏြငးံ သကးဆိုငးေသာ Web Site တျငး Download လုပးယူႏိုငးေသာ Plugin မ္ာ့ကိုရြာေဖျေပ့
မညး်ဖစးပါသညး၈

၅၈ ထို႕ေနာကး Update Window ၏ Search Results Page ေပၚလာမညး်ဖစးကာ ေအာကးေဖား်ပပါပဵု


အတိုငး့ပငး Anroid Plugin ကိုအမြနး်ခစးေပ့ေရျ့ခ္ယး၍ Finish တျငး Click ႏိြပးေပ့ရပါမညး၈

၆၈ ေအာကးေဖား်ပပါအတိုငး့ Lincese Page ေပၚလာေသာအခါ Accept ကိုေရျ့ခ္ယး၍ Next ကို Click ႏိြပး
ေပ့ရပါမညး၈

မ္ကးပျငးံစာေပ 31
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

မြတးသာ့ရနးမြာ Eclipse plugin ကို Insall ်ပဳလုပးေစမညး႕လမး့ေၾကာငး့မြာ %installpath%/eclipse/


plugins directory ေအာကးတျငးရိြမညး်ဖစးၿပီ့ ဗဟုသုဓအလို႕ငြါမြတးသာ့ထာ့သငးံပါသညး၈

ှွ၈ ထို႕ေနာကး Eclipse သညး Android Plugin ကို Download ်ပဳလုပးေနမညး်ဖစးပါသညး၈ ထို႕ေနာကး
ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Feature Verification Page ေပၚလာေသာအခါတျငး Install All
ဟူေသာ ခလုတးကိုေရျ့ခ္ယး၍ Installation ၿပီ့ဆဵု့သညးအထိ ေစာငးံဆိုငး့ရပါမညး၈

32 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android Plugin ကို Install ်ပဳလုပးၿပီ့ေနာကး ဆကးလကး်ပဳလုပးရမညး႕လုပးေဆာငးခ္ကးမြာ အဆိုပါ


Android Plugin ကို Configure ်ပဳလုပးရနး်ဖစးပါသညး၈

Configuring the Android Plugin for Eclipse


Android Plugin ကို Install လုပးၿပီ့ေနာကးတျငး Eclipse မြ Application ကို Restart ်ပဳလုပးခိုငး့သညး႕
Message Box တစးခုကိုေတျ႕်မငးရမညး်ဖစးကာအကယး၍ ထိုကဲံသို႕ Message Box ကိုမေတျ႕ရပါကလညး့
Eclipse ကို Restart ်ပနးလုပးသငးံပါသညး၈ Eclipse ကို Restart ်ပနးလုပးၿပီ့ ်ပနးတကးလာေသာအခါတျင
Install ်ပဳလုပးထာ့ေသာ Plugin ကို initialize ်ပဳလုပးေနသညးကိုေတျ႕ရပါမညး၈ ထို႕ေနာကး Android
Plugin ကို Configure ်ပဳလုပးရနးအတျကး ေအာကးတျငးေဖား်ပထာ့သညး႕ လုပးေဆာငးခ္ကးမ္ာ့အတိုငး့
လိုကးလဵလုပးေဆာငးေပ့ရပါမညး၈

ှ၈ Eclipse ၏ Main Windows မြ Windows Menu ကို Click ႏိြပးၿပီ့ ထိုမြ Preferences ကိုေရျ့ခ္ယးပါ၈
မ္ကးပျငးံစာေပ 33
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ဿ၈ Preferences Window ေပၚလာေသာအခါတျငး ဘယးဘကး်ခမး့တျငးရိြေသာ Anroid ကိုတစးခ္ကးေရျ့


ခ္ယး၍ ညာဘကးတျငးရိြေသာ SDK Location ေဘ့မြ Browse ကိုေရျ့ခ္ယးေပ့ရပါမညး၈ ထို႕ေနာကး
Download ဆျဲထာ့ေသာ Android SDK ရိြသညး႕ Directory လမး့ေၾကာငး့သို႕ေရျ့ခ္ယးေပ့ရပါမညး၈

၀၈ ထို႕ေနာကး Automatically sync projects to Current SDK ဟူေသာ Check Box ကိုအမြနး်ခစးေပ့
ေရျ့ခ္ယး၍ Apply ခလုတးတျငး Click တစးခ္ကးႏိြပးေပ့ရပါမညး၈ သတိထာ့ရနးအခ္ကးမြာ SDK Location
တျငး ေရျ့ခ္ယးရနး Download ်ပဳလုပးထာ့သညး႕ Android SDK သညး Zip ဖိုငး်ဖစးေနတတးေသာေၾကာင
SDK Location တျငး မေရျ့ခ္ယးမီတျငး အဆိုပါ Zip ဖိုငးကို Extract ်ပဳလုပး၍ ရရိြလာေသာ Folder ကိုသာ
ေရျ့ခ္ယးသတးမြတးေပ့ရပါမညး၈ ထို႕အ်ပငး ရရိြလာေသာ Folder ၏အမညးမြာလညး့ ရြညးလြ္ာ့လြ၍
ႏြစးသကးရာ အဆငးေ်ပမညးနာမညးတစးခုခုသို႕ေ်ပာငး့လဲသငးံပါသညး၈ မေ်ပာငး့လဲဘဲ ထိုအတိုငး့အသဵု့်ပဳ
ကလညး့ ်ပသနာမရိြပါ၈

34 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

၁၈ ေနာကးဆဵု့်ပဳလုပးရမညး႕အဆငးံမြာ PATH Statement ကိုထညး႕သျငး့ရနး်ဖစးပါသညး၈ ထိုသို႕ထညး႕သျငး့


ရနးအတျကးအကယး၍ Microsoft ၏ Windows ကိုသာအသဵု့်ပဳ်ခငး့်ဖစးပါက Computer (My Computer)
ကို Right Click ႏိြပးၿပီ့ Properties ကိုေရျ့ခ္ယးေပ့ရပါမညး၈ ထို႕ေနာကး System Proerties Dialogbox
ေပၚလာလြ္ငး ဘယးဘကး်ခမး့မြ Advanced Systm Settings ကိုတစးခ္ကး Click ႏိြပးေပ့ရပါမညး၈ ထိုအခါ
System Properties Dialogbox ေပၚလာမညး်ဖစးၿပီ့ ထိုမြ Advanced Tab ကိုေရျ့ခ္ယးပါ၈

၂၈ ထို Andvanced Tab မြ Environment Variable ကိုေရျ့ခ္ယးေပ့်ခငး့်ဖငးံ ေအာကးတျငးေဖား်ပထာ့


သညး႕ပဵုအတိုငး့ Envrionment Variables Dialogbox ကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

၃၈ System Variables ေအာကးမြ Path ဟူေသာစာေၾကာငး့ကိုေတျ႕ေအာငးရြာ၍ Double Click ႏိြပးပါ၈

မ္ကးပျငးံစာေပ 35
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

၄၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုကဲံသို႕ Edit System Variable Dialogbox ပျငးံလာလြ္ငး Variable


Value တျငး Download ်ပဳလုပးထာ့ခဲံေသာ Android SDK ၏ Directory လမး့ေၾကာငး့ကို ရိုကးထညး႕ေပ့
ရပါမညး၈ ထို႕ေနာကး OK ကုိႏိြပးပါ၈ ထို႕ေနာကး Environment Variable Dialogbox တျငးလညး့ OK ကို
ႏိြပး၍ ထျကးပါ၈

ယခုအခ္ိနးတျငး Eclipse ကိုအသဵု့်ပဳ၍ Application ေရ့သာ့ရနးအတျကး Android SDK ႏြငးံတကျ Eclipse


ႏြငးံ Android plugin တို႕ကို ေအာငး်မငးစျာ Configure ်ပဳလုပးၿပီ့်ဖစးပါသညး၈ ေနာကးလာမညး႕အခနး့တျင
Android SDK ႏြငးံ ၁ငး့၏ Feature မ္ာ့ကိုေလံလာရပါမညး၈ Cell Phone Application မ္ာ့ေရ့သာ့ရာ
တျငး လိုအပးေသာ Feature အာ့လဵု့သညး Android SDK တျငးပါွငးေသာေၾကာငးံ Android SDK ၏
အေၾကာငး့ကို လိပးပတးလညးေအာငး သိရိြထာ့ေစရနး လိုအပးပါသညး၈

36 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 4
Exploring the Android SDK

မ္ကးပျငးံစာေပ 37
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Using the Android SDK documentation
- Using the Android SDK tools
- Using the sample applications
- Learning the life cycle of an Android application

Android Application မ္ာ့ေရ့သာ့ရနးအတျကး လိုအပးေသာလုပးေဆာငးခ္ကးမ္ာ့အာ့လဵု့ကို လုပးေဆာငး


ၿပီ့်ဖစး၍ စတငး၍ Application မ္ာ့ေရ့သာ့ရနး အဆငးသငးံ်ဖစးေနၿပီ်ဖစးပါသညး၈ သို႕ရာတျငး ထိုကဲံသို႕
Application မ္ာ့ကိုမေရ့သာ့မီတျငး Android SDK ႏြငးံရငး့ႏြီ့ကၽျမး့ွငးေစရနး လိုအပးမညးဟုယူဆပါသညး၈

Android SDK တျငး ဖုနး့ေခၚဆိုလကးခဵ်ခငး့တို႕အ်ပငး GPS function မ္ာ့ႏြငးံ Text Message ကဲံသို႕ေသာ
Cel Phone function မ္ာ့ႏြငးံသကးဆိုငးေသာ Core Android Feature မ္ာ့ႏြငံးသကးဆင
ုိ းေသာ Library
မ္ာ့ပါွငးပါသညး၈ အဆိုပါ Library မ္ာ့်ဖငးံ SDK ၏ Coreကိုတညးေဆာကးထာ့်ခငး့်ဖစးၿပီ့ ယခုအခနး့တျငး
အဆိုပါ အေၾကာငး့အရာမ္ာ့ကို ေလံလာရမညး်ဖစးပါသညး၈ ယခုအခနး့တျငး Android SDK တျငး ပါွငး
ေသာ အေရ့ႀကီ့သညး႕အစိတးအပိုငး့မ္ာ့ကို ေဖား်ပေပ့မညး်ဖစးသညး၈ ယခုအခနး့ကို ေသခ္ာစျာေလံလာ
်ခငး့်ဖငးံ Android SDK၏ Content မ္ာ့အေၾကာငး့ကို က္နစျာသိရိြသျာ့မညး်ဖစးၿပီ့ Android
Programming ကိုေရ့သာ့ရာတျငးပိုမို ကၽျမး့က္ငးလာေစမညး်ဖစးသညး၈ Android Application ကိုစတငး
မေရ့သာ့မီတျငး ၁ငး့ႏြငးံသကးဆိုငးေသာ Content မ္ာ့ႏြငးံ လုပးေဆာငးခ္ကးမ္ာ့ႏြငးံ ရငး့ႏီြ့ကၽျမး့က္ငးရနး
လိုအပးေသာေၾကာငးံ ယခုေဖား်ပပါအခနး့ကို ေသခ္ာစျာေလံလာေစလိုပါသညး၈

What is in the Android SDK?


Android SDK ကို Zip ဖိုငး Package အသျငး်ဖငးံ Download ဆျဲရယူခဲံပါသညး၈ (အခနး့ ၀ တျငးေဖား်ပခဲံၿပီ့
်ဖစးသညး) အဆိုပါ Android SDK အတျငး့ ဖိုငးေပါငး့မ္ာ့စျာပါွငးၿပီ့ Documentation မ္ာ့၇ Programming
API မ္ာ့၇ Tool မ္ာ့ႏြငးံနမူနာေပါငး့မ္ာ့စျာ ပါွငးပါသညး၈ ယခုအပိုငး့တျငး Android SDK တျငးပါွငးော
ဖိုငးမ္ာ့ကို ေလံလာၾကညး႕ၾကမညး်ဖစးပါသညး၈ Android SDK အတျငး့တျငးပါွငးေသာဖိုငးမ္ာ့ကို ၾကညး႕ရြဳ
ရနးအတျကး Download ဆျဲထာ့ေသာ Android SDK Zip ဖိုငးကို Extract ်ပဳလုပး၍ ရရိြလာေသာ Folder
အတျငး့သို႕ွငးေရာကးၾကညး႕ရြဳႏိုငးပါသညး၈
38 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Root Folder အတျငး့မြာပငး ဖိုငးအမ္ာ့အ်ပာ့ကိုေတျ႕ရိြရမညး်ဖစးၿပီ့ ယငး့အထဲတျငး android.jar ဖိုငး


(Core SDK library မ္ာ့ႏြငးံ API မ္ာ့တျငးပါွငးေသာ Complie ်ပဳလုပးႏိုငးေသာ Java Application) ႏြငးံ
Note အခ္ိဳ႕အ်ပငး Andoid SDK ကို အဓိက Folder သဵု့ခု်ဖငးံတညးေဆာကးထာ့သညးကို ေတျ႕ရမညး
်ဖစးပါသညး၈
 Docs တျငး Android ႏြငးံသကးဆိုငးေသာ Documentation မ္ာ့ကိုထညး႕သျငး့ထာ့ပါသညး၈ ထို
Documentation မ္ာ့ကို Docs Folder တျငးသာမက http://code.google.com/android မြပါ
ရယူႏိုငးပါသညး၈
 Samples တျငး နမူနာ Application ေ်ခာကးခုကိုေတျ႕်မငးႏိုငးၿပီ့ ထို Application ကို Eclipse ်ဖငးံ
စမး့သပးေမာငး့ႏြငးၾကညး႕ႏိုငးပါသညး၈
 Tools တျငး Android Application မ္ာ့ေရ့သာ့ရာတျငးလိုအပးေသာ Development Tool မ္ာ့ႏြငးံ
တကျ Compilation တို႕အ်ပငး Debugging Tool မ္ာ့ကို ထညး႕သျငး့ေပ့ထာ့ပါသညး၈

ေအာကးတျငးေဖား်ပထာ့ေသာ အေၾကာငး့အရာတစးခုစီတငး SDK Folder တျငးပါွငးေသာ Folder မ္ာ့


အေၾကာငး့ကိုပိုမိုအေသ့စိပးစျာ ေလံလာရမညး်ဖစးပါသညး၈

Android Documentation
Android Documentation ကို Android SDK ၏ Docs Folder အတျငး့တျငး ထညး႕သျငး့ထာ့ပါသညး၈ ထို
Documentation တျငး SDK ကို Download ်ပဳလုပး်ခငး့ႏြငးံ Install ်ပဳလုပး်ခငး့ႏြငးံသကးဆိုငးေသာ
အေၾကာငး့အရာမ္ာ့အ်ပငး Application မ္ာ့ကို Develop လုပးယူရနးအတျကး Gettings Started ဟူေသာ
အေၾကာငး့အရာႏြငးံ Package ဖျငးံဆုိခ္ကးမ္ာ့ပါွငးပါသညး၈ အဆိုပါ Documentation ကို HTML Format
်ဖငးံေရ့သာ့ထာ့ၿပီ့ SDK Folder ၏ Root folder မြ documentation.html ဖိုငးကိုဖျငံး်ခငး့်ဖငးံ ဖတးရြဳႏိုငး
ပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုသညး ထို documentation.html ကို ဖျငးံလုိကး်ခငး့်ဖငးံ ေတျ႕်မငး
ရမညး႕ပဵုပငး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 39
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Android SDK အတျငး့တျငးပါွငးေသာ အာ့လဵု့ေသာ Documentation မ္ာ့ကို documentation.html


တစးခုတညး့မြ ၾကညး႕ရြဳႏိုငးပါသညး၈ ထို Documentation တျငးေဖား်ပထာ့သညး႕အခ္ကးမ္ာ့သညး အလျနး
တနးဖို့ရိြၿပီ့ အခ္ိနးရတိုငး့ဖတးရြဳေလံလာသငးံပါသညး၈ ထို Documentation တျငးပါွငးေသာ အဓိကက႑
မ္ာ့မြာ ေအာကးပါအတိုငး့်ဖစးပါသညး၈

 Reference Information
 Class Index
 List of Permissions
 List of Resource Types
 Troubleshooting

Documentation ၏ Troubleshooting ဟူေသာ Sectin သညး စတငးအသဵု့်ပဳသူမ္ာ့အတျကး အလျနး


အက္ိဳ့်ပဳေစပါသညး၈ ကိုယးပိုငး Android Application မ္ာ့ကိုေရ့သာ့သညး႕အခါတျငးမူ Reference

40 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Information Section မြ ကူညီေပ့ႏိုငးမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ အခ္ိနးရခဲံပါက Documentation ကို


ေသခ္ာစျာေလံလာၾကညး႕ၾကရနး အၾကဵေပ့လိုပါသညး၈

Android Samples
Android SDK ၏ Samples ဟူေသာ Folder အတျငး့တျငး နမူနာ Application ေ်ခာကးခုပါွငးၿပီ့ ထိုနမူနာ
Application မ္ာ့ကိုေလံလာေစႏိုငးပါသညး၈ ထိုနမူနာ Application မ္ာ့မြာေအာကးပါအတိုငး့်ဖစးပါသညး၈

 API Demos
 Hello, Activity!
 Lunar Lander
 Note Pad
 Skeleton App
 Snake

အဆိုပါ နမူနာ Application မ္ာ့ကို Google မြ်ပဳလုပးေပ့ထာ့်ခငး့်ဖစးၿပီ့ Android Application မ္ာ့ေရ့


သာ့ရာတျငး Idea ရရိြေစရနး ရညးရျယးပါသညး၈ နမူနာ Application တစးခုစီတျငး ကျဲ်ပာ့သညး႕ Android ၏
လုပးေဆာငးခ္ကးမ္ာ့ကို အသဵု့်ပဳ ်ပထာ့ပါသညး၈ ထို Application မ္ာ့ကို Eclipse တျငး ေမာငး့ႏြငးစမး့သပး
ၾကညး႕ႏိုငးပါသညး၈ ထိုစမး့သပးခ္ကးမြတစးခုကို ေအာကးတျငးေဖား်ပေပ့ထာ့ပါသညး၈

API Demos

API Demos Application သညး Host Application တစးခု်ဖစးၿပီ့ Activity တစးခုတညး့တျငး API
function မ္ာ့ကို သဵု့စျဲ်ခငး့စသညးတို႕ကို ရြငး့လငး့ေဖား်ပထာ့ပါသညး၈ Activity ဆိုသညးမြာ Android
Application တစးခုဟုသာအၾကမး့်ဖငး့နာ့လညးထာ့ရမညး်ဖစးၿပီ့ ထို Activity မ္ာ့အေၾကာငး့ကို ေနာကး
ပိုငး့ အခနး့မ္ာ့တျငး အေသ့စိပးရြငး့လငး့ေဖား်ပထာ့ပါသညး၈

ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအရ API Demos Application တျငး ေသ့ေကျ့ၿပီ့ကျဲ်ပာ့ေသာ Android


function မ္ာ့စျာကို ေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 41
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အဆိုပါ API Demos နမူနာ Application တျငး 3D image transistions၇ list and progress dialog
boxes ႏြငးံ finger-painting demo ကဲံသို႕ေသာ Application အခ္ိဳ႕ကိုလညး့ ထညး႕သျငး့ေပ့ထာ့သည
ကိုလညး့ေတျ႕ရပါသညး၈

Try This
(အိမးစာ) Run the API Demos Sample Application
Eclipse ကိုအသဵု့်ပဳ၍ API Demos ဟူေသာ Application ကို New Android Project အ်ဖစး Load ်ပဳ
လုပးၾကညး႕ပါမညး၈ ထိုသို႕်ပဳလုပးရနးအတျကး Eclipse ၏ File Menu မြ New ထိုမြ Project ကိုေရျ့ခ္ယးေပ့
ပါ၈ ထိုအခါ New Android Project Wizard ပျငးံလာသညးကိုေတျ႕ရမညး်ဖစးသညး၈ Wizard
တျငးပါွငးေသာ Option မ္ာ့ကိုနာ့လညးေနစရာမလိုေသ့ဘဲ Existing Source မြ Create Project
ကိုသာေရျ့ခ္ယးေပ့ရမညး်ဖစးသညး၈ ထို႕ေနာကး Browse ကိုႏိြပး၍ API Demo application ကို ေရျ့ခ္ယး
ေပ့ရပါမညး၈ Project ကို Load ်ပဳလုပးၿပီ့ေသာအခါတျငး Run ကိုေရျ့ခ္ယး၍ Android Emulator တျငး
ေမာငး့ႏြငး်ခငး့ကိုေတျ႕ရိြရမညး်ဖစးပါသညး၈ Application တိုငး့ကို ဖျငးံၾကညး႕ၿပီ့ Terminal ႏြငးံ API tool
မ္ာ့၏ လုပးေဆာငးခ္ကးမ္ာ့်ဖငးံ ရငး့ႏီြ့လာေစရနး ်ပဳလုပးေပ့သငးံပါသညး၈

42 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Hello, Activity!

ေအာကးတျငးေဖား်ပထာ့ေသာ Hello, Activity! ဟူေသာ Application သညး ရို့ရြငး့ေသာ Hello World!


ကဲံသို႕ေသာ Application မ္ိဳ့ပငး်ဖစးပါသညး၈ ဒီဇိုငး့ကိုလညး့ ရို့ရြငး့စျာေရ့ဆျဲထာ့ၿပီ့ ပထမဆဵု့အႀကိမးအ
်ဖစးApplication တစးခုကိုေရ့သာ့ရာတျငးအလျနးအသဵု့ွငးေစမညး်ဖစးသညး၈ ထိုကဲံသို႕ေသာ Hello World!
ကဲံသို႕ေသာApplication ကိုေနာကးလာမညး႕အခနး့ (၂) တျငးစတငးေရ့သာ့ၾကညး႕ရေတာံမညး်ဖစးပါသညး၈

Lunaer Lander

ေအာကးတျငးေဖား်ပထာ့ေသာ Lunar Landar application သညး Android Emulator (android Phone)


တျငးေဆာံကစာ့ႏိုငးေသာ ေသ့ငယးေသာ Game တစးခုပငး်ဖစးပါသညး၈ Luna Lander သညး 2D Game
မ္ာ့၏ Android ေပၚတျငးအလုပးလုပးေဆာငးပဵုကို ေဖား်ပေပ့ပါသညး၈ Control မ္ာ့သညးလညး့ ရို့ရြငး့ၿပီ့
ဂိမး့သညးလညး့အလျနးတရာရႈပးေထျ့မႈမရိြေသားလညး့ ၁ငး့၏အလုပးေဆာငးပဵုမ္ာ့အရ ၁ငး့သညး Game
မ္ာ့ကို စတငး Development ်ပဳလုပးလိုသူမ္ာ့အတျကး သငးံေတားပါသညး၈

မ္ကးပျငးံစာေပ 43
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Lunar Lander သညး UP, Down, Left ႏြငးံ Right ကဲံသို႕ေသာ ရို့ရြငး့ေသာ Control မ္ာ့ကိုသာ
အသဵု့်ပဳထာ့ပါသညး၈ ၁ငး့တျငး fluid graphic ႏြငးံဆကးစပးေသာ ်မငးကျငး့ကိုေဖား်ပေပ့ၿပီ့ ေပ့ထာ့ေသာ
Platform အတျကးခ္ီ့က္ဴ့ဖျယးရာပငး်ဖစးပါသညး၈ Collision Detection ကဲံသို႕ေသာ ရႈပးေထျ့ေသာ Game
သီအိုရီမ္ာ့ကိုလညး့ ရို့ရြငး့ေသာနညး့လမး့်ဖငးံ အသဵု့်ပဳထာ့ပါသညး၈ ယခုစာအုပးတျငး Android Platform
အတျကး Game မ္ာ့ေရ့သာ့်ခငး့ကို ေဖား်ပမညးမဟုတးေသားလညး့ အကယး၍စိတွ
း ငးစာ့ပါက ထို Lunar
Lander Application ကိုေလံလာၾကညး႕ေစလိုပါသညး၈ Android ၏ Game Development ကိစ
ု ိတွ
း ငးစာ့
ပါက ေနာကးပိုငး့ထျကးရိြလာမညး႕ Android Game Development အေၾကာငး့ေရ့သာ့ထာ့ေသာ စာအုပး
ကိုေလံလာႏိုငးမညး်ဖစးပါသညး၈

Notepad

ေအာကးတျငးေဖား်ပထာ့ေသာ Notepad Application သညး မြတးသာ့ထာ့ေသာ Note မ္ာ့ကို ဖျငးံရနး၇


တညးေဆာကးရနးႏြငးံ ်ပငးဆငးရနးအတျကး အသဵု့်ပဳေသာ Application တစးခု်ဖစးပါသညး၈ Notepad သညး
Word Editor ကဲံသို႕ Feature မ္ာ့စဵုလငးစျာပါွငးလာ်ခငး့မရိြေသားလညး့ Code အနညး့ငယးႏြငးံ
Application တစးခုကိုမညးကဲံသို႕တညးေဆာကးသညးဆိုေသာအခ္ကးကို ်ပသသ်ဖငးံ ေလံလာသငးံေသာ
Application တစးခုလညး့်ဖစးပါသညး၈

44 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Skeleton App
Skeleton App သညး Application Shell တစးခု်ဖစးၿပီ့ သာမနးအေ်ခခဵ Application ထကးပိုမိုအဆငးံ်မင
သာလျနးပါသညး၈ ၁ငး့တျငး Font မ္ာ့၇ Button မ္ာ့၇ Image မ္ာ့ႏြငးံ Form မ္ာ့ကဲံသို႕ေသာ ကျဲ်ပာ့သညး႕
Application Feature မ္ာ့ကိုအသဵု့်ပဳထာ့ပါသညး၈ အကယး၍ သူ႕အတိုငး့သာ ေမာငး့ႏြငးၾကညး႕မညးဆို
လြ္ငး မညးကဲံသို႕ Code မ္ာ့ေရ့သာ့ထာ့သညးဆိုေသာအခ္ကးကို လိုကးမီႏိုငးမညးမဟုတးပါ၈ ထို႕ေၾကာငးံ
skeleton App ၏ေရ့သာ့ပဵုကိုေလံလာ်ခငး့်ဖငးံ item တစးခုစီ၏အလုပးလုပးေဆာငးပဵုကို ေသခ္ာစျာ သိရိြ
ေစႏိုငးမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 45
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Snake
Android SDK တျငးပါွငးေသာ ေနာကးဆဵု့ demo application မြာ Snake ်ဖစးပါသညး၈ ထို Application
သညးေသ့ငယး၍ SNAFU style ်ဖစးေသာ ဂိမး့ဆစးခု်ဖစးၿပီ့ Lunar Lander ႏြငးံႏႈိငး့ယြဥးလြ္ငး ပိုမိုရို့ရြငး့
ပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုတျငး Emulator တျငး Snake ကိုေမာငး့နြငး်ခငး့်ဖငးံ ေတျ႕ရိြရမညး႕
ပဵုပငး်ဖစးပါသညး၈

နမူနာ Application တစးခုစီကို Eclipse တျငးဖျငးံၿပီ့ေနာကး Src ဟူေသာ Folder ကိုေတျ႕်မငးရမညး်ဖစ


ပါသညး၈ ထို SRC Folder သညး Application မ္ာ့အတျကး Source Code မ္ာ့တညးရိြေသာေနရာ်ဖစးၿပီ့
Application ၏ Code မ္ာ့ကို ၾကညး႕ရြဳရနး၇ ်ပငးဆငးရနးႏြငးံ Recompile ်ပဳလုပးရနး အသဵု့်ပဳႏိုငးပါသညး၈
အဆိုပါ Source Code မ္ာ့ကိုၾကညး႕ရြဳ်ခငး့်ဖငးံ Android Platform အတျကး အခ္ိဳ႕ေသာလြညး႕စာ့ခ္က
မ္ာ့၇ tips မ္ာ့ကို သငးယူႏိုငးမညး်ဖစးပါသညး၈

Android Tools
Andorid SDK သညး Developer မ္ာ့ကို အသဵု့ွငးေစေသာ Tool အမ္ာ့အ်ပာ့ကို ေထာကးပဵံေပ့ပါသညး၈
ယခုအပိုငး့တျငးထို Tool မ္ာ့အေၾကာငး့ကို အနညး့ငယးေလံလာၾကညး႕ရမညး်ဖစးပါသညး၈ ထို Tool မ္ာ့ထဲ
မြတစးခု်ဖစးေသာ Command-Line Development အေၾကာငး့ကိုလာမညး႕အခနး့တျငး အက္ယးတွငးံေလံ
လာရဦ့မညး်ဖစးပါသညး၈

46 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android SDK တျငးပါွငးေသာ အ်ခာ့ေသာ Tool မ္ာ့၏အခ္ကးအလကးမ္ာ့ကိုသိရိြလိုပါက Android


Documentation File မ္ာ့ကို ၾကညး႕ရြဳေလံလာႏိုငးပါသညး၈

Emulator.exe

မညးသို႕ပငးဆိုေစကာမူ Android SDK တျငးပါွငးေသာ အေရ့အႀကီ့ဆဵု့ Tool တစးခုမြာ emulator.exe


ပငး်ဖစးပါသညး၈ emulator.exe သညး Android Emulator ကိုဖျငးံေပ့ေစပါသညး၈ Android Emulator ကို
pseudo-Android Environment အတျငး့တျငး Android Application မ္ာ့ကိုေမာငး့ႏြငးေပ့ေစႏိုငးပါသညး၈
ထို႕ေၾကာငးံ Android အသဵု့်ပဳသညး႕ Mobile Device အစစးအမြနးမလိုပဲ ေရ့သာ့ထာ့ေသာ Application
မ္ာ့ကို Android Emulatorအတျငး့တျငးေမာငး့ႏြငးၾကညး႕ေစႏိုငးပါသညး၈ ထိe
ု mulator.exe ကို Command
Line မြေသားလညး့ေကာငး့ Eclipse အတျငး့မြလညး့ေကာငး့ ေမာငး့ႏြငးအသဵု့်ပဳေစႏိုငးပါသညး၈

ယခုစာအုပးတျငး Eclipse အတျငး့မြ Android Emulator Environment ကိုသာအသာ့ေပ့အသဵု့်ပဳေဖား်ပ


ထာ့ေသားလညး့ Eclipse ်ပငးပမြ Android SDK ကိုအသဵု့်ပဳရနးအတျကး အသဵု့်ပဳရမညး႕ Command Line
အေ်ခ်ပဳ၍ emulator.exe ကိုအသဵု့်ပဳရပဵုကို အခနး့ (၃)တျငးေဖား်ပထာ့ပါသညး၈ Android Emulatorကို
အသဵု့်ပဳ၍ Application တစးခုကိုစမး့သပးရနးအတျကး User Interface ကို Navigate ်ပဳလုပးရနးအတျကး
နညး့လမး့ႏြစးခုရိြပါသညး၈ ပထမတစးခုမြာ ေအာကးေဖား်ပပါပဵုတျငးေဖား်ပထာ့သညး႕အတိုငး့ Emulator ႏြငးံ
အတူတကျပါွငးေသာ ခလုတးမ္ာ့ကိုအသဵု့်ပဳရနး်ဖစးပါသညး၈ Android ကို navigate ်ပဳလုပးရနးႏြငးံ
ေရ့သာ့ထာ့ေသာ မညးသညး႕ Application ကိုမဆို အသဵု်ပဳရနးအတျကး အဆိုပါခလုတးမ္ာ့ကိုအသဵု့်ပဳႏိုင
ပါသညး၈ သတိ်ပဳရမညး႕အခ္ကးတစးခုမြာ Powerအဖျငးံအပိတး၇ အသဵအတို့အခ္ဲ႕ခလုတးမ္ာ့သညး ေအာကး
တျငးေဖား်ပထာ့ေသာ Device ၏အစျနး့မ္ာ့ႏြငးံအနညး့ငယးဖုနး့ကျယးထာ့ပါသညး၈ ထိုခလုတးမ္ာ့က
အသဵု့်ပဳရနးအတျကး Mouse တျငးပါွငးေသာ Scroll Wheel ကိုလြညး႕ပတး၍ ေအာငး်မငးစျာအသဵု့်ပဳႏိုငးပါ
သညး၈

မ္ကးပျငးံစာေပ 47
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးပိုငး့ထျကးဖုနး့မ္ာ့တျငး Touch Screen စနစးပါလာတတးပါသညး၈ ဒုတိယနညး့လမး့မြာ Emulator


ကို Touch Screen ်ဖငးံအသဵု့်ပဳရနး်ဖစးပါသညး၈ ထို Touch Screen ကို Mouse ်ဖငးံအသဵု့်ပဳႏိုငးပါသညး၈
ထို႕ေၾကာငးံ Emulator ၏ Screen ကို Mouse ကိုအသဵု့်ပဳ၍ Touch Screen ကဲံသို႕အသဵု့်ပဳႏိုငးပါသညး၈

adb.exe

Command-line ကိုအသဵု့်ပဳ၍ Programming ေရ့သာ့ေသာအခါ အလျနးအသဵု့ွငးေသာ Tool ေနာကး


တစးခုမြာ Android Debug Bridge သို႕မဟုတး adb (adb.exe) ပငး်ဖစးပါသညး၈ အဆိုပါ Tool သညး
Emulator.exe Tool ကို Command ်ဖငးံခိုငး့ေစႏိုငးေစပါသညး၈ Comman-Line Environment ကိုအသဵု့
်ပဳေသာအခါ adb tool သညးေအာကးေဖား်ပပါလုပးေဆာငးခ္ကးမ္ာ့မြာ
48 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

 Server ကိုစတငး၇ ရပးတနး႕ေစႏိုငး်ခငး့


 Application မ္ာ့ကို Install ႏြငးံ Uninstall ်ပဳလုပးေစႏိုငး်ခငး့
 ဖိုငးမ္ာ့ကို Emulator မြ သို႕မဟုတး Emulator သို႕ ေရႊ႕ေ်ပာငး့ေစႏိုငး်ခငး့ စသညးတို႕်ဖစးပါသညး၈

MKSDCARD.exe

အကယး၍ SD Memory Card ကို Mobile Device အတျငး့သို႕ထညး႕သျငး့၍ file မ္ာ့ Read သို႕မဟုတး
Write ်ပဳလုပးရနးလိုအပးေသာ Application တစးခုခုကိုစမး့သပးရနးလိုအပးခဲံပါက MKSDCARD.exe သညး
အလျနးအသဵု့ွငးေသာ Tool တစးခုအ်ဖစး လုပးေဆာငးေပ့ပါသညး၈ MKSDCARD.exe သညး Partation
အေသ့တစးခုကိုဖနးတီ့ေပ့ၿပီ့ file မ္ာ့ကိုစမး့သပး သိမး့ဆညး့ရနးလိုအပးသညး႕အခါ ထို Partation ကို
Emulator မြ SD Memory Card ကဲံသို႕ထငး်မငးေအာငး ်ပဳလုပးေပ့ႏိုငးပါသညး၈

DX.exe

DX.exe သညး Android SDK ၏ Compiler တစးခု်ဖစးပါသညး၈ ေရ့သာ့ထာ့ေသာ Java File မ္ာ့ကို
ေမာငး့ႏြငးေသာအခါ DX.exe သညး Dalvik executable format ်ဖစးေသာ .dex extension ဖိုငးမ္ာ့ကို
တညးေဆာကးေပ့ႏိုငးပါသညး၈ ထိုဖုိငးမ္ာ့သညး Android Device မြ ေမာငး့ႏြငးႏိုငး၇ နာ့လညးႏိုငးေသာ
မြနးကနးသညး႕ Format လညး့်ဖစးပါသညး၈ Android မြေမာငး့ႏြငးႏိုငးေသာ ဖိုငးမ္ာ့ကို Dalvik executable
file မ္ာ့ဟုေခၚၿပီ့ ၁ငး့ဖိုငးမ္ာ့သညး Android မြအသဵု့်ပဳၿပီ့အာ့လဵု့ေသာ Application မ္ာ့ကို အသဵု့်ပဳႏိုငး
ေစသညး႕ Dalvik virtual mahine သို႕်ပဳလုပးသညး႕ Reference တစးခုသဖျယးအ်ဖစးလညး့ လုပးေဆာငး
ေစပါသညး၈

activityCreator(.bat or .pn)

ActivityCreator ဆိုသညးမြာ ရို့ရြငး့ေသာ Command Line Tool တစးခု်ဖစးၿပီ့အေ်ခခဵ Development


Environment တစးခုကို Setup ်ပဳလုပးသညး႕အခါတျငးအသဵု့်ပဳႏိုငးပါသညး၈ Command Line မြ ေမာငး့ႏြငး
ေသာအခါတျငး activityCreator သညး အေ်ခခဵက္ေသာ Android Application မ္ာ့ တညးေဆာကးရာတျင
လိုအပးေသာ Shell file မ္ာ့ကို Setup ်ပဳလုပးေပ့နိုငးပါသညး၈ အဆိုပါ shell ဖိုငးမ္ာ့ရိြ်ခငး့သညး အကယး၍
Eclipse ကိုအသဵု့မ်ပဳပါက အလျနးအသဵု့ွငးေစပါသညး၈ Eclispe အတျကးအသဵု့်ပဳရသညး႕ Android

မ္ကးပျငးံစာေပ 49
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Plugin မြ အဆိုပါ shell file မ္ာ့ကို Setup ်ပဳလုပးေပ့ၿပီ့ Project အသစးတစးခုတညးေဆာကးသညး႕အခါ


activityCreator မြ ေခၚယူေပ့ပါသညး၈ ေမာငး့ႏြငးေသာ Environment ေပၚတျငးမူတညးကာ activity
Creator သညးလညး့ Script ဖိုငးအမ္ိဳ့အစာ့မ္ာ့ကျဲ်ပာ့ႏိုငးပါသညး၈ ထို ဖိုငးသညး .bat ဖိုငးသို႕မဟုတး
python အေ်ခ်ပဳ (.pn) script ်ဖစးေလံရိြပါသညး၈ အဆိုပါ script ကိုအသဵု့်ပဳရနးအတျကး မြနးကနးေသာ
parameter မ္ာ့်ဖငးံ activityCreator ကိုေခၚယူအသဵု့်ပဳရမညး်ဖစးပါသညး၈

APIs
API သို႕မဟုတး Application Programming interface မ္ာ့သညးAndroid SDK ၏ Core ပငး်ဖစးပါသညး၈
API တစးခုသညး function မ္ာ့၇ Method မ္ာ့၇ Properties မ္ာ့၇ Class မ္ာ့ႏြငးံ Library တို႕၏ အစုအေွ့
်ဖစးၿပီ့ သတးမြတးထာ့ေသာ Platform မ္ာ့ေပၚတျငး အလုပးလုပးေဆာငးႏိုငးေသာ Program မ္ာ့ေရ့ဆျဲရနး
အတျကး Application Developer မ္ာ့အတျကး အသဵု့်ပဳရသညး႕ ဖိုငးမ္ာ့လညး့်ဖစးပါသညး၈ Android API
တျငး သတးမြတးထာ့ေသာ အခ္ကးအလကးမ္ာ့အာ့လဵု့ပါွငးၿပီ့ Application မ္ာ့တညးေဆာကး၍ Android
အေ်ခ်ပဳ Application မ္ာ့အ်ဖစး လုပးေဆာငးႏိုငးေစပါသညး၈ Android SDK တျငး API ႏြစးမ္ိဳ့ႏြစးစာ့ကို
ေထာကးပဵံေပ့ထာ့ၿပီ့ ၁ငး့တို႕မြာ Google API မ္ာ့ႏြငးံ Optional API မ္ာ့ ်ဖစးသညး၈ ေနာကးပိုငး့တျငး ၁ငး့
အေၾကာငး့အရာမ္ာ့ကို ပိုမိုအေသ့စိပးေလံလာရမညး်ဖစးၿပီ့ ယခုအခနး့တျငးမူ အၾကမး့်ဖငး့သာေလံလာ
ၾကညး႕ၾကပါမညး၈

Google APIs

Google APIမ္ာ့သညး Android SDK ထဲတျငးပါွငးၿပီ့ အဆိုပါ API မ္ာ့တျငး နဂိုရိြၿပီ့သာ့်ဖစးေသာ


Google Service မ္ာ့ကို Application မ္ာ့ေရ့သာ့ရာတျငး ထညး႕သျငး့အသဵု့်ပဳႏိုငးေသာ Programming
Reference မ္ာ့ပါွငးပါသညး၈ အကယး၍ Android Application မ္ာ့ေရ့သာ့ရာတျငး Google Service
မ္ာ့ကို ယူငငးသဵု့စျဲလိုပါက Google API မ္ာ့ပါရိြရနးလိုအပးပါသညး၈ Android.jar ဖိုငးထဲတျငးရိြၿပီ့ Google
API မ္ာ့ကို com.google.* ဟူေသာ package အတျငး့တျငးထညး႕သျငး့ထာ့ပါသညး၈ Google API ၏
အခ္ိဳ႕ေသာ package မ္ာ့သညး Graphic မ္ာ့၇ Portablity၇ Contact မ္ာ့ႏြငးံ Canlendar Utility မ္ာ့ ႏြငးံ
သကးဆိုငးေသားလညး့ ယခုစာအုပးတျငးမူ Google Map ပါွငးေသာ API မ္ာ့ကိုသာအသာ့ေပ့ေဖား်ပသျာ့
ပါမညး၈ Google Map ႏြငးံသကးဆိုငးေသာ အခ္ကးအလကးမ္ာ့ပါရိြသညး႕ com.google.android.maps

50 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ဟူေသာ package ကိုအသဵု့်ပဳ၍ Google Map ၏ Interface ကိုယူကာ Application မ္ာ့တညးေဆာက


ႏိုငးပါသညး၈

Google API တျငး Prtocol အသစး်ဖစးေသာ Extensible Messaging and Presence Protocol (XMPP)
ကိုယူသဵု့ႏိုငးေစမညး႕ အသဵု့ွငးသညး႕ Package မ္ာ့လညး့ ပါွငးပါေသ့သညး၈ အဆိုပါ XMPP ကုိ Jabber
Open Source Community မြ Develop ်ပဳလုပးထာ့်ခငး့်ဖစးပါသညး၈ XMPP ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ
အ်ခာ့ေသာအသဵု့်ပဳသူမ္ာ့ကိုေတျ႕်မငးရေစၿပီ့ Message ႏြငးံ Communication တို႕ကိုလညး့ လုပးေဆာငး
ချငးံေပ့ထာ့ပါသညး၈ XMPP ႏြငးံသကးဆိုငးေသာ API package မ္ာ့သညး အကယး၍ Chat လုပး်ခငး့ကဲံသို႕
ေသာ Application မ္ာ့ေရ့ဆျဲသညး႕အခါတျငး အလျနးအသဵု့ွငးေစပါသညး၈

Optinal APIs

Android SDK တျငး Standard Android API မ္ာ့အ်ဖစးသတးမြတးထာ့်ခငး့မရိြေသာ Optional API


မ္ာ့သညးအမ္ာ့အ်ပာ့ပါွငးပါသညး၈ ထို Optional API မ္ာ့သညး Optional အ်ဖစးသတးမြတးရ်ခငး့မြာ
Handset တိုငး့တျငးအဆိုပါလုပးေဆာငးခ္ကးမ္ာ့ ပါွငးခ္ငးမြ ပါွငး၍်ဖစးသညး၈ အခ္ိဳ႕ေသာ Android
Device မ္ာ့တျငး Upgrade ်ပဳလုပး်ခငး့ကဲံသုိ႕ေသာ feature မ္ာ့ပါွငးတတးေသားလညး့ အခ္ိဳ႕တျငးမပါွငး
ရ်ခငး့မြာ Optinal API မ္ာ့ေၾကာငးံ်ဖစးပါသညး၈ Optional API ၏ထငးရြာ့ေသာ ဥပမာတစးခုမြာ Cell
Phone အေ်ခ်ပဳ GPS ပငး်ဖစးသညး၈ Android LBS (Location-Based Services) API သညး Device ၏
GPS Unit မြ အခ္ကးအလကးမ္ာ့ကို ေပ့ပို႕ရယူႏိုငးေသာ Function မ္ာ့ပါရိြပါသညး၈ (အဆိုပါ Android
LBS API မြ အခ္ကးအလကးမ္ာ့ကို Google Maps API ႏြငးံေပါငး့စပး်ခငး့်ဖငးံ မညးသညး႕ေနရာသို႕ေရာက
ရိြေနသညးကိုေဖား်ပေပ့ႏိုငးသညး႕ အလျနးအသဵု့ွငးေသာ Application တစးခုကိုရရိြႏိုငးပါသညး၈ အ်ခာ့
ေသာ Option API မ္ာ့မြာ Bluetooth ်ဖငးံသကးဆိုငးေသာ API မ္ာ့၇ Wifi ႏြငးံပတးသကးေသာ API မ္ာ့၇
MP3 သီခ္ငး့မ္ာ့နာ့ေထာငး်ခငး့ႏြငးံသကးဆိုငးေသာ API မ္ာ့ႏြငးံ 3D-OpenGL-enable Hardware ်ဖငးံ
သကးဆိုငးေသာ API မ္ာ့်ဖစးသညးဟု သတးမြတးႏိုငးပါသညး၈

Application Life Cycle


အကယး၍ Application development ႏြငးံသကးဆိုငးေသာအေၾကာငး့အရာမ္ာ့ကို ရိပးဖမး့သဵဖမး့မြ္ သိရိြ
ခဲံပါက Android Life Cycle ဆိုေသာအေၾကာငး့အရာကို ၾကာ့ဖူ့နာ့ွ ရိြမညး်ဖစးသညး၈ Application Life
မ္ကးပျငးံစာေပ 51
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Cycle တစးခုတျငး Execution မြ Termination သို႕ follow လုပးႏိုငးေသာ Application Processes မ္ာ့၏
အဆငးံမ္ာ့ပငး်ဖစးပါညး၈ Application တိုငး့ (မညးသညး႕ Language ်ဖငးံေရ့သာ့သညး်ဖစးေစ) တျငး ၁ငး့
ႏြငးံသကးဆိုငးေသာ Life Cycle မ္ာ့ရိြၾကၿပီ့ Android Application မ္ာ့သညးလညး့ ထို႕အတူပငး်ဖစးပါ
သညး၈ ယခုအပိုငး့တျငး Android Application မ္ာ့၏ Life Cycle ်ဖငးံႏိႈငး့ယြဥးေလံလာႏိုငးရနးအတျကး ASP
application မ္ာ့၏ life cycle ်ဖငးံယြဥးတျဲေလံလာၾကညး႕ၾကပါမညး၈

Standard ASP Application Life Cycle


ြStandard ASP Application တစးခု၏ Life Cycle သညး Android Application ၏ Life Cycle ႏြငးံႏိႈငး့
ယြဥးေစရနး လဵုေလာကးပါသညး၈ ASP Application မ္ာ့တျငး Lauch ်ပဳလုပး်ခငး့မြ disposal ်ဖစးသညးအထ
အဆငးံငါ့ဆငးံရိြပါသညး၈ အဆိုပါ အဆငးံမ္ာ့သညး ASP Application အာ့လဵု့ႏြငးံ သကးဆိုငးပါသညး၈ ယငး့
တို႕မြာ

1. Application_Start
2. Event
3. HTTPApplication.Init
4. Disposal
5. Application_End တို႕်ဖစးပါသညး၈

(အခ္ိဳ႕ေသာ ASP Reference မ္ာ့က Disposal ႏြငးံ Application_End တို႕ကို တစးဆငံးတညး့အေန်ဖင


သတးမြတးပါသညး၈ သို႕ရာတျငး Disposal ကို Application_End မတိုငးမီတျငး ေရြ့ဦ့စျာေခၚဆိုရပါသညး၈
ထိုမြသာ Application ၏ သတးမြတးထာ့ေသာ လုပးေဆာငးခ္ကးမ္ာ့ကို Application မၿပီ့ဆဵု့မီတျငး
လုပးေဆာငးႏိုငးမညး်ဖစးသညး)

Server မြ Application ကို Request လုပးေသာအခါတျငA


း pplication_Start ကိုစတငးေခၚယူမညး်ဖစးၿပီ့
ထိုမြ Event ဟူေသာလုပးေဆာငးခ္ကးမ္ာ့ကို ဦ့တညးေစသညး၈ သကးဆိုငးရာ Application module မ္ာ့
အာ့လဵု့ကို Load ်ပဳလုပးေစေသာအခါတျငး HTTPApplication.Init ကိုေခၚယူပါသညး၈ Application မြ၁ငး့
၏ Event မ္ာ့ကိုလုပးေဆာငးၿပီ့ User မြ Application ကိုပိတးေသာအခါတျငး Dispose ကို ေခၚယူပါသညး၈
ထို႕ေနာကး Dispose မြ Application_End ဟူေသာ Process ကိုတစးဆကးတညး့ေခၚယူ၍ Application
52 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ကိုပိတးေစပါသညး၈ အထကးပါအေၾကာငး့အရာမ္ာ့သညး Standard Application Life Cycle တစးခုကို


ေဖား်ပထာ့်ခငး့လညး့ ်ဖစးပါသညး၈ Application အမ္ာ့စုသညးအထကးပါ Life Cycle ၏ လုပးေဆာငးခ္က
မ္ာ့်ဖစးေသာ တညးေဆာကး်ခငး့၇ ကူ့တငး်ခငး့၇ Event မ္ာ့ေဆာငးရျကး်ခငး့ႏြငးံ အဆဵု့သတး်ခငး့စသညးတို႕
ကိုအစဥးတစိုကး လိုကးနာလုပးေဆာငးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ခ္ကးမ္ာ့သညး Android
Application Life Cycle တစးခု၏ လုပးေဆာငးပဵုကို ေဖား်ပထာ့်ခငး့်ဖစးၿပီ့ အထကးတျငးေဖား်ပထာ့သညး႕
Standard Application တစးခု၏ Life Cycle ်ဖငးံႏိႈငး့ယြဥးေလံလာႏိုငးရနး ေဖား်ပေပ့ထာ့ပါသညး၈

Android Application Life Cycle


Android Application Life Cycle သညး အ်ခာ့ေသာ Application မ္ာ့၏ Life cycle ႏြငးံ စနစးထိနး့ခ္ဳပးမႈ
မ္ာ့မတူညီပါ၈ အာ့လဵု့ေသာ Android Application မ္ာ့ သို႕မဟုတး Activity မ္ာ့သညး ကိုယးပိုငး
Process မ္ာ့ေပၚတျငးသာေမာငး့ႏြငးသကးွငးေစပါသညး၈ မညးသညး႕ Activity ကေမာငး့နြငးေနသညးဆ
်ခငး့ကိုလိုကး၍ (ေနာကးကျယးတျငး်ဖစးေစ၇ ေရြ႕တျငး်ဖစးေစ) Android မြ ေမာငး့ႏြငးထာ့ေသာ Process မ္ာ့
ကိုေစာငးံၾကညး႕ေပ့ပါသညး၈ Android သညးပိတးရနးလိုအပးေသာ Activity မ္ာ့ကိုေရျ့ခ္ယးေပ့ႏိုငးေစပါ
သညး၈ Android သညး user input၇ Memory Usage ႏြငးံ Processing time မ္ာ့အရ မညးသညး႕ Activity
ကိုပိတးရနးလိုအပးသညးကို ဆဵု့်ဖတးပါသညး၈Android တျငးပါွငးေသာ Android Activity တစးခု၏ Life
Cycle အဆငးံမ္ာ့မြာ

1. onCreate
2. onStart
3. Process-specific events (ဥပမာ- Activity အမ္ာ့အ်ပာ့ကို launch လုပး်ခငး့ႏြငးံ database
တစးခုသို႕ွငးေရာကး်ခငး့)
4. onStop
5. onDestroy တို႕်ဖစးပါသညး၈

အ်ခာ့ေသာ Application မ္ာ့၏ Life Cycle အတိုငး့ပငး Android Application တစးခုကိုတညးေဆာကးၿပီ့


လုပးေဆာငးခ္ကးမ္ာ့စတငးသညး၇ Event မ္ာ့ကိုလုပးေဆာငးသညး၇ Process မ္ာ့ကိုရပးတနး႕ၿပီ့

မ္ကးပျငးံစာေပ 53
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Application ကိုအဆဵု့သတးသညး၈ ကျဲ်ပာ့်ခာ့နာ့မႈအနညး့ငယးရိြႏိုငးေသားလညး့ အလျနးတရာကျဲ်ပာ့မႈ


မရိြေသာေၾကာငးံ Developer မ္ာ့ကို အလျနးခကးခဲေစမညးမဟုတးပါ၈

54 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 5
Application: Hello World!

မ္ကးပျငးံစာေပ 55
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Creating new Android projects
- Working with Views
- Using a TextView
- Modifying he main.xml file
- Rnning applications on the Android Emulator

ယခုအခနး့တျငးပထမဦ့ဆဵု့ Android Activity တစးခုကို တညးေဆာကးၾကညး႕ၾကပါမညး၈ ယခုအခနး့ပါ


အေၾကာငး့အရာမ္ာ့သညး Application တညးေဆာကး်ခငး့လုပးငနး့စဥးမ္ာ့ကို အစမြအဆဵု့အထိ ရြငး့်ပေပ့
ထာ့ပါသညး၈ ထို႕ေၾကာငးံ Eclipse အတျငး့တျငး Android project တစးခုတညးေဆာကး်ခငး့၇ initial files
မ္ာ့အတျငး့ Code မ္ာ့ထညး႕သျငး့်ခငး့၇ ်ပဳလုပးၿပီ့ေသာ Application မ္ာ့ကို Android Emulator အတျငး့
တျငးေမာငး့ႏြငးၾကညး႕်ခငး့မ္ာ့ကိုေတျ႕်မငးၾကရမညး်ဖစးပါသညး၈ ထို႕ေနာကးထျကးေပၚလာေသာ Application
သညးအ်ပစးအနာအဆာမရိြေသာအဆငးံ်ဖငးံ Android Environment တျငးေမာငး့ႏြငးႏိုငးသညး အထိ
်ပဳလုပးၾကညး႕ၾကရမညး်ဖစးပါသညး၈
သို႕ေသားအမြနးတကယးအာ့်ဖငးံ ယခုအခနး့တျငး တစးခုထကးမကေသာ Android Acitivity မ္ာ့ကို တညး
ေဆာကးၾကညး႕ၾကရမညး်ဖစးပါသညး၈ အ်ခာ့ေသာ Computer Programming မ္ာ့၏ ထဵု့စဵအတိုငး့ပငး
Hello World! ဟူေသာ Application ်ဖငးံစတငးေလံလာၾကညး႕ရမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ဦ့စျာ
Backgroud မပါေသာမ္ကးႏြာ်ပငးအတျငး့ Hello World! ဟူေသာ စာသာ့ေပၚလာေစရနး စတငးလုပး
ေဆာငးၾကညး႕ၾကရမညး်ဖစးပါသညး၈ ထို႕ေနာကးလာမညး႕အပိုငး့တျငး Hello World! ဟူေသာ Application
တညးေဆာကးသညး႕အတျကး Anroid မြ အလိုအေလြ္ာကးဖနးတီ့ေပ့လိုကးေသာ ဖိုငးမ္ာ့အေၾကာငး့ကို ေလံ
လာရမညး်ဖစးပါသညး၈ ထို Activity ကိုပငး (Hello World! Activity) နညး့လမး့ႏြစးမ္ိဳ့အသဵု့်ပဳ၍ Screen
ေပၚတျငးေပၚလာေစရနး လုပးေဆာငးခ္ကးမ္ာ့ကိုေလံလာရေစပါမညး၈ ထိုမြ္သာမက Hello World!
Message ကိုပငး Image တစးခုထညး႕သျငး့ေဖား်ပမညး႕ Application ကိုလညး့ ေရ့သာ့ၾကညး႕ၾကပါမညး၈
ထိုသို႕ေရ့သာ့ၾကညး႕်ခငး့်ဖငးံ Android ၏ေနာကးကျယးမြ အလုပးလုပးေဆာငးပုဵႏြငးံ ထိနး့ခ္ဳပးပဵုတို႕ကို
ေကာငး့စျာသိရိြနာ့လညးလာေစမညး်ဖစးပါသညး၈

56 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခုအခနး့တျငး တစးေနရာတျငး Application ဟုသဵု့ႏႈနး့ၿပီ့ ေနာကးတစးေနရာတျငး Activity ဟုသဵု့ႏႈနး့ထာ့


သညးကို သတိ်ပဳမညးဟုထငးပါသညး၈ ထိုနြစးခု၏ကျာ်ခာ့ခ္ကးမြာ Application တစးခုတျငး Acitivity ေပါငး့
မ္ာ့စျာ်ဖငးံ ဖျဲ႕စညး့ထာ့သကဲံသို႕ အနညး့ဆဵု့ Application တစးခုတျငး Activity တစးခုေတာံ ရိြမညး
်ဖစးသညး၈ Application တစးခုအတျငး့မြ Window တစးခုစီ သို႕မဟုတး Screen တစးခုစီကို Activity တစးခု
ဟု သတးမြတးႏိုငးပါသညး၈ ထို႕ေၾကာငးံ အကယး၍ Screen တစးခုတညး့သာပါွငးသညး႕ (ဥပမာ- Hello
World! ကဲံသို႕ေသာ Application) ရို့ရြငး့ေသာ Application တစးခက
ု ိုတညးေဆာကးသညး႕အခါတျင
အဆိုပါ Application တျငး Activity တစးခုတညး့သာလြ္ငး ပါရိြသညးဟုသတးမြတးႏိုငးမညး်ဖစးပါသညး၈
ေနာကးပိုငး့အခနး့မ္ာ့တျငး တစးခုထကးပိုမိုေသာ Acitivity မ္ာ့ပါွငးသညး႕ Application မ္ာ့ကိုေရ့သာ့
ရမညး်ဖစးပါသညး၈
ယခုအခနး့ပါ အေၾကာငး့အရာမ္ာ့ကို ေလံလာၿပီ့ေနာကး အခနး့ (၃) တျငး အဆိုပါ Hello World!
Application ကိုပငး Android SDK Command-line Environment တျငး Windows ႏြငLးံ inux ႏြစးမ္ိဳ့စလဵု့
အတျကး Application မ္ာ့ေရ့သာ့ပဵုကိုေလံလာရဦ့မညး်ဖစးပါသညး၈ ေနာကးတစးနညး့ဆိုရလြ္င
Application တစးခုကိုေရ့သာ့ရနးအတျကး ယခုအခနး့တျငး Eclipse ကိုအသာ့ေပ့ေလံလာရမညး်ဖစးၿပီ့
အခနး့ (၃) တျငး Command-line Tool မ္ာ့ကိုအသဵု့်ပဳ၍ Application ေရ့သာ့ပဵုကိုေလံလာရမညး်ဖစးပါ
သညး၈ ထို႕ေၾကာငးံ ေရြ႕ဆကးေလံလာမႈမ္ာ့မ်ပဳလုပးမီတျငး Eclipse အသဵု့်ပဳ်ခငး့ကို ေၾက်ငကးစျာေလံလာ
ထာ့သငးံပါသညး၈ ေရြ႕လာမညး႕လုပးေဆာငးခ္ကးမ္ာ့ မစတငးမီတျငး အခနး့ (၀)တျငးေဖား်ပထာ့ခဲံၿပီ့်ဖစ
ေသာ Android SDK အတျကး PATH statement ကို Setup ်ပဳလုပးထာ့ရနးလိုအပးသကဲံသို႕ PATH
statement တျငးလညး့ JRE ရိြသညး႕လမး့ေၾကာငး့ကို Configure ်ပဳလုပးေပ့ရနး အေရ့ႀကီ့ပါသညး၈

Creating Your First Android Project in Eclipse

ထို႕ေနာကး ပထမဆဵု့အ်ဖစး Android Project တစးခုကို စတငးရနးအတျကး Eclipse ကိုဖျငးံပါ၈ ပထမဆဵု့


အႀကိမးအ်ဖစး ပျငးံလာေသာအခါတျငး ေအာကးတျငးေတျ႕်မငးရသညး႕ပဵုအတိုငး့ စတငးလာမညး်ဖစးသညး၈
ပထမဆဵု့်ပဳလုပးရမညး႕အလုပးမြာ ေရ့သာ့မညး႕ Application အတျကး Workspace ၏အမညးကို ေၾက်ငာ
သတးမြတးေပ့ရနး်ဖစးသညး၈ ထို႕ေၾကာငးံ File>New>Android Project သို႕အဆငးံဆငးံသျာ့ေရာကးရမည
်ဖစးၿပီ့ New Android Project Wizard ေပၚလာသညးကို ေတျ႕်မငးရမညး်ဖစးသညး၈ သတိ်ပဳရမညး႕အခ္က

မ္ကးပျငးံစာေပ 57
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

မြာ New Menu မြ Java Project ကိုမေရျ့ခ္ယးမိရနး်ဖစးသညး၈ Android Application မ္ာ့ကို ေရ့သာ့ရာ
တျငး Java ကိုအသဵု့်ပဳရ်ခငး့်ဖစးေသားလညး့ ထိုကဲံသို႕ Java Project ကိုေရျ့ခ္ယးမိ်ခငး့်ဖငးံ Standard
Java Application တစးခုကိုစတငးေစမညး်ဖစးေသာေၾကာငးံပငး်ဖစးသညး၈ ထို႕ေၾကာငးံ Android Project ကို
သာေရျ့ခ္ယးပါမြ Android ်ဖငးံသကးဆိုငးေသာ Application မ္ာ့ကိုေရ့သာ့ႏိုငးမညး်ဖစးသညး၈
အကယး၍ Android Project ဟူေသာ Option ကုိသာမ်မငးေတျ႕ခဲံရပါက Eclipse အတျကးလိုအပးေသာ
Android Plugin ကို ်ပညး႕စဵုစျာ Install မ်ပဳလုပးထာ့၍ ်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ထိုအခ္ကးကုိ ေ်ဖရြငး့
ႏိုငးရနးအတျကး Android Plugin ကို Install ်ပဳလုပးရနး လိုအပးမညး်ဖစးပါသညး၈
အထကးတျငးေရျ့ခ္ယးလိုကးေသာ New Android Project Wizard တျငး လုပးေဆာငးခ္ကးအရာႏြစးခုက
်ပဳလုပးေပ့မညး်ဖစးသညး၈
- Android.jar ဟူေသာ ဖိုငးကိုအသဵု့်ပဳ်ခငး့်ဖငးံ Android SDK ်ဖငးံသကးဆိုငးေသာ shell
application တစးခုကို ဖနးတီ့မညး်ဖစးၿပီ့ အဆိုပါ application သညး Android Emulator ႏြငးံ
သကးဆိုငးေသာ project လညး့်ဖစးပါသညး၈ ၁ငး့သညး အာ့လဵု့ေသာ Android Library မ္ာ့ႏြငးံ
Package မ္ာ့ကို အသဵု့်ပဳ၍ Code ေရ့သာ့ချငးံရိြမညး်ဖစးၿပီ့ Proper Environment တျငး
ေရ့သာ့ထာ့ေသာ Application မ္ာ့ကို Debug လညး့ ်ပဳလုပးေစႏိင
ု းမညး်ဖစးပါသညး၈

58 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

- ်ပဳလုပးမညး႕ Project အသစးအတျကး Shell File မ္ာ့်ဖငးံ စတငးရနး်ဖစးသညး၈ အဆိုပါ Shell ဖိုငး
မ္ာ့တျငး တညးေဆာကးလိုကးေသာ Program မ္ာ့ေပၚမူတညးကာ vital application application
အခ္ိဳ႕ပါွငးလာမညး်ဖစးသညး၈ Visual Studio အတျငး့ Microsoft.Net application ေရ့သာ့ရာ
တျငး Windows မြ file မ္ာ့အတျငး့ Program Code ဖနးတီ့သကဲံသို႕ပငး Android Project
Wizard ကိုအသဵု့်ပဳ၍ Eclipse သညး ကနဦ့ Program file မ္ာ့ႏြငးံ Android Code အခ္ိဳ႕ကို
ထုတးေပ့မညး်ဖစးသညး၈

ထပးေလာငး့ေ်ပာဆိုရလြ္ငး New Android Project Wizard တျငး Option အမ္ာ့အ်ပာ့ပါွငးၿပီ့ Andriod


Project တစးခု်ပဳလုပးတညးေဆာကးရာတျငး လိုအပးသညး႕လုပးေဆာငးဖျယးရာမ္ာ့က
ေဖား်ပေပ့သျာ့မညး်ဖစးသညး၈

Project Name ဟူေသာအကျကးတျငး ဥပမာအာ့်ဖငးံ ယခုအသဵု့်ပဳမညး႕ HelloWorldText ဟူေသာ


အမညးကို အသဵု့်ပဳသငးံပါသညး၈ ၁ငး့အမညးသညး အ်ခာ့မြ Hello World! ဟူေသာ Project ႏြငးံ ယခုတညး
ေဆာကးမညး႕ Project ်ဖငးံတူညီမႈမရိြေၾကာငး့ သတိထာ့မိေစမညး်ဖစးသညး၈
မ္ကးပျငးံစာေပ 59
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Contents Area တျငး နဂိုမူလအတိုငး့ပါွငးသညး႕အတိုငး့သာထာ့သငးံၿပီ့ Create New Project in


Workspace ဟူေသာ Radio Button ကိုမူေရျ့ခ္ယးထာ့သငးံၿပီ့ Default Location ဟူေသာ Check Box
ကိုလညး့ အမြနး်ခစးေပ့ကာ ေရျ့ခ္ယးထာ့သငးံပါသညး၈ ၁ငး့သညး မူလသတးမြတးထာ့ေသာ Workspace
directory တျငး ယခုလုပးေဆာငးမညး႕ Project မ္ာ့ကို သိမး့ဆညး့ေပ့ထာ့ႏိုငးေစပါလိမးံမညး၈ ထိုကဲံသို႕
Default Location တျငးထာ့်ခငး့၏ ေကာငး့ကျကးတစးခုမြာ အာ့လဵု့ေသာ Project မ္ာ့သညး တစးေနရာ
တညး့တျငးရိြေနမညး်ဖစးေသာေၾကာငးံ ရြာေဖျ်ခငး့မ္ာ့လုပးေဆာငးရာတျငး လျယးကူေစမညး်ဖစးပါသညး၈
သို႕ရာတျငးလိုအပးပါက မိမိႀကိဳကးႏြစးသကးရာ ေနရာတျငး သိမး့ဆညး့ထာ့ႏိုငးပါသညး၈

New Android Project Wizard ၏ေနာကးဆဵု့ Option သဵု့ခုမြာ Properties Area တျငးတညးရိြပါသညး၈ ထို
Properties မ္ာ့သညး Project ကို Android environment အတျငး့တျငး မညးကဲံသို႕ integrate ်ပဳလုပး
မညးဆိုသညး႕အခ္ကးကို ညႊနး့ဆိုပါသညး၈ Package Name filed တျငး ်ပဳလုပးမညး႕ application package
သို႕ namespace ကို ရညးညႊနး့ရနးအတျကး အသဵု့်ပဳႏိုငးပါသညး၈ ဥပမာအာ့်ဖငးံ android.app.Activity
သို႕မဟုတး com.google.android.map.MapActivity စေသာနာမညးမ္ာ့်ဖငးံသတးမြတးထာ့ႏိုငးပါသညး၈

ယခုေဖား်ပပါ HelloWorldText application အတျကး package name ကို android_programmers


_guide.HelloWorldTetဟုအသဵု့်ပဳမညး်ဖစးသညး၈ထိုေပ့ထာ့ေသာအမညးသညး application လုပးေဆာငး
မညး႕လုပးေဆာငးခ္ကးမ္ာ့ကို ထငးဟပးေစမညး႕အမညး်ဖစးရဵုသာမက အ်ခာ့ေသာလုပးေဆာငးခ္ကးတူသညး႕
application ၏အမညးႏြငးံလညး့ ကျဲ်ပာ့်ခာ့နာ့ေစမညး႕အမညးတစးခုလညး့ ်ဖစးေစပါသညး၈

ထို႕ေနာကး Properties အကျကးထဲတျငးရိြေသာ Activity Name သညး ေရ့သာ့မညး႕ Application ၏


Main Screen သို႕ Reference ်ပဳလုပး်ခငး့်ဖစးသ်ဖငးံ ထညး႕သျငး့ေပ့ရနးလိုအပးပါသညး၈ ထို Activity ကို
Application အတျငး့တျငးစတငး်ပသမညး႕ Window Screen ဟူ၍လညး့ မြတးယူႏိုငးမညး်ဖစးသညး၈
အကယး၍ Activity တစးခုခုသာ မပါရိြခဲံပါက ေရ့သာ့ထာ့ေသာ Application သညး လုပးေဆာငးခ္ကးမ္ာ့
ကို ေကာငး့မျနးစျာလုပးေဆာငးႏိုငးမညးမဟုတးေပ၈ သို႕ရာတျငး Android Appliction မ္ာ့သညး မ္ာ့စျာေသာ
Activity မ္ာ့်ဖငးံေပါငး့စပးာထာ့ေၾကာငးံ Android Project Wizard အသစးတစးခုကို မညးသညး႕ Activity
က နဂိုမူလ Default Activity ်ဖစးသညးကိုသိရိြႏိုငးရနးအတျကး သိရိြထာ့ရနးလိုအပးမညး်ဖစးသညး၈
ထို႕ေၾကာငးံ ယခုေနရာတျငး Activity Name ကို HelloWorldText ဟူ၍ အမညးေပ့မညး်ဖစးသညး၈ ထိုသို႕

60 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အမညးေပ့ထာ့်ခငး့်ဖငးံ ေရ့သာ့မညး႕ Appliction မ္ာ့၏လုပးေဆာငးခ္ကးကို ပိုမိုရို့ရြငး့လျယးကူေစမညး်ဖစ


ပါသညး၈

Properties အကျကး၏ေအာကးဆဵု့့တျငးရိြေသာ Application Name သညး ေရ့သာ့လိုေသာ Application


၏ အမညးပငး်ဖစးသညး၈ ထိုအမညးသညး ေနာကးဆဵု့ Output အ်ဖစး APK အ်ဖစးထျကးလာခ္ိနးတျငး ေပၚလာ
မညး႕ အမညးလညး့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ယခုေနရာတျငး HelloWorldText ဟူ၍ အမညးေပ့သျာ့မည
်ဖစးပါသညး၈ ်ပဳလုပးရမညး႕ ထညး႕သျငး့ရမညး႕အမညးမ္ာ့ကို ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုတျငး ေတျ႕်မငး
ႏိုငးမညး်ဖစးသညး၈

ထို႕ေနာကး လုပးေဆာငးခ္ကးမ္ာ့အာ့လဵု့ကိုလုပးေဆာငးၿပီ့ေသာအခါတျငး Finish ခလုတးကိုတစးခ္ကး ႏိြပး


ေပ့ရပါမညး၈ ထိုအခါ လိုအပးေသာ ဖိုငးမ္ာ့၇ လုပးေဆာငးခ္ကးမ္ာ့၇ Directory Structure မ္ာ့ကို ေနာကး
ကျယးမြ လုပးေဆာငးေပ့သျာ့မညး်ဖစးပါသညး၈ လုပးေဆာငးခ္ကးမ္ာ့သညးအခ္ိနးအနညး့ငယးၾကာ်မငးံမည
်ဖစးၿပီ့ ၿပီ့စီ့သျာ့သညး႕အခါတျငး ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ ်မငးေတျ႕ရမညး်ဖစးသညး၈ ထို
ေနရာသညး Android Application မ္ာ့ကိုစတငးေရ့သာ့ႏိုငးသညး႕ေနရာလညး့ ်ဖစးပါသညး၈
မ္ကးပျငးံစာေပ 61
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးလာမညး႕အပိုငး့တျငး Android မြအလိုအေလြ္ာကးထုတးလုပးစီစဥးေပ့လိုကးေသာ Android file


မ္ာ့ႏြငးံ ထိုဖိုငးတို႕၏အသဵု့ွငးပဵုမ္ာ့ကိုေဖား်ပေပ့သျာ့မညး်ဖစးပါသညး၈

Examining the Android-Created Files


ယခုအပိုငး့တျငး Android Project တစးခုတညးေဆာကးရာတျငးအလိုအေလ္ာကးပါွငးလာေသာ ဖိုငးမ္ာ့
အေၾကာငး့ကို ရြငး့်ပသျာ့မညး်ဖစးသညး၈ Application Project အသစးတစးခုေခၚယူၿပီ့ Package Explorer
ကိုၾကညး႕ပါ၈ Package Explorer သညး Window ၏ ဘယးဘကး်ခမး့တျငးရိြတတးပါသညး၈ ၾကညး႕ရမညး႕
package Explorer ၏ပဵုကိုေအာကးတျငးပဵုႏြငးံတကျေဖား်ပေပ့ထာ့ပါသညး၈

62 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အကယး၍အထကးတျငးေဖား်ပခဲံေသာ Package Explorer ကိုသာ်မငးေတျ႕ရ်ခငး့မရိြပါက Windows ၏


Menu မြတစးဆငးံ Show View> Package Explorer ကိုေရျ့ခ္ယး၍ ေခၚယူႏိုငးပါသညး၈

ပဵုတျငး်ပထာ့သညး႕အတိုငး့ပငး HelloWorldText ဟူေသာအမညး်ဖငးံ Root Directory တစးခုကိုေတျ႕်မငး


ရမညး်ဖစးပါသညး၈ အဆိုပါ Root Directory သညး ်ပဳလုပးမညး႕ Application ၏ Project File မ္ာ့အတျကး
Home သို႕မဟုတး Repository ဟူ၍လညး့ သတးမြတးႏိုငးပါသညး၈ ထို႕ေနာကး အသစးထပးတို့လာမညး႕
ဖနးတီ့ယူေသာ ဖိုငးမ္ာ့ႏြငးံ နဂိုမူလရိၿြ ပီ့်ဖစးေသာ Android မြဖနးတီ့လိုကးေသာဖိုငးမ္ာ့အာ့လဵု့သညး ထို
Root Directory ၏ေအာကးတျငးရိြၾကမညး်ဖစးသညး၈ ထိုဖိုငးမ္ာ့ကို Package Explorer ကိုအသဵု့်ပဳ၍
လျယးကူစျာ်ဖငးံ ွငးေရာကးၾကညး႕ရြဳအသဵု့်ပဳႏိုငးပါသညး၈ ေလာေလာဆယးတျငး Root Directory ေအာကး
တျငး AndroidManifest.xml ဖိုငး၇ Referenced Library မ္ာ့ထဲတျငးပါွငးေသာ Package တစးခုႏြငးံ (res,
assets, src) ဟူေသာ Directory သဵု့ခုကိုေတျ႕်မငးႏိုငးပါလိမးံမညး၈

AndroidManifest.xml
AndroidManifest.xml ဟူေသာဖိုငးသညး global setting မ္ာ့ကိုစုစညး့ထာ့ေသာဖိုငး်ဖစးသညး၈
အကယး၍ ASP.Net ကိသ
ု ာအသဵု့်ပဳဖူ့လြ္ငး အဆိုပါ AndroidManifest.xml ဖိုငးသညး Web.config ႏြငးံ
Global.asax ဖိုငးႏြငးံအလာ့တူသ႑နးတူေၾကာငး့သတိ်ပဳမိပါလိမးံမညး၈ အရြငး့ဆဵု့ဆုိရလြ္င
AndroidManifest.xml ဖိုငးတျငး application permission ႏြငးံသကးဆိုငးေသာ Setting မ္ာ့၇ Activity
မ္ာ့ႏြငးံ intent filter မ္ာ့ကို စုစညး့ထာ့ေသာဖိုငးတစးဖိုငး်ဖစးေၾကာငး့ သိရိြထာ့ရပါမညး၈

မ္ကးပျငးံစာေပ 63
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

်ပငးဆငးထာ့်ခငး့မရိြသညး႕ AndroidManifest.xml ဖိုငးတျငးေအာကးတျငးေဖား်ပထာ့ေသာ အခ္ကးအလက


မ္ာ့ပါွငးေၾကာငး့ သိရိြထာ့ရပါမညး၈

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


<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="testPackage.HelloWorldText">
<application android:icon="@drawable/icon">
<activity class=".HelloWorldText"
android:label="@string/app_name">
<intent-filter>
<action android:value="android.intent.action.MAIN"
/>
<category
android:value="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>

ေနာကး်ပဳလုပးတညးေဆာကးမညး႕ Application မ္ာ့တျငး အထကးပါ AndroidManifest.xml ဖိုငးအတျငး့


တျငး ထပးမဵေသာ အခ္ကးအလကးမ္ာ့ကိုထညး႕သျငး့ရေၾကာငး့ သိရိြထာ့ရပါမညး၈

Referenced Libaries
Reference ်ပဳလုပးထာ့ေသာ Library မ္ာ့၏ စာရငး့သညး Project ၏ Root Directory ထဲတျငးတစးခါ
တညး့ပူ့တျဲပါွငးၿပီ့ ်ဖစးပါသညး၈ ပဵုမြနးအာ့်ဖငးံ သာမနးရို့ရို့ Project အတျကး Library တစးခုတညး့ကိုသာ
ေတျ႕်မငးရမညး်ဖစးၿပီ့ ထို Referenced Library မ္ာ့ကို ်ဖနး႕ခ္ၿပီ့ ပါွငးေသာ Content မ္ာ့ကို စစးေဆ့ရပါ
မညး၈ Library မ္ာ့သညး ေလာေလာလတးလတးေရ့သာ့ေနေသာ Android Project ကို Reference
်ပဳလုပးေစရနးအေရ့ႀကီ့ပါသညး၈ Android Project တစးခုကိုစတငးသညးႏြငးံ Project Reference တစးခု
အ်ပငး၇ android.jar ဖိုငးႏြငးံ Android SDK တို႕ကို ေတျ႕်မငးေနၾက်ဖစးပါလိမးံမညး၈ ထိုသို႕ Reference
Library မ္ာ့ကို Android Plugin မြ်ပဳလုပးေပ့်ခငး့်ဖစးပါသညး၈ ထို႕အ်ပငး ေရ့သာ့မညး႕ Android သညး
SDK Library မ္ာ့အတျငး့မြ Views, Control ႏြငးံ Google API စေသာ Class မ္ာ့ကို
ွငးေရာကးသဵု့စျဲႏိုငးေစရနးအလို႕ငြါ Android SDK ကိုပါ Reference ်ပဳလုပးထာ့ရနးလိုအပးပါမညး၈

Eclipse သညးအဆိုပါ Built-In ပါရိြေသာ Library မ္ာ့အ်ပငး အ်ခာ့ေသာ User-defined Library မ္ာ့ႏြငးံ
်ပငးပ Class မ္ာ့ကိုပါ ေရ့သာ့မညး႕ Project အတျကး Reference ်ပဳလုပးချငးံေပ့ထာ့ပါသညး၈ သို႕ရာတျငး

64 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အဆိုပါ ်ပငးပမြထညး႕သျငး့ေသာ User-defined library မ္ာ့ႏြငးံ Class မ္ာ့သညး အသဵု့်ပဳမညး႕ Android


Platform ႏြငးံ ကိုကးညီမႈရိြေစရနး ဂရု်ပဳရပါလိမးံမညး၈

Directories
Android Project တစးခု၏ Root Directory ထဲတျငး Directory သဵု့ခုရိြၿပီ့ ၁ငး့တို႕မြာ res, assets ႏြငးံ src
တို႕်ဖစးၿပီ့ ၁ငး့တို႕ကို မတူညီေသာ ရညးရျယးခ္ကးမ္ာ့အတျကးအသဵု့်ပဳေလံရိြပါသညး၈ Directory တစးခုစီ
သညး ေရ့ဆျဲမညး႕ Application ၏ လုပးေဆာငးခ္ကးမ္ာအတျကး အဓိကအခနး့က႑မြပါွငးသညး႕အတျက
အေရ့ႀကီ့သညးဟုသတးမြတးႏိုငးပါသညး၈

Res Directory

res Directory တျငp


း roject resource မ္ာ့ပါွငးၿပီ့ ၁ငး့တို႕သညး Application ကို ကိုငးတျယးေ်ဖရြငး့
Complie ်ပဳလုပးရနးအသဵု့်ပဳႏိုငးပါသညး၈ Android Project အသစးတစးခုကို ်ပဳလုပးဖနးတီ့သညး႕အခါ res
Directory တျငး drawable,layout ႏြငးံ Values ဟူေသာ Sub-Directory
အချဲသဵု့ခုပါွငးလာမညး်ဖစးပါသညး၈ Drawable ႏြငးံ Layout ဟူေသာ directory မ္ာ့ကို Android Project
၏ Image မ္ာ့ႏြငးံ Layout မ္ာ့ကို အသီ့သီ့ထညး႕သျငး့အသဵု့်ပဳႏိုငးၿပီ့ Values ဟူေသာ Directory ကိုမူ
Global မ္ာ့၏ String မ္ာ့်ဖငးံ လုပးေဆာငးရနးအတျကးအသဵု့်ပဳႏိုငးပါသညး၈

ထို res directory သို႕်ပဳလုပးထာ့ေသာ Reference ႏြင၁


းံ ငး့၏ Content တျငး sc directory အတျငး့တျငး
ရိြေသာ R.java file သညးလညး့ ပါွငးပါသညး၈ ထိုဖိုငးအေၾကာငး့ကိုလာမညး႕အခနး့မ္ာ့တျငး ေဖား်ပေပ့
သျာ့မညး်ဖစးပါသညး၈

Drawable directory တျငး ေရ့သာ့မညး႕ Application တျငးအသဵု့်ပဳႏိုငးေသာ image ဖိုငးမ္ာ့ႏြငံး


Reference တို႕ပါွငးပါသညး၈ Layout directory သညးတညးေဆာကးမညး႕ application ၏ Interface
ပိုငး့ကိုဖနးတီ့ရာတျငး Reference ်ပဳလုပးရေသာ XML ဖိင
ု းတစးဖုိငး်ဖစးသညး႕ main.xml ဖိုငးႏြငးံပတးသက
ပါသညး၈ ယခုစာအုပးတျငးေလံလာရမညး႕ Application အမ္ာ့စုတျငး ထို Layout Library အတျငး့တျငးရိြ
ေသာ main.xml ဟူေသာဖိုငးကို ်ပငးဆငး်ခငး့မ္ာ့ ်ပဳလုပးရမညး်ဖစးသညး၈ ၁ငး့သညး Vitual Layout မ္ာ့

မ္ကးပျငးံစာေပ 65
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထညး႕သျငး့ရာတျငးအသဵု့်ပဳႏိုငးပါသညး၈ ်ပငးဆငး်ခငး့တစးစဵုတစးရာကိုမြ္ မ်ပဳလုပးရေသ့သညး႕ main.xml


ဖိုငးတျငးေအာကးေဖား်ပပါ နမူနာ Code မ္ာ့ကိုေတျ႕ရိြရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloWorldText"
/>
</LinearLayout>

res directory အတျငး့တျငးရိြသညး႕ေနာကးဆဵု့ directory ်ဖစးေသာ Values ဟူေသာ Folder သညး


String ဟုအမညးရသညး႕ xml ဖိုငးတစးဖိုငးႏြငးံသကးဆိုငးပါသညး၈ ထို Strings.xml ဖိုငးသညး Application
ကို Reference ်ပဳလုပးႏိုငးရနးအတျကး လိုအပးေသာ global string values မ္ာ့ႏြငးံသကးဆိုငးပါသညး၈

assets Directory

assets directory ကို raw asset file မ္ာ့ကိုကိုငးတျယး်ပဳလုပးရနးအသဵု့်ပဳပါသညး၈ ထိD


ု irectory
အတျငး့တျငးပါွငးေသာ ဖိုငးမ္ာ့သညး Streaming ႏြငးံ anmination asset မ္ာ့အတျကး လိုအပးေသာ
audio ဖိုငးမ္ာ့်ဖစးၾကသညး၈

src Directory

src directory တျငး ေရ့သာ့မညး႕ Project ၏ Source ဖိုငးမ္ာ့အာ့လဵု့ပါွငးမညး်ဖစးပါသညး၈ Project


အသစးတစးခုကိုစတငးဖနးတီ့်ပဳလုပးသညး႕အခါတျငး src directory တျငး R.java ဟူေသာဖိုငးႏြငးံ
<activity>.java ဟူေသာဖိုငးႏြစးဖိုငးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈ <activity> ေနရာတျငး စတငးအမညး
ေပ့ခဲံေသာ activity အမညးဟူ၍ သတိထာ့မိႏိုငးမညး်ဖစးပါသညး၈ ယခုေနရာတျငး <activity>.java
ဟူေသာဖုိငးေနရာတျငး HelloWorldText.java ဖိုငး်ဖစးမညး်ဖစးေၾကာငး့ သတိထာ့မိၾကမညး်ဖစးသညး၈

R.java File
66 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

R.java file သညး ေရ့သာ့ေနသညး႕ Android application အတျကး android plugin မြအလိုအေလြ္ာကး
ထညး႕သျငး့ေပ့လိုကးေသာဖိုငးတစးဖိုငး်ဖစးပါသညး၈ ယငး့ဖိုငးတျငး Drawable,layout ႏြငးံ values ဟူေသာ
directory မ္ာ့အတျကးအသဵု့်ပဳရသညး႕ Pointer မ္ာ့ပါွငးပါသညး၈ ထို႕ေၾကာငးံ ထိုဖုိငးကိုမညးသညး႕အခါ
တျငးမြ တိုကးရိုကး်ပငးဆငး်ခငး့ မ်ပဳလုပးႏိုငးပါ၈ မ္ာ့ေသာအာ့်ဖငးံ ေရ့သာ့သညး႕ Application မ္ာ့အတျကး
သာလြ္ငး Reference ်ပဳလုပးေလံရိြပါသညး၈ ယခုေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့သညး
HelloWorldText ဟူေသာ Application အတျကး Android Plugin မြအလိုအေလြ္ာကး ထုတးေပ့လိုက
ေသာ Code မ္ာ့်ဖစးပါသညး၈

/* AUTO-GENERATED FILE. DO NOT MODIFY.


*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/

package testPackage.HelloWorldText;

public final class R {


public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {/
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040000;
}
}

<activity>.java File

src ဟုအမညးရေသာ directory ထဲတျငးရိြသညး႕ ထိုဖိုငးသညး Android Application တစးခုကိုေရ့သာ့


ရာတျငးအသဵု့အွငးဆဵု့ဖိုငးတစးခၿု ဖစးပါသညး၈ ယခုေနရာတျငး <activity>.java ကို HelloWorldText.java
ဖိုငးအ်ဖစးမြတးယူရမညး်ဖစးၿပီ့ ၁ငး့ကို Android Plugin မြ ်ပဳလုပးေပ့ထာ့်ခငး့်ဖစးကာ Android Project
Wizard တျငး်ပဳလုပးစဥးက ေပ့ထာ့ခဲံေသာ အမညးအတိုးငး့ ေပၚေနမညး်ဖစးသညး၈ အ်ခာ့ဖိုငးမ္ာ့ႏြငးံ မတူ
ေသာအခ္ကးမြာယခုေဖား်ပပါဖိုငးသညး အ်ပငးဆငးရဆဵု့ေသာဖိုငးတစးခုလညး့်ဖစးၿပီ့ လကးရိြ Activity
အတျကး Code မ္ာ့ေရ့သာ့ရေသာဖိုငးလညး့်ဖစးပါသညး၈
မ္ကးပျငးံစာေပ 67
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အဆိုပါဖိုငးကိုၾကညး႕်ခငး့်ဖငးံေအာကးေဖား်ပပါ Code မ္ာ့ကိုေတျ႕ၿမငးရမညး်ဖစးပါသညး၈

package android_programmers_guide.HelloWorldText;
import android.app.Activity;
import android.os.Bundle;

public class HelloWorldText extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}

အထကးပါ Code မ္ာ့မြ ပထမဆဵု့စာေၾကာငး့သဵု့ေၾကာငး့ကို Standard preprocessor directives


ဟုေခၚပါသညး၈ ၁ငး့တို႕သညး Programming Language ၏ Statement မ္ာ့်ဖစးကာ Application ၏
process မစတငးမီတျငးေၾက်ငာေပ့ရေသာ directive မ္ာ့လညး့်ဖစးပါသညး၈ ပထမစာေၾကာငး့်ဖစးေသာ
package android_programmers_guide.HelloWorldText သညးေရ့သာ့ေနေသာ Application ၏
definition ႏြငးံ inclusion ဟူ၍လညး့ သတးမြတးႏိုငးမညး်ဖစးပါသညး၈

ဒုတိယစာေၾကာငး့ႏြစးေၾကာငး့သညး android.jar မြတစးဆငးံ Android SDK မြ package မ္ာ့ကုိ ကိုယးစာ့


်ပဳပါသညး၈ ထိုစာေၾကာငး့ႏြစးေၾကာငး့တို႕မြာ import android.app.Activity; ႏြငးံ import
android.os.Bundle; တို႕်ဖစးပါသညး၈

ထိုစာေၾကာငး့မ္ာ့သညး application အတျငး့အ်ခာ့ေသာ Code မ္ာ့မတိုငးမီတျငး ပါွငးရမညး႕ Code မ္ာ့


ေရ့သာ့ရာတျငးလိုအပးေသာ Package မ္ာ့ကို ထညး႕သျငး့ရနးအတျကး်ဖစးပါသညး၈ ထို စာေၾကာငး့ႏြစး
ေၾကာငး့သညး Android Project ေရ့သာ့ရာတျငး လိုအပးၿပီ့ ဖ္ကးပစး၍မရပါ၈

ထို႕ေနာကး main activity ၿဖစးေသာ HelloWorldText.java ဖိုငးေဘ့ဘကးမြ အေပါငး့လကၡဏာပဵုစဵက


တစးခ္ကးႏိြပးၿပီ့ေနာကး Activity ကို်ဖနး႕ခ္ၾကညး႕ပါမညး၈ အာ့လဵု့ေသာ Application မ္ာ့ကို activity class
မြတစးဆငးံေမာငး့ႏြငး်ခငး့်ဖစးၿပီ့ Android ေပၚတျငး Application တစးခုကိုေမာငး့ႏြငးရနးအတျကး derivation
်ပဳလုပးရနး လိုအပးမညး်ဖစးပါသညး၈ တစးစဵုတစးရာကို ေမာငး့ႏြငးရနးႏြငးံ Screen ေပၚတျငး Display ်ပဳလုပး
ေဖား်ပရနးအတျကး Activity မြသာမ်ဖစးမေန derive ်ပဳလုပးရမညး်ဖစးေပသညး၈

68 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေၾကာငးံ HelloWorldText ဟူေသာ Class သညး Application ကိုဖနးတီ့တညးေဆာကးရနး၇ display ်ပဳ


လုပးေဖား်ပရနးနြငးံ ေမာငး့ႏြငးလညးပတးႏိုငးေစရနး လိုအပးေသာ Code မ္ာ့ရိြပါသညး၈ ထိုသို႕်ပဳရနးအတျက
တစးခုတညး့ေသာနညး့လမး့မြာ onCreate () ဟူေသာ method ကိုအသဵု့်ပဳရနး်ဖစးပါသညး၈

onCreate() ဟူေသာ method သညး bundle တစးခုအ်ဖစး icicle ကိုလုပးေဆာငးေစပါသညး၈ ထိုအခါ အာ့
လဵု့ေသာလကးရိြ State information မ္ာ့ကို icicle object တစးခုအ်ဖစး Memory အတျငး့သို႕ စုစညး့ေစ
ပါသညး၈ ၁ငး့၏ ပါွငး်ခငး့ႏြငးံ ရညးရျယးခ္ကးကိုသိရိြရနးလိုအပးေသားလညး့ Application အတျငး့တျငး icicle
ကို တိုကးရိုကးအသဵု့်ပဳႏိုငးစျမး့မရိပ
ြ ါ၈

ထိုဖိုငးတျငးပါွငးေသာ Code ေနာကးတစးေၾကာငး့မြာ သိလျယး်မငးလျယးေသာ လုပးေဆာငးခ္ကးတစးခုသာ


်ဖစးပါသညး၈

setContentView(R.layout.main);

setContentView() ဟူေသာ Methodသညး Activity ၏ Content ကို သတးမြတးထာ့ေသာ Resource


သို႕ ေနရာခ္ထာ့ေစပါသညး၈ ယခုေနရာတျငး Layout directory မြ main.xml ဖိုငးကို R.java file မြ
Pointer မြတစးဆငးံအသဵု့်ပဳ်ခငး့်ဖစးပါသညး၈ ယခုအေနအထာ့အရ main.xml ဖိုငးတျငး HelloWorld Text
ဟူေသာ Screen ႏြငးံ TextView တစးခုထကးပိုမို၍ ပါွငး်ခငး့မရိြေသ့ပါ၈ TextView ကို View မြေမာငး့ႏြငး
ၿပီ့ Android Environment အတျငး့ စာသာ့မ္ာ့ကို ေဖား်ပေပ့ရနး အသဵု့်ပဳႏိုငးပါသညး၈ main.xml ဖိုငးကို
်ပနးၾကညး႕်ခငး့်ဖငးံ ေအာကးတျငးေဖား်ပထာ့ေသာ Code တစးေၾကာငး့ကို ေတျ႕်မငးရမညး်ဖစးပါသညး၈

android:text="Hello World, HelloWorldText"

ြsetContentView () ဟူေသာ method သညး main.xml ကို Current View အေန်ဖငးံ အစီအစဥးခ္ထာ့
သညးဟုယူဆလြ္ငး main.xml တျငး “Hello World, HelloWorldText” ဟုေဖား်ပေပ့ႏိုငးေသာ TextView
တစးခု ပါွငးေၾကာငး့ သတိ်ပဳမိၾကပါမညး ထငးပါသညး၈ အဆိုပါ ေ်ပာငး့လဲ်ပငးဆငးထာ့်ခငး့မရိြသညး႕
HelloWorldText Application ကိုစမး့သပးေမာငး့ႏြငးၾကညး႕ၾကပါမညး၈ ထိုသို႕ေမာငး့ႏြငးရနး Run Menu မြ
Run သို႕ ေရျ့ခ္ယးေပ့်ခငး့်ဖငးံ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Run As Dialogbox ေပၚလာမည
်ဖစးၿပီ့ Android Application တျငးေရျ့ခ္ယး၍ OK ကို Click ႏိြပးပါ၈

မ္ကးပျငးံစာေပ 69
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေၾကာငးံ စတငးလိုကးေသာ Project အသစးတျငး Hello World! ဟူေသာ application ကိုစတငးရန


Code မ္ာ့ပါွငးသညးကိုေတျ႕ခဲံရၿပီ့်ဖစးပါသညး၈ သို႕ရာတျငး ထို Application သညးအလျနးဆျဲေဆာငးမႈမရ
ေသားလညး့ Android Application မ္ာ့ေရ့သာ့ရာတျငးလညး့ အေထာကးအကူ်ပဳေပ့ပါသညး၈ ထို႕ေၾကာငးံ
Project ကိုချဲ်ခမး့စိတး်ဖာ၍ Hello World! ဟူေသာ Message ေပၚလာေစရနး အလုပးလုပးေဆာငးပဵုမ္ာ့က
ေလံလာရနးအတျကး အသဵု့ွငးပါသညး၈ Project အသစးတစးခုကို တညးေဆာကးသညး႕အခါတိုငး့တျင
Android Plugin မြ main.xml ဖိုငးကို်ပငးဆငးပါသညး၈ ထိုအခ္ကးသညး Android အတျငး့မြ UI ကို
်ပငးဆငးရနးအတျကး အေကာငး့ဆဵု့ေသာ ဥပမာတစးရပးပငး်ဖစးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ
Code မ္ာ့ကို Project တစးခုကို တညးေဆာကးေသာအခါတျငး Android SDK မြ main.xml တျငးထညး႕
ေပါငး့ေပ့ပါသညး၈

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloWorldText"
/>

70 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

xml အတျငး့မြ TextView အေၾကာငး့ေဆျ့ေႏျ့ေနစဥးတျငး သကးဆိုငးရာ Code မ္ာ့မပါဘဲ အလုပးလုပး်ခငး့


အေၾကာငး့ကို မေ်ပာဆိုရေသ့ပါ၈ သို႕ရာတျငး ယခငးအပိုငး့မ္ာ့တျငး ေဖား်ပခဲံေသာ အေၾကာငး့အရာမ္ာ့
အရ Android ကို UI တစးခုအ်ဖစး Design ်ပဳလုပးရနး နညး့လမး့ႏြစးခုရိြၿပီ့ တစးခုမြာ Code မ္ာ့ေရ့သာ့
်ပဳလုပး်ခငး့်ဖစးၿပီ့ ေနာကးတစးခုမြာ main.xml ဖိုငးကို်ပငးဆငး်ခငး့်ဖစးပါသညး၈ ယခငးေဖား်ပခဲံၿပီ့်ဖစးသညး႕
xml အတျငး့မြ TextView ၏ Code ်ဖစးေသာ “Hello World, HelloWorldText.” ကို အနညး့ငယး်ပငးဆငး
ၾကညး႕ၾကပါမညး၈ main.xml ဖိုငးတျငးရိြေသာအဆိုပါ Code ကိုေအာကးတျငးေဖား်ပထာ့သညး႕ code
အတိုငး့ ေ်ပာငး့လဲၾကညး႕ၾကပါမညး၈

android:text="This is the text of an Android TextView!"

ဲထို႕ေနာကး Project ကို်ပနး Run ၾကညး႕ပါ၈ ထျကးေပၚလာမညး႕ Result ကိုေအာကးတျငးေဖား်ပထာ့သညး႕


ပဵုတျငးေတျ႕်မငးႏိုငးပါသညး၈ xml TextView ကိုအသဵု့်ပဳႏိုငးရနး အခ္ိနးအနညး့ငယးယူ၍ ်ပငးဆငးမႈမ္ာ့်ပဳလုပ
ၾကညး႕ပါ၈ ထို႕ေနာကး Hello World! Application ကိုပါ ေနာကးနညး့လမး့တစးမ္ိဳ့သဵု့၍ ်ပဳလုပး်ခငး့ကို
ဆကးလကးေလံလာရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 71
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Hello World! Again


ယခုအပိုငး့တျငး Hello World ! Application ေနာကးတစးခုကုိတညးေဆာကးၾကညး႕ၾကပါမညး၈ သို႕ရာတျငး
UI Code ေရ့သာ့မညး႕အစာ့ Xml File ကိုအသဵု့်ပဳၾကညး႕ၾကပါမညး၈ ထို႕ေၾကာငးံ ပထမအဆငးံအေန်ဖင
TextView Code မ္ာ့ကို main.xml မြဖ္ကးပစးရနးလိုအပးပါသညး၈ ထို႕ေနာကးေအာကးတျငးေဖား်ပထာ့
သညး႕ Code မ္ာ့ကို ဖ္ကးပစးရပါမညး၈ ထို႕ေနာကး အဆိုပါ Code မ္ာ့ကိုဖ္ကးပစးၿပီ့ေသာအခါ Application
သညး Empty shell တစးခုအ်ဖစးသို႕ေရာကးသျာ့မညး်ဖစးသညး၈

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloWorldText"
/>

အထကးတျငးေဖား်ပထာ့ေသာ TextView Code ကိုဖ္ကးၿပီ့ေနာကးတျငး main.xml ဖိုငးသညး ေအာကးတျငး


ေဖား်ပထာ့ေသာ Code အတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

</LinearLayout>

ထို႕ေနာကးတျငး မညးသညး႕လုပးေဆာငးခ္ကးမြ္မရိြေသာ main.xml ဖိုငးတစးဖိုငးကိုရရိြမညး်ဖစးၿပီ့ Appli-


cation ေရ့သာ့ရနးအတျကးအသငးံ်ဖစးေနၿပီ့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ HelloWorldText.java file ကိုဖျငးံ
ကာ ေအာကးတျငးေဖား်ပထာ့ေသာ Code ကိုဖ္ကးပစးရပါမညး၈

setContentView(R.layout.main);

ိုယခုေရ့သာ့မညး႕ Application အသစးအတျကးလညး့ ContentView ကိုသတးမြတးေပ့ရနးလိုပါမညး၈ သို႕


ရာတျငး ယခုမလိုအပးေသ့သညး႕အတျကး Statement တစးခုလဵု့ကိုဖ္ကးပစး်ခငး့်ဖစးပါသညး၈

72 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

setContentView() သညး Screen တျငး main.xml ကိုေဖား်ပရနးအသဵု့်ပဳပါသညး၈ TextView ကို


သတးမြတးရနး main.xml ဖိုငးကိုအသဵု့မ်ပဳမီကတညး့က ေဖား်ပမညး႕ View ကိုသတးမြတးထာ့်ခငး့မရိြခဲံပါ၈
ထို႕ေၾကာငးံ TextView ်ဖစးလာေစရနး Code မ္ာ့ေရ့သာ့ၾကညး႕ၾကပါမညး၈

်ပဳလုပးရမညး႕ေနာကးတစးဆငးံမြာ android.widget မြ TextView package တစးခုကိုထညး႕သျငး့ရနး်ဖစ


သညး၈ ထိုသိုကထညး႕သျငး့်ခငး့်ဖငးံကိုယးႏြစးသကးရာ TextView မ္ာ့ကိုအသဵု့်ပဳချငးံရရိြသျာ့မညး်ဖစးပါ
သညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code ကို HelloWorldText.java ဖိုငး၏ထိပးဆဵု့နာ့တျငး ေရ့သာ့
ရမညး်ဖစးပါသညး၈

import android.widget.TextView;

ယခုအခါ TextView တစးခုကိုတညးေဆာကးၿပီ့်ဖစးပါသညး၈ TextView တစးခုကိုတညးေဆာကးအသဵု့်ပဳ


်ခငး့်ဖငးံ main.xml ဖိုငးကို တိုကးရိုကး်ပငးဆငးစရာမလိုပဲ Screen တျငးေဖား်ပလိုေသာ စာသာ့မ္ာ့ကို ေဖား်ပ
ေပ့ႏိုငးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့ကို onCreate() Statement ၿပီ့ေနာကး
ရိုကးထညး႕ေပ့ရမညး်ဖစးသညး၈

TextView HelloWorldTextView = new TextView(this);

အထကးတျငးေဖား်ပထာ့ေသာ Code သညး HelloWorldTextView ဟုအမညးေပ့ထာ့ေသာ TextView


တစးခုကိုတညးေဆာကး်ခငး့်ဖစးပါသညး၈ ထိုသို႕်ပဳလုပးရနး new TextView ဟူေသာ Code ကိုအသဵု့်ပဳပါ
သညး၈ အသစး်ပဳလုပးထာ့ေသာ TextView ကို ်ပညး႕စဵုစျာသကးေရာကးမႈရိြေစရနး this ဟူေသာ context
်ဖငးံ အသဵု့်ပဳ်ခငး့်ဖစးပါသညး၈ ထို႕ေနာကး TextView ကိုသတးမြတးၿပီ့ေနာကးတျငး Text ကိုထညး႕ႏိုငးၿပီ်ဖစ
သညး႕အတျကး ေအာကးတျငးေဖား်ပထာ့ေသာ Hello World ဟူေသာစာသာ့ေပၚေစမညး႕ Code ကိုေပါငး့
ထညး႕ေပ့ရပါမညး၈

HelloWorldTextView.setText("Hello World!");

အထကးတျငးေဖား်ပထာ့ေသာCode သညး TextView အတျငး့ Text တစးခုထညး႕သျငး့်ခငး့်ဖစးၿပီ့ setText


() သညး String တစးခုကို TextView အတျငး့တျငး Assign ်ပဳလုပး်ခငး့်ဖစးပါသညး၈ ထို႕ေနာကး TextView
တစးခုကို တညးေဆာကးၿပီ့်ဖစးသညး႕အ်ပငး ေဖား်ပေပ့ေစမညး႕ Message တစးခုကိုလညး့ ထညး႕သျငး့ထာ့
ၿပီ့်ဖစးပါသညး၈ သို႕ရာတျငး အထကးပါအတိုငး့ Hello World! ဟူ၍သတးမြတးေပ့ရဵု်ဖငးံ Screen တျငး

မ္ကးပျငးံစာေပ 73
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

မညးသညး႕စာသာ့ကိုမြ္ ေတျ႕ရမညးမဟုတးပါ၈ အထကးတျငးေရ့သာ့ခဲံၿပီ့်ဖစးသညး႕အတိုငး့ Screen ေပၚ


တျငးေပၚလာေစရနး ContentView ကိုသတးမြတးေပ့ရနးလိုပါသညး၈ ထို႕ေၾကာငးံ ေအာကးတျငးေဖား်ပထာ့
ေသာ Code ကိုအသဵု့်ပဳ၍ TextView ၏ Context ကိုသတးမြတးၿပီ့ Screen တျငးေပၚလာေစရနး ်ပဳလုပး
ေပ့ရပါဦ့မညး၈

setContentView(HelloWorldTextView);

အထကးပါ Code ကိုေလံလာ်ခငး့်ဖငးံ setContentView သညးအသစး်ပဳလုပးထာ့ေသာ TextView ကို


ညႊနး့ဆိုသညးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈ အဆိုပါ Code သဵု့ေၾကာငး့်ဖငးံ Hello World! Application ကို
်ပဳလုပး်ခငး့်ဖစးပါသညး၈ TextView တစးခုကိုတညးေဆာကး်ခငး့၇ ေဖား်ပမညး႕ Text ကို Assign ်ပဳလုပး်ခငး့
တို႕အ်ပငး Screen ေပၚတျငး အထကးပါအတိုငး့ေပၚလာေအာငး်ပဳလုပးၿပီ့ေသာအခါမြ Application သညး
အသကးွငးလာမညး်ဖစးသညး၈ အထကးပါ Code မ္ာ့ကိုေလံလာၿပီ့ေနာကး Code မ္ာ့သညး အလျနးတရာ
ရႈပးေထျ့ခကးခဲ်ခငး့မရိြေၾကာငး့ ေတျ႕ရိြရမညး်ဖစးပါသညး၈

HelloWorldText.java ဖိုငးတျငးလုပးေဆာငးခဲံသမြ္ေသာ Code သဵု့ေၾကာငး့စလဵု့ကိုစုေပါငး့၍ ဖိုငးတစးဖိုငး


လဵု့တျငးရိြေသာ Code အာ့လဵု့ကိုေအာကးပါပဵုတျငးေဖား်ပေပ့ထာ့ပါသညး၈

package android_programmers_guide.HelloWorldText;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloWorldText extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
/**Hello World JFD */
/**BEGIN */
/**Create TextView */
TextView HelloWorldTextView = new TextView(this);
/**Set text to Hello World */
HelloWorldTextView.setText("Hello World!");
/**Set ContentView to TextView */
setContentView(HelloWorldTextView);
/**END */
}
}

74 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး အသစး်ပဳလုပးထာ့ေသာ Hello World! Application ကို Android Emulator တျငး Complile
်ပဳလုပးေမာငး့ႏြငးၾကညး႕ပါမညး၈ ထိုသို႕်ပဳလုပးရနး Run Menu မြ Run သို႕မဟုတး Keyboard မြ Short-cut
Key ်ဖစးေသာ Ctrl+F11 ကိုတျဲႏိြပး်ခငး့်ဖငးံ Android Emulator တျငး Application ကိုေဖား်ပလာေစမညး
်ဖစးသညး၈ ေပၚလာမညး႕ပဵုကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

အထကးတျငးေဖား်ပထာ့သညးမ္ာ့ကိုလိုကးလဵလုပးေဆာငး်ခငး့်ဖငးံ ပထမဆဵု့ Android Activity တစးခုကို


တညးေဆာကးၿပီ့်ဖစးပါသညး၈ ထို Application သညး ရို့ရြငး့ေသာ Application တစးခုသာ်ဖစးေသားလညး့
Activity ContentView အတျငး့ TextView ကိုသတးမြတးရနးႏြငးံ Cell Phone Screen တျငး “Hello
World!” ဟူေသာ Message ကိုေဖား်ပရနးအသဵု့်ပဳခဲံပါသညး၈ ေအာကးတျငးဆကးလကးေလံလာရမညး႕
အေၾကာငး့အရာမြာ Hello World! ဟူေသာ Application ကိုပငး ပဵုတစးပဵုထညး႕သျငး့၍ ေဖား်ပမညး႕
Application တစးခု်ဖစးပါသညး၈

Hello World! Using an Image


ယခုအပိုငး့တျငး Hello World! ဟူေသာ Application ကိုပငး Programming အေလံအက္ငးံရေစရနး
အတျကးထပးမဵေရ့သာ့ၾကညး႕ပါမညး၈ ယခုတစးဖနးေရ့သာ့ရာတျငး Image မ္ာ့ကိုအသဵု့်ပဳမညး်ဖစးပါသညး၈
ေနာကးပိုငး့ကျနးပ္ဴတာႏြငးံ ဆကးစပးေသာနညး့ပညာမ္ာ့တျငး Graphic နညး့ပညာမပါလြ္ငး မ်ဖစးေသာ
ေၾကာငးံ Graphic ႏြငးံသကးဆိုငးေသာ Programming ေရ့သာ့နညး့မ္ာ့ကိုေလံလာသငးံပါသညး၈

မ္ကးပျငးံစာေပ 75
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

လျနးခဲံေသာငါ့ႏြစးခနး႕က Cell Phone တစးလဵု့တျငး Image မ္ာ့ကိုၾကညး႕ရြဳရနးအချငးံအေရ့မရိြခဲံပါ၈


သို႕ရာတျငးယေန႕တျငးမူ ကျနးပ္ဴတာတစးလဵု့ကိုအသဵု့်ပဳသကဲံသို႕ပငး Cell Phone မ္ာ့တျငး ေကာငး့မျနး
ေသာရုပးထျကး်ဖငးံ Graphic ပုဵမ္ာ့ကိုၾကညး႕ရြဳေနႏိုငးၿပီ်ဖစးပါသညး၈ ယခုေရ့သာ့မညး႕ Application သညး
Hello World! Application ပငး်ဖစးေသားလညး့ ပဵုတစးပဵုကိုထညး႕သျငး့ေဖား်ပမညး်ဖစးပါသညး၈

အဆိုပါ Application အတျကး Android Project Wizard အသစးတစးခုေခၚယူ၍ Project အသစးတစးခု


တညးေဆာကးကာ ထို Project ကိုေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ HelloWorldImage ဟု
အမညးေပ့ပါမညး၈

Application Project ကိုဖနးတီ့တညးေဆာကးၿပီ့သညး႕ေနာကးတျငး main.xml ဖိုငးမြ TextView Code


မ္ာ့ကိုဖယးထုတး ဖ္ကးပစးရပါမညး၈ အကယး၍ အဆိုပါ Code မ္ာ့ကိုသာမဖ္ကးပစးခဲံပါက Text အေ်ခ်ပဳ
Hello World ! Program ်ဖငးံပငးအဆဵု့သတးသျာ့ေစမညး်ဖစးသညး၈ အဆိုပါ main.xml ဖိုငးမြ TextView
Code မ္ာ့ဖ္ကး်ခငး့ကို ယခငးအပိုငး့တျငးေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈

76 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး Code မ္ာ့ကိုမေရ့သာ့မီတျငး Cell Phone ၏ Screen တျငးေဖား်ပရနးအတျကး Image ပဵုတစးပဵု


လိုအပးမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ အရျယးအစာ့ေသ့ငယးေသာ Image တစးခုကိဖနးတီ့ရပါမညး၈ ဖနးတီ့
ရာတျငး Microsoft Paint အပါအွငးအ်ခာ့ေသာ Software မ္ာ့်ဖငးံလညး့ ဆႏၵရိြသညး႕အတိုငး့ ဖနးတီ့
ႏိုငးပါသညး၈ ဤေနရာတျငးအသဵု့်ပဳမညး႕ Image ပဵုကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

ဖနးတီ့၍ရရိြလာေသာပဵုကို helloworld.png ဟုအမညးေပ့၍ %workspace%/HelloWorldImage/res/


drawable directory လမး့ေၾကာငး့တျငး သိမး့ဆညး့ကူ့ထညး႕ေပ့ထာ့ရပါမညး၈ သတိ်ပဳရနးမြာ Image ၏
အမညးေပ့ရာတျငးအကၡရာအႀကီ့အေသ့ကိုသတိ်ပဳပါ၈ အကၡရာအေသ့မ္ာ့ကိုသာအသဵု့်ပဳႏိုငးၿပီ့အကယ
၍ အကၡရာအႀကီ့စာ့မ္ာ့ကိုပါေရာေႏြာသဵု့စျဲခဲံပါက ထို Image ဖိုငးကိုသဵု့သညး႕အခါ Eclipse မြ Error
Message မ္ာ့်ပသႏိုငးပါသညး၈

ထို Image ဖိုငးကိုမန


ြ းကနးေသာ Directory အတျငး့သို႕ကူ့ယူၿပီ့ေနာကး Project ကို Refresh ်ပနးလုပးေပ့
ပါ၈ ထိုအခါ helloworld.png ဖိုငးကို Drawable directory အတျငး့ Project View အရ ေတျ႕ရိြရသညးက
ေအာကးေဖား်ပပါပဵုအရ ေတျ႕်မငးႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 77
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး R.java ဖိုငးကိုဖျငးံ၍ Code မ္ာ့ကိုၾကညး႕ပါ၈ Eclipse သညး helloworld.png ဖိုငးကို pointer
တစးခုအေန်ဖငးံ ေပါငး့ထညး႕ထာ့သညးကို ေအာကးတျငးေဖား်ပထာ့ေသာ Code အရ သိရိြႏိုငးပါသညး၈

/* AUTO-GENERATED FILE. DO NOT MODIFY.


*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/

package android_programmers_guide.HelloWorldImage;

public final class R {


public static final class attr {
}
public static final class drawable {
public static final int helloworld=0x7f020000;
public static final int icon=0x7f020001;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040000;
}
}

78 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခငးေဖား်ပခဲံၿပီ့်ဖစးေသာ Clean Application Shell တျငး Image တစးခုကုိ Display လုပးေဖား်ပေပ့ႏိုငး


ရနး Code မ္ာ့ကိုေရ့သာ့ရေတာံမညး်ဖစးသညး၈ ထိုသို႕ေရ့သာ့ရာတျငး အ်မငးႏြစးမ္ိဳ့်ဖငးံေဖား်ပမညး်ဖစးၿပီ့
တစးမ္ိဳ့မြာ XML အေ်ခ်ပဳ User Interface (XML Based UI) ႏြငးံ Code အေ်ခ်ပဳ User Interface (Code
Based UI) တို႕်ဖစးပါသညး၈

Hello World! Code-Based UI


ယခငးေဖား်ပခဲံေသာ HelloWorldText Application ကိုလိုကးလဵလုပးေဆာငးၾကညး႔ၿပီ့ နာ့လညးသညးဟ
ယူဆပါမညး၈ ထိုအခါ ယခုေဖား်ပမညး႕ Application သညး ပိုမိုလျယးကူသညးကို ေတျ႕ရမညး်ဖစးပါသညး၈
စတငးရနးအတျကး Image မ္ာ့ကို ေဖား်ပႏိုငးေသာ package ကို import ်ပဳလုပးသျငး့ယူေပ့ရနးလိုအပးပါ
မညး၈ TextView တစးခုကိုအသုဵု့်ပဳ၍ Text မ္ာ့ကိုေဖား်ပႏိုငးသညး႕အတိုငး့ပငး Image မ္ာ့ကိုေဖား်ပရနး
အတျကး ImageView ကိုအသဵု့်ပဳႏိုငးပါသညး၈ ထို႕ေၾကာငးံ ImageView package ကို import ်ပဳလုပးရပါ
မညး၈ TextView ကဲံသုိ႕ပငး ImageView သညးလညး့ android.widgets ထဲတျငးပါွငးပါသညး၈ Image
View ကိုထညး႕သျငး့ရနး ေအာကးပါ Code ကိုအသဵု့်ပဳရပါမညး၈

import android.widgets.ImageView;

ႊTextView ႏြငးံ ImageView ႏြစးခုလဵု့သညး View မြ ဆငး့သကးလာပါသညး၈ ထို View ႏြစးခုစလဵု့သညး


တစးခုႏြငးံတစးခုအလျနးဆငးတူၿပီ့ အသဵု့်ပဳရလညး့လျယးကူပါသညး၈ package ကို import ်ပဳလုပးထညး႕
သျငး့ၿပီ့ေနာကး ImageView ကိုဖနးတီ့တညးေဆာကး၍ Image ကို Screen ေပၚတျငးေဖား်ပႏိုငးၿပီ်ဖစးပါ
သညး၈ ImageView ကိုအသဵု့်ပဳရ်ခငး့သညး TextView ကိုအသဵု့်ပဳ်ခငး့ႏြငးံဆငးတူၿပီ့ this ကိုအသဵု့်ပဳ၍
ေအာကးေဖား်ပပါ Code အတိုငး့အသဵု့်ပဳရ်ခငး့်ဖစးပါသညး၈

ImageView HelloWorldImageView = new ImageView(this);

ေနာကးလာမညး႕ Code တျငး ImageView ႏြငးံ TextView ၏်ခာ့နာ့ခ္ကးမ္ာ့ကိုေတျ႕ရမညး်ဖစးပါသညး၈ ထို


အဆငးံတျငး ေဖား်ပလိုေသာ တစးစဵုတစးရာကို Setting ်ပဳလုပး်ခငး့ႏြငးံ သကးဆိုငးပါသညး၈ TextView ဥပမာ
တျငး TextView မြ “Hello World” ဟူေသာစာသာ့ေပၚလာေစရနး SetText () method ကိုအသဵု့်ပဳခဲံၾက
ပါသညး၈ Textview ႏြငးံ ImageView ႏြစးခုစလဵု့ကို View မြေမာငး့ႏြငးေသာအခါတျငး အသဵု့်ပဳပဵမ
ု ြာ ကျဲ်ပာ့
်ခာ့နာ့်ခငး့ေၾကာငးံ မတူညီေသာ နညး့လမး့မ္ာ့ကိုအသဵု့်ပဳရမညး်ဖစးပါသညး၈ သိသာထငးရြာ့စျာ်ဖင

မ္ကးပျငးံစာေပ 79
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

SetText () ဟူေသာ Method ကို ImageView တျငးအသဵု့မ်ပဳႏိုငးပါ၈ ထို႕ေၾကာငးံ setImageResource


ကို အသဵု့်ပဳရနးလိုအပးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code အရ setImageResource () သို႕
်ဖတးသနး့ၿပီ့ helloworld.png ဖိုငးကို R.java ဖိုငးမြဆျဲထုတးယူပါသညး၈ (အမြနးအသဵု့်ပဳရမညး႕ပဵုစဵမြာ
R.drawable.helloworld)

HelloWorldImageView.setImageResource(R.drawable.helloworld);

ေနာကးဆဵု့အဆငးံအေန်ဖငးံ Image ကို Screen ေပၚလာေစရနး်ပဳလုပးရပါမညး၈ ထိုသို႕်ပဳလုပးရနးအတျက


ContentView ကိုပငးအသဵု့်ပဳရပါမညး၈ TextView တျငးအသဵု့်ပဳခဲံသညး႕အတိုငး့ပငး ImageView ကိုလညး့
ContentView ကို်ဖတးသနး့၍သာ Screen ေပၚတျငး်ပသႏိုငးပါသညး၈ ContentView ၏လုပးေဆာငးခ္ကးမြာ
Object ကိုသတးမြတးကာ Screen ေပၚတျငး်ပသေပ့သညး႕ တာွနး်ဖစးပါသညး၈

setContentView(HelloWorldImageView);

ေနာကးဆဵု့တျငး ်ပငးဆငးထာ့သညး႕ HelloWorldImage.java ဖိုငးမြ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့


သညး႕ပဵုအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

package android_programmers_guide.HelloWorldImage;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class HelloWorldImage extends Activity {


/** Called when the activity is first created. */

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
/**Hello World Image JFD*/
/**BEGIN */
/**Create the ImageView */
ImageView HelloWorldImageView = new ImageView(this);
/**Set the ImageView to helloworld.png */
HelloWorldImageView.setImageResource(R.drawable.helloworld);
/**Set the ContentView to the ImageView */
setContentView(HelloWorldImageView);
/**END */
}
}

80 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး HelloWorldImage Application ကို Compile ်ပဳလုပး၍ Android Emulator အတျငး့တျငး


ေမာငး့ႏြငးၾကညး႕ပါ၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Run ေနသညးကိုေတျ႕ရမညး်ဖစးပါသညး၈

ေနာကးလာမညး႕အပိုငး့တျငး XML ကိုအသဵု့်ပဳ၍ Helloworld.png ကိုပငး Screen ေပၚတျငးေဖား်ပနိုငးေသာ


HelloWorldImage Application ကို ထပးမဵေလံလာၾကညး႕ၾကပါမညး၈

Hello World! XML-Based UI


ယခုေဖား်ပပါအေၾကာငး့အရာမ္ာ့ကိုေလံလာသညး႕အခါတျငး XM Based UI ကိုအသဵု့်ပဳရ်ခငး့ႏြငးံ Code
Based UI ကိုအသဵု့်ပဳရ်ခငး့တို႕၏ ကျာ်ခာ့ခ္ကးမ္ာ့ကို သိရိြရမညး်ဖစးပါသညး၈ main.xml ကိုအသဵု့်ပဳ၍
Image ကိုေဖား်ပသညး႕အခါတျငးလညး့ Code Based UI ကိုအသဵု့်ပဳခဲံစဥးက ေရ့သာ့ခဲံရေသာ Code
အေရအတျကးႏြငးံအတူတူေလာကးပငး ေရ့သာ့ရမညး်ဖစးပါသညး၈ သို႕ရာတျငး ေရ့သာ့မညး႕ပဵုစမ
ဵ ္ာ့မြာ
လဵု့ွဥသဵုကျာ်ခာ့ပါသညး၈

မ္ကးပျငးံစာေပ 81
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

လျနးခဲံေသာ ဥပမာတျငးအသဵု့်ပဳခဲံသညး႕ Project ကိုပငးအသဵု့်ပဳမညး်ဖစးၿပီ့ HelloWorldImage.java file


မြ TextView အတျကးေရ့သာ့ထာ့ေသာ Code မ္ာ့ကိုဖယးရြာ့ဖ္ကးပစးရပါမညး၈ ထိုအခါ မညးသညး႕လုပး
ေဆာငးခ္ကးမြ္မရိြေသာ file ကိုေအာကးပါ Code မ္ာ့အတိုငး့ေတျ႕ရမညး်ဖစးပါသညး၈

package android_programmers_guide.HelloWorldImage;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorldImage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}

ထို႕ေနာကး စတငးလုပးေဆာငးရနးအတျကး ရြငး့လငး့ေသာဖိုငးကိုရရိြၿပီ်ဖစးၿပီ့ main.xml သို႕သျာ့ေရာကးရ


ပါမညး၈ ထို႕ေနာကး ImageView တစးခုအတျကး Definition တစးခုကို ေပါငး့ထညး႕ေပ့ရနးလိုအပးပါမညး၈
ထို႕ေၾကာငးံ main.xml ဖိုငးတျငး empty imageView tag တစးခုကိုေပါငး့ထညး႕ေပ့ရပါမညး၈

<ImageView
/>

ထို႕ေနာကး ImageView ၏ attribute ေလ့ခုကို်ပငးဆငးရနးလိုပါသညး၈ ထို attribute ေလ့ခုမြာ


android:id, android:layout_width, android:layout_height ႏြငးံ android:src တို႕်ဖစးပါသညး၈ ထို
Attrbute မ္ာ့ကို အထကးတျငးေဖား်ပထာ့ေသာ ImageView Tag အတျငး့တျငးေရ့သာ့ရမညး်ဖစးပါသညး၈

android:id ဟူေသာ attribute ကို ImageView ၏ identifier ကိုသတးမြတးရနးအတျကးသဵု့ပါသညး၈


android:id attribute ကို Code အတျငး့မြ ImageView ကို refer ်ပဳလုပးရနးအတျကးအသဵု့်ပဳႏိုငပ
း ါသညး၈
R.layout.imageview ကိုအသဵု့်ပဳ၍ ေနာငးတျငး်ပနးလညးရယူႏိုငးေသာ identity တစးခုအ်ဖစး ImageView
တျငး assign ်ပဳလုပးႏိုငးရနး @+id/<name> ဟူေသာ ပဵုစဵ်ဖငးံအသဵု့်ပဳႏိုငးပါသညး၈

android:id="@+id/imageview"

အထကးေဖား်ပပါ Code line သညး အလိုအေလြ္ာကးထုတးေပ့ႏိုငးေသာ ID (@+id) ကို R.java


ဖိုငးအတျငး့ Imageview ဟူေသာနာမညးေအာကးတျငး ်ဖညး႕စျကးေစပါသညး၈

82 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

်ပငးဆငးထညး႕သျငး့ရနးလိုအပးေသာ ေနာကး attribute ႏြစးခုမြာ android:layout_width ႏြငးံ android:


layout_height တို႕်ဖစးပါသညး၈ ထို attribute မ္ာ့သညး Image ကို Screen အတျငး့ေပၚလာေစမညး႕
အေနအထာ့သို႕ကိုထိနး့ခ္ဳပးကျပးကဲေပ့ပါသညး၈ ထို attribute မ္ာ့တျငး တနးဖို့ကို Assign ်ပဳလုပးသတ
မြတးေသာအခါတျငး ေရျ့ခ္ယးရမညး႕ Option ႏြစးမ္ိဳ့ရိြပါသညး၈ Fill_parent value သညး ်မငးကျငး့်ပညး႕ခ္ဲ႕
ေပ့်ခငး့်ဖစးၿပီ့ Wrap_content value သညး Image ကိုအတိအက္သတးမြတးႏင
ို းေသားလညး့ အခ္ိဳ႕ေသာ
Image definition အခ္ိဳ႕မြာ လုပးေဆာငးခ္ကးမ္ာ့လုပးေဆာငးစဥးဆဵု့ရဵႈ့သျာ့ေစႏိုငးပါသညး၈ ယခုေဖား်ပမညး႕
ဥပမာတျငး Wrap_content ကိုသာအသဵု့်ပဳပါမညး၈

android:layout_width="wrap_content"
android:layout_height="wrap_content"

ေနာကးဆဵု့်ပငးဆငးရမညး႕ attribute ်ဖစးေသာ android:src သညးအေရ့အႀကီ့ဆဵု့ေသာ attribute လညး့


်ဖစးပါသညး၈ အဆုိပါ attribute သညး View သို႕ေဖား်ပလိုသညး႕ Image ကိုညျနး်ပေစပါသညး၈ ယခုဥပမာ
တျငးေဖား်ပလိုသညး႕ Image မြာ drawable/helloworld ဟူေသာ image ်ဖစးေသာေၾကာငးံ ေအာကးပါ
အတိုငး့ ေရ့သာ့ႏိုငးပါသညး၈

android:src="@drawable/helloworld"

ေရ့သာ့ထာ့သညး႕ ImageView Tag မြာ Code အ်ပညး႕အစဵုမြာေအာကးပါအတိုငး့်ဖစးပါသညး၈

<ImageView android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/helloworld"
/>

ေနာကးဆဵု့အေန်ဖငးံ Image ကို Screen တျငးေဖား်ပ်ခငး့မ်ပဳမီတျငး main.xml ကို HelloWorldImage


.java ဖိုငးတျငး setContentView အ်ဖစးေၾက်ငာေပ့ရနးအတျကး HelloWorldImage.java ဖိုငးတျငး
ေအာကးေဖား်ပပါ Code ကိုရိုကးထညး႕ေပ့ရပါမညး၈

setContentView(R.layout.main);

ထို႕ေနာကး HelloWorldImage ဖိုငးကို Compile ်ပဳလုပး၍ Run ပါ၈ ထျကးလာမညး႕ Screen ၏ပဵုကို
ေအာကးတျငးေဖား်ပထာ့ပါသညး၈

မ္ကးပျငးံစာေပ 83
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးပါအတိုငး့ Run ၿပီ့ေနာကးတျငး ေနာကးတစးမ္ိဳ့စမး့သပးၾကညး႕ၾကပါမညး၈ main.xml ဖိုငးသို႕်ပနး


လညးသျာ့ေရာကး၍ Wrap_content ဟုေရ့သာ့ထာ့ေသာ Layout မ္ာ့ကို fill_parent ဟုေ်ပာငး့လဲ
ေပ့ပါ၈ ေ်ပာငး့လဲၿပီ့ေနာကး main.xml ဖိုငးအတျငး့ရိြ Code မ္ာ့ကိုေအာကးေဖား်ပပါအတိုငး့ေတျ႕်မငးရပါ
လိမံးမညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView android:id="@+id/imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/helloworld"
/>
</LinearLayout>

ထို႕ေနာကး Application ကို်ပနး Run ၾကညး႕ၿပီ့ Wrap_content ဟုအသဵု့်ပဳ်ခငး့ႏြငးံ Fill_parent ဟုအသဵု့


်ပဳ်ခငး့တို႕ကျာ်ခာ့ပဵုကိုေလံလာၾကညး႕ပါ၈ Run လြ္ငးထျကးေပၚလာမညး႕ ပဵုကိုေအာကးတျငးေဖား်ပေပ့ထာ့
ပါသညး၈

84 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

(အိမးစာ)Use TextView and ImageView


Hello World! application ကိုတညးေဆာကးရနးအတျကး ယခုအခနး့တျငး လိုအပးေသာ skill မ္ာ့ႏြငးံ နညး့
စနစးမ္ာ့ကိုေဖား်ပခဲံၿပီ့်ဖစးသညး႕အတျကး ကိုယးတိုငးစမး့သပးလုပးေဆာငးၾကညး႕သငးံပါသညး၈ Application
တစးခုကိုတညးေဆာကးၿပီ့ TextView ႏြစးခုႏြငးံ Image ကို Screen ေပၚတျငး Text Caption ႏြငးံအတူတကျ
ေပၚေစရနး ImageView တစးခုကိုအသဵု့်ပဳပါ၈ ထိုသို႕လုပးေဆာငး်ခငး့သညး Activity အတျငး့ View တစးခု
ကိုအသဵု့်ပဳ်ခငး့ထကးအနညး့ငယးခကးခဲနိုငးပါသညး၈ ထို႕ေနာကးတညးေဆာကးထာ့ေသာ Application ကို
အလုပးလုပးေဆာငး်ခငး့ရိြ၇ မရိြ စမး့သပးၾကညး႕သငးံပါသညး၈

ေနာကးလာမညး႕အခနး့တျငး Hello World! Application ကိုပငး Eclipse မြ မဟုတးဘဲ Command Line


Programming ်ဖငးံေရ့သာ့ပဵုေရ့သာ့နညး့မ္ာ့ကို ေလံလာၾကရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 85
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

86 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 6
Using the Command-Line Tools and
the Android Emulator

မ္ကးပျငးံစာေပ 87
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Using the Android SDK Command-line tools
- Creating a command environment
- Navigating the Andoid server with a shell
- Using the Android SDK in Linux

ယခငးအပိုငး့တျငး Android Platform တစးခုအတျငး့တျငး Application တစးခုတညးေဆာကးေမာငး့ႏြငး်ခငး့


ကိုေဖား်ပေပ့ခဲံၿပီ့်ဖစးပါသညး၈ အဆိုပါအပိုငး့တျငး Eclipse ကိုအသဵု့်ပဳ၍ Small Android Application
တစးခုကိုတညးေဆာကးေမာငး့ႏြငး်ခငး့ကိုေဖား်ပေပ့ခဲံပါသညး၈ New Project တစးခုကိုတညးေဆာကးကာ
main.xml ဖိုငးႏြငးံ <activity>.java ဖိငးမ္ာ့ကို ်ပငးဆငးတညး့်ဖတးကာ R.java file ကို recompile ်ပဳလုပး
ခဲံၾကပါသညး၈ ထိုသို႕ေသာ်ပဳလုပးခ္ကးမ္ာ့သညး Android Application မ္ာ့ကိုတညးေဆာကးရာတျင
လိုအပးေသာအေ်ခခဵအေၾကာငး့အရာမ္ာ့သာ်ဖစးပါသညး၈

ထို႕ေၾကာငးံယခုအခနး့တျငး CommandLine Application Development ကိုအသဵု့်ပဳ၍ အဆိုပါအေၾကာငး့


အရာမ္ာ့ကို ်ဖနး႕ခ္ဲ႕ကာအသဵု့်ပဳၾကညး႕ၾကပါမညး၈ Android Development တျငး Eclipse IDE
တစးခုတညး့်ဖငးံသာအသဵု့်ပဳရမညးဟူေသာ ကနး႕သတးခ္ကးမရိြသ်ဖငးံ Graphical IDE တစးခု၏အကူအည
မရိြဘဲ Android SDK ကို Command Line Tool မ္ာ့်ဖငးံ Full application တစးခု်ဖစးေစသညးအထ
အသဵု့်ပဳႏိုငးပါသညး၈ ထုိ႕ေၾကာငးံ Command-Line Tool မ္ာ့ကိုအသဵု့်ပဳ၍ Hello World ! ဟူေသာ
Application ကိုပငး Windows အတျငး့တျငး တညးေဆာကး၇ Complile ်ပဳလုပး၇ ေမာငး့ႏြငးၾကညး႕ၾကပါမညး၈
ထိုထကးမကဘဲ Linux တျငးပါစမး့သပးလုပးေဆာငးၾကညး႕ၾကမညး်ဖစးပါသညး၈

Creating a Shel Acitivity Using the Window CLI


Android Application တစးခုကို တညးေဆာကး Complie ်ပဳလုပးရနး Android SDK သညး
မ္ာ့စျာေသာTool မ္ာ့်ဖငးံ ပဵံပို့ကူညီထာ့ပါသညး၈ အဆိုပါ Tool မ္ာ့သညး အသဵု့်ပဳသူမြ အသဵု့်ပဳလိုသညး႕
ဆႏၵရိြသညး်ဖစးေစ၇ မရိြသညး်ဖစးေစ System မြ Support ်ပဳလုပးေပ့ပါသညး၈ သို႕ရာတျငး Eclipse တစးခု
တညး့ကိုသာအသဵု့်ပဳမညးဟု ဆႏၵရိြသညး႕တိုငးေအာငး Android SDK Command Line Tool မ္ာ့ႏြငးံ ၁ငး့
Tool တို႕၏အလုပးလုပးေဆာငးပက
ဵု ိုသိရိြနာ့လညးထာ့သငးံပါသညး၈
88 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android Project တစးခုကိုတညးေဆာကး်ခငး့ သို႕မဟုတး Android Emulator တျငး Application တစးခုကို


ေမာငး့ႏြငး်ခငး့ကဲံသို႕ေသာ Android ႏြငံးဆကးႏျယးေသာ Function မ္ာ့ကို Run ေသာအခါတျငး အမြနး
တကယးပငး Android Command-line Tool မ္ာ့်ဖငးံ ခ္ိတဆ
း ကးပါသညး၈ အဆုိပါ Android command-
line tool မ္ာ့ကို Command-line interface မြ Run သညး်ဖစးေစ၇ GUI IDE မြ Run သညး်ဖစးေစ ၁ငး့
တို႕သညး Android SDK ၏ function က္လြေသာ Core မ္ာ့ပငး်ဖစးပါသညး၈

ေနာကးလာမညး႕အပိုငး့တျငး Android Tool တစးခု၏ Function မ္ာ့ကိုေဖား်ပေပ့မညး်ဖစးပါသညး၈


ActivityCreator.bat ဖိုငးသညး အစျမး့ထကးေသာ Tool တစးခု်ဖစးၿပီ့ Acitivity မ္ာ့၏ Shell မ္ာ့ကိုအသဵု့
်ပဳ၍ Program ေရ့သာ့သညး႕အခါ အလျနးအသဵု့တညး႕ေစပါသညး၈

Running the AcitvityCreator.bat


ActivityCreator.bat ဖိုငးကို Android SDK ၏ /tools/ directory အတျငး့တျငးေတျ႕ရိြႏိုငးပါသညး၈
Forward facing Command-line Tool အမ္ာ့စုကို Tools ၏ Root directory တျငးတညးရိြၾကပါသညး၈
Forward-facing Tool မ္ာ့ဆိုသညးမြာ /tools/ ဟူေသာ Directory ေအာကးမြ အ်ခာ့ေသာ Tool မ္ာ့ကို
ေခၚယူသဵု့စျဲေစႏိုငးေသာ Tool မ္ာ့်ဖစးသညး၈ ActivityCreator.bat သညးလညး့ Run ေသာအခါ
အ်ခာ့ေသာ Tool တစးခုကိုအမြနးတကယးေခၚယူႏိုငးေစေသာ Tool မ္ာ့ထဲမြ ဥပမာတစးခု်ဖစးပါသညး၈ vi,
Notepad သို႕မဟုတး အ်ခာ့ေသာ Text Editor တစးခုခုကိုအသဵု့်ပဳ၍ ActivityCreator.bat ကိုဖျငးံၾကညး႕
ႏိုငးၿပီ့ ထိုဖိုငးတျငးပါွငးေသာ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈ ActvityCreator.bat သညး
Android SDK မြ Microsoft Windows အတျကး သီ့သနး႕သတးမြတးထာ့ေသာဖိုငး်ဖစးပါသညး၈
ေနာကးပိုငး့တျငး Linux တျငးအသဵု့်ပဳေစႏိုငးေသာ ActivityCreator.py ဖိုငးကိုေလံလာရပါဦ့မညး၈

@echo off
rem Copyright (C) 2007 Google Inc.
rem
rem Licensed under the Apache License, Version 2.0 (the "License");
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

rem See the License for the specific language governing permissions and
rem limitations under the License.

မ္ကးပျငးံစာေပ 89
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

rem don't modify the caller's environment


setlocal

"%~dp0\lib\activityCreator\activityCreator.exe" %*

အထကးတျငးရိြေသာဖိုငးေအာကးဘကးမြ Code စာေၾကာငး့တစးေၾကာငး့မြတပါ့အ်ခာ့ေသာ Code မ္ာ့သညး


Rem Statement (batch file comment statement) မ္ာ့ခ္ညး့သာ်ဖစးသညး၈ ActivityCreator.bat ဖိုငး
ကို /tools/lib/activityCreator/ ဟူေသာ directory ထဲမြ ActivityCreator.exe ကိုေခၚယူရနးအသဵု့်ပဳပါ
သညး၈ အဆိုပါ ActivityCreator.bat ဖိုငးသညး SDK အတျငး့ရိြ အ်ခာ့ေသာ Tool မ္ာ့ကိုေခၚယူႏိုငးေသာ
Tool တစးခုအ်ဖစး နမူနာေပ့ရပါလိမးံမညး၈

ActivityCreator ကို Application ကို Develop ်ပဳလုပးရနးအတျကးလိုအပးေသာ ကနဦ့ဖိုငးမ္ာ့ကို


တညးေဆာကးရနးအတျကး လိုအပးေသာ development environment ကို်ပဌာနး့ရနးအတျကး အသဵု့်ပဳႏိုငး
ပါသညး၈ ထျကးေပၚလာမညး႕ Directory Structure သညး အခနး့ (၂) တျငးေဖား်ပခဲံေသာ Structure ႏြငးံ
အတူတူပငး်ဖစးၿပီ့ ActivityCreator သညး R.java ဖိုငး၇ AndroidManifest.xml ဖိုငးႏြငးံတကျ Application
ေရ့သာ့ရာတျငးလိုအပးသညး႕ ဖိုငးမြနးသမြ္ကို ဖနးတီ့တညးေဆာကးေပ့မညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ
Command-line environment သို႕သျာ့ေရာကးကာ ActivityCreator ကိုစတငးအသဵု့်ပဳၾကညး႕ပါမညး၈

ထို႕ေၾကာငးံ Start Menu > Run သို႕သျာ့ေရာကးကာ ေပၚလာေသာ Run Box တျငး cmd ဟုရိုကးထညး႕
ကာ OK ကို Click ႏိြပးပါ၈ (အကယး၍ Run ကိုရြာမေတျ႕ပါက Window +R ကိုတျဲႏိြပးပါ၈)

ထို႕ေနာကးေအာကးေဖား်ပပါပဵုအတိုငး့ Command Window ေပၚလာမညး၈ ထုိ Window သညး ယခငး


အသဵု့်ပဳခဲံသညး DOS Operating Environment ႏြငးံ အတူအတနးတူညီပါသညး၈

ထို႕ေနာကး အထကးပါအတိုငး့ Command Window ပျငးံလာေသာအခါတျငး Command Prompt တျငး


ActivityCreator ဟုရိုကးထညး႕ေပ့ရပါမညး၈ ထို႕ေနာကး Enter ႏိြပးပါ၈ သတိ်ပဳရနးအခ္ကးမြာ Microsoft ၏

90 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Command Prompt interface သညး Default အာ့်ဖငးံ Case Sensitive (အကၡရာအႀကီ့အေသ့ ကျာ
်ခာ့်ခငး့မရိြပါ) မ်ဖစးေသားလညး့ Linux/ Unix System ကိုအသဵု့်ပဳသညး႕အခါတျငး Case Sensitive ်ဖစး
သညးကို နာ့လညးသိရိြထာ့ရပါမညး၈ ActivityCreator.bat ကို ေမာငး့ႏြငးေစမညး႕ ActivityCreator ဟူ
ေသာ Command ကိုေမာငး့ႏြငးၾကညး႕ေသာအခါတျငး ေအာကးေဖား်ပပါ Output ကို Screen တျငးေတျ႕်မငး
ရမညး်ဖစးပါသညး၈

Activity Creator Script


Usage:
activityCreator [--out outdir] [--ide intellij] yourpackagename.ActivityName

Creates the structure of a minimal Android application.


The following will be created:
- AndroidManifest.xml: The application manifest file.
- build.xml: An Ant script to build/package the application.
- res : The resource directory.
- src : The source directory
- src/your/package/name/ActivityName.java the Activity java class.
PackageName is a fully qualified java Package in the format
<package1>.<package2>... (with at least two components).
- bin : The output folder for the build script.

Options:
--out <folder>: specifies where to create the files/folders.
--ide intellij: creates project files for IntelliJ

အထကးတျငးေဖား်ပထာ့ေသာ Output အရ ActivityCreator ကို Run ရနးအတျကး အခ္ကးအလကးမ္ာ့


ပိုမိုလိုအပးသညးဆိုေသာအခ္ကးကိုသိရိြရပါသညး၈ ထို႕ေၾကာငးံ Command ကို Directory လမး့ေၾကာငး့
ႏြငးံတကျ Pass လုပးေပ့ရနးလိုအပးမညး်ဖစးသညး၈

ActivityCreator Command ၏ Output တျငးအသဵု့်ပဳရနးလဵုေလာကးမႈမရိြေသာအခ္ကးအမ္ာ့ကိုေဖား်ပ


ေပ့မညး်ဖစးကာ Tool ကိုအသဵု့်ပဳသညး႕အခါတျငး ဖနးတီ့ေပ့မညး႕ file စာရငး့အ်ပညး႕အစဵုကိုလညး့ ေဖား
်ပေပ့ပါလိမးံမညး၈ ထိုအခ္ကးသညး အခနး့ (၂)တျငးေဖား်ပခဲံၿပီ့်ဖစးေသာအေၾကာငး့အရာမ္ာ့ႏြငးံတူညီေသာ
လညး့ build.xml ဖိုငးကို Eclipse အသဵု့်ပဳသူ User မ္ာ့မြ တုိကးရိုကး်ပသ်ခငး့မ်ပဳႏိုငးပါ၈

ထို႕ေနာကး Command Window ကုိ်ပနးသျာ့၍ ေအာကးတျငးေဖား်ပထာ့ေသာ Option မ္ာ့ႏြငးံအတူ


ActivityCreator ကို်ပနးလညးေမာငး့ႏြငးေပ့ရပါမညး၈ (ActivityCreator သညး Unix တျငးအသဵု့်ပဳသကဲံသို႕
forward slashes မ္ာ့ကိုလညး့ Unix/Linux တို႕တျငး Programming ေရ့သာ့သညး႕အခါတျငး အသဵု့်ပဳ
ႏိုငးပါသညး၈)

မ္ကးပျငးံစာေပ 91
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

--out c:\AndroidHelloWorld\android_programmers_guide.HelloWorldCommandLine

--out ဟူေသာ Option သညး တစးစဵုတစးရာကို Output ထုတးေပ့ရနးအတျကး ActivityCreator ကို ေ်ပာ်ပ
ေပ့ႏိုငးပါသညး၈ ထို Command Option တျငး Paramter ႏြစးခုရိြၿပီ့ <folder> ႏြငံး <package.activity>
တို႕်ဖစးပါသညး၈ ေဖား်ပခဲံၿပီ့ေသာ Command အရ AcitivityCreator ကို မရိြေသ့ေသာ Folder ်ဖစးေသာ
C:\AndroidHelloWorld တျငး Shell Application တစးခုကို ်ပဳလုပးေပ့ႏိုငးပါသညး၈ သတိ်ပဳရနးမြာ
တညးေဆာကးခိုငး့သညး႕ Project ရိြမညး႕ Folder ကို မ်ပဳလုပးရေသ့လြ္ငး ActivityCreator မြ အလို
အေလြ္ာကး်ပဳလုပးေပ့ႏိုငးပါသညး၈ --out option ၏ ဒုတိယ Parameter မြာ Package name ႏြငးံ activity
name တို႕်ဖစးပါသညး၈ ယခငးအခနး့တျငးေဖား်ပခဲံၿပီ့်ဖစးေသာ အမညးမ္ာ့ကိုယူသဵု့မညး်ဖစးေသာေၾကာင
ယခု Project အတျကး package name တျငး android_programmers_guide ဟုသတးမြတးေပ့ၿပီ့
Activity name ကို HelloWorldCommandLine ဟုသတးမြတးေပ့ရပါမညး၈

ActivityCreator ကို ေအာငး်မငးစျာ Run ႏိုငးေစရနး ေဖား်ပခဲံၿပီ့ေသာ Parameter ကိုအသဵု့်ပဳရနးလိုအပးၿပီ့


Setup ်ပဳလုပးရမညး႕ ကနဦ့ Environment သညး ယခငး်ပဳလုပးခဲံၿပီ့ေသာ New Android Project
Wizard ၏ ်ပဳလုပးပဵုနြငးံတူညီပါသညး၈

ActivityCreator ကို New Command-line Option အတျငး့ အထကးတျငးေဖား်ပခဲံၿပီ့်ဖစးေသာ


Parameter ႏြငးံပူ့တျဲ Run လိုကးေသာအခါတျငး ေအာကးတျငးေဖား်ပထာ့ေသာ Output ကို Tool မြ ထုတး
ေပ့မညး်ဖစးပါသညး၈

92 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အထကးတျငးေဖား်ပခဲံေသာလုပးေဆာငးခ္ကးမ္ာ့အရ ActivityCreator ကိုအသဵု့်ပဳ၍ Project တစးခုတညး


ေဆာကးရာတျငး Eclipse ကိုအသဵု့်ပဳတညးေဆာကး်ခငး့လုပးေဆာငးခ္ကးႏြငးံ မဆိုစေလာကးသာ ကျာ်ခာ့မႈ
ရိြသညးကိုေတျ႕်မငးရပါလိမးံမညး၈

The Project Structure


AcitvityCreator သညးDevelopment ်ပဳလုပး်ခငး့ကိုစတငးရနးအတျကးႏြငးံစတငးအသဵု့်ပဳႏိုငးရနး Directory
အမ္ာ့အ်ပာ့ႏြငးံဖိုငးအမ္ာ့အ်ပာ့ကို တညးေဆာကးေပ့ပါသညး၈ ထို Directory Structure မ္ာ့ကိုၾကညး႕ရြဳ
ႏိုငးေစရနး c:\AndroidHelloWorld\ ဟူေသာ Directory သို႕ွငးေရာကးၾကညး႕ရြဳႏိုငးပါသညး၈ ေအာကးတျငး
ေဖား်ပထာ့ေသာပဵုတျငး ActivityCreator မြတညးေဆာကးေပ့ထာ့ေသာ Directory Structure ကိုေတျ႕်မငး
ရမညး်ဖစးပါသညး၈

Eclipse environment တျငးအသဵု့်ပဳ်ခငး့မဟုတးေသာေၾကာငးံ ကျဲ်ပာ့မႈအနညး့ငယးခနး႕ႀကဵဳေတျ႕ရပါမညး၈


Eclipse ကဲံသို႕ေသာ IDE မ္ာ့တျငး လုပးေဆာငးသညး႕အခါတျငး တိက္ေသာ လိုအပးေသာ function
မ္ာ့ကို ေနာကးကျယးတျငး်ပဳလုပးသျာ့်ခငး့်ဖစးသညး၈ အဆိုပါအလုပးမ္ာ့ကို IDE တစးခုခု၏အကူအညီမပါဘ

မ္ကးပျငးံစာေပ 93
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အသဵု့်ပဳရာတျငး ActivityCreator သညး Project ကိုတညးေဆာကးရာတျငး လိုအပးေသာ Compiler သဖျယး


ေဆာငးရျကးေပ့မညး႕ File တစးဖိုငးကိုတညးေဆာကးပါသညး၈ ထို႕ေၾကာငးံ ActivityCreator ကို Manual
အေန်ဖငးံအသဵု့်ပဳေသာအခါတျငး build.xml ဖိုငးတစးဖိုငးကို Project အတျကး်ပဳလုပးေပ့ပါသညး၈ Eclipse
ကိုအသဵု့်ပဳ၍ Android Project ကိုတညးေဆာကးရာတျငး အဆိုပါဖိုငးကို တညးေဆာကးေပ့်ခငး့မရိြပါ၈
ထိုဖိုငးတျငး .java file မ္ာ့ကို Android Project သို႕ေ်ပာငး့လဲေသာအခါတျငး ်ပဳလုပးရမညး႕ အဆငးံ
လုပးေဆာငးခ္ကးမ္ာ့ကို ရြငး့်ပထာ့ေသာအေၾကာငး့အရာမ္ာ့ပါွငးပါသညး၈

Build.xml ဖုိငးသညး Application တညးေဆာကးရာတျငး လိုအပးခ္ကးမ္ာ့ကို Compiler သို႕ညႊနး်ပေ်ပာဆို


ပါသညး၈ ယခုဥပမာတျငး အသဵု့်ပဳမညး႕ Complier မြာ Java အေ်ခ်ပဳ Tool တစးခု်ဖစးၿပီ့ Script သဖျယး
ေရ့သာ့ထာ့ေသာ Project အ်ဖစး Compile ်ပဳလုပးနိုငးေသာ Apache ANT ပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ
ေရ့သာ့ထာ့ေသာ Command-line project မ္ာ့ကို compile ်ပဳလုပးရနး အဆိုပါ ANT ဖိုငးကို Download
်ပဳလုပးရနးလိုအပးပါမညး၈ ထို ANT ဖိုငးကို http://ant.apache.org/bindownload.cgi ဟူေသာ Website
မြ Download ်ပဳလုပးႏိုငးပါသညး၈ ANT ဖိုငးကို Download ်ပဳလုပးၿပီ့ Install ်ပဳလုပးရပါမညး၈ Install
်ပဳလုပးၿပီ့ေနာကးတျငး PATH statement ကို ေပါငး့ထညး႕ေပ့ရပါမညး၈ ထိုသို႕်ပဳလုပးရနးအတျက
Windows စနစးကိုအသဵု့်ပဳေသာ Computer တျငး Computer တျငး Right Click ႏိြပးၿပီ့ Properties
ကိုေရျ့ခ္ယးေပ့ရပါမညး၈ ထို႕ေနာကး System Variable အတျငး့တျငး PATH statement ကိုေ်ပာငး့လဲႏိုငး
ပါသညး၈

ANT အတျကး Android application ကို Compile ်ပဳလုပးရတျငး အသဵု့်ပဳရနးအတါကး build.xml ဖိုငးကို
တညးေဆာကးပါသညး၈ ထိုဖိုငးကို အထကးတျငးေဖား်ပခဲံၿပီ့ေသာ ပဵုအတိုငး့ပငး Project ထာ့ရိြေသာ Root
Directory အတျငး့တျငး ရြာေဖျေတျ႕ရိြႏိုငးပါသညး၈ ထို build.xml ဖိုငးကို text editor တစးခုခု်ဖငးံ ဖျငးံ၍
ေရ့သာ့ထာ့ေသာ Code မ္ာ့ကို ၾကညး႕ႏိုငးပါသညး၈ build.xml ဖိုငး၏ ပထမပိုငး့တျငး အသဵု့်ပဳသူ user
မ္ာ့မြ ်ပငးဆငးႏိုငးေသာ Code မ္ာ့ပါွငးပါသညး၈ ထိုဖိုငးမြ ်ပငးဆငးႏိုငးေသာ အပိုငး့ကို ေအာကးတျငးေဖား်ပ
ထာ့ၿပီ့ ထိုဖိုငးမြအ်ခာ့ေသာ Code မ္ာ့ကို်ပငးဆငးႏိုငးချငးံမရိြေသာေၾကာငးံ ေဖား်ပ်ခငး့မ်ပဳေတာံပါ၈

94 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<?xml version="1.0" ?>


<project name="HelloWorldCommandLine" default="package">
<property name="sdk-folder" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows" />
<property name="android-tools" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows\tools" />
<property name="android-framework" value="${android-
tools}/lib/framework.aidl"
/>
<!-- The intermediates directory -->
<!-- Eclipse uses "bin" for its own output, so we do the same. -->
<property name="outdir" value="bin" />

Build.xml ဖိုငး၏ ပထမ Section တျငး ေအာကးတျငးေဖား်ပထာ့ေသာ Properties မ္ာ့အတျကး Value မ္ာ့
ပါွငးပါသညး၈

 Project name
 Android SDK location
 Android tools location
 Android framework location
 Output Location တို႕်ဖစးသညး၈

အကယး၍ Project အတျကးအထကးပါ Parameter တစးခုခု၏ Value ကိုေ်ပာငး့လဲရနးလိုအပးပါက ယခု


build.xml ဖိုငးတျငွ
း ငးေရာကး ်ပငးဆငးေ်ပာငး့လဲႏိုငးပါသညး၈ သို႕ရာတျငး build.xml အတျငး့ ေအာကးတျငး
ေဖား်ပထာ့ေသာ Code ေအာကးမြ Code မ္ာ့ကိုမူ ်ပငးဆငး်ခငး့မ်ပဳရနး သတိေပ့ထာ့ပါသညး၈

<!-- No user servicable parts below. -->

အကယး၍ Project အတျကးအထကးပါ Parameter တစးခုခု၏ Value ကိုေ်ပာငး့လဲရနးလိုအပးပါက ယခု


build.xml ဖိုငးတျငွ
း ငးေရာကး ်ပငးဆငးေ်ပာငး့လဲႏိုငးပါသညး၈ သို႕ရာတျငး build.xml အတျငး့ ေအာကးတျငး
ေဖား်ပထာ့ေသာ Code ေအာကးမြ Code မ္ာ့ကိုမူ ်ပငးဆငး်ခငး့မ်ပဳရနး သတိေပ့ထာ့ပါသညး၈ ေဖား်ပပါ
သတိေပ့ခ္ကးေအာကးမြ Code မ္ာ့၇ Parameter မ္ာ့ႏြငးံ Value မ္ာ့သညး Project အတျကး ်ပငးဆငးချငးံ
မရိြသညး႕ Code မ္ာ့်ဖစးပါသညး၈ ထိုစာရငး့တျငး Compiler Option မ္ာ့၇ Input Directory မ္ာ့ႏြငးံ Tool
location မ္ာ့ပါွငးပါသညး၈ ထို႕ေၾကာငးံ build.xml ဖိုငး၏ Core processing information မ္ာ့အေၾကာငး့
ေဖား်ပထာ့ခ္ကးမ္ာ့ကို ေလံလာသငးံပါသညး၈ မြတးသာ့ရနးမြာ အကယး၍ ANT ၏အလုပးလုပးေဆာငးခ္က

မ္ကးပျငးံစာေပ 95
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ကိုေကာငး့မျနးစျာနာ့လညးသိရိြထာ့ခဲံပါကေအာကးတျငးေဖား်ပထာ့သညး႕မေ်ပာငး့လဲသငးံေသာ Parameter
မ္ာ့ကိုပါ မိမိလိုအပးခ္ကးႏြငးံကိုကးညီေအာငးအထိ ်ပငးဆငးႏိုငးပါသညး၈

<!-- Input directories -->


<property name="resource-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="srcdir" value="src" />

<!-- Output directories -->


<property name="outdir-classes" value="${outdir}/classes" />

<!-- Create R.java in the source directory -->


<property name="outdir-r" value="src" />

<!-- Intermediate files -->


<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${outdir}/${dex-file}" />
<!-- The final package file to generate -->
<property name="out-package" value="${outdir}/${ant.project.name}.apk"/>
<!-- Tools -->
<property name="aapt" value="${android-tools}/aapt" />
<property name="aidl" value="${android-tools}/aidl" />

<property name="dx" value="${android-tools}/dx" />


<property name="adb" value="${android-tools}/adb" />
<property name="android-jar" value="${sdk-folder}/android.jar" />
<property name="zip" value="zip" />

<!-- Rules -->

<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
</target>

<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="compile" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-r}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />

96 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<arg value="${android-jar}" />


</exec>
</target>

<!-- Generate java classes from .aidl files. -->


<target name="aidl" depends="dirs">
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android-framework}" />
<arg value="-I${srcdir}" />
<fileset dir="${srcdir}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target>

<!-- Compile this project's .java files into .class files. -->
<target name="compile" depends="dirs, resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
srcdir="."
destdir="${outdir-classes}"
bootclasspath="${android-jar}" />
</target>

<!-- Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
<exec executable="${dx}" failonerror="true">
<arg value="-JXmx384M" />
<arg value="--dex" />
<arg value="--output=${basedir}/${intermediate-dex}" />
<arg value="--locals=full" />
<arg value="--positions=lines" />
<arg path="${basedir}/${outdir-classes}" />
</exec>
</target>

<!-- Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>

မ္ကးပျငးံစာေပ 97
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<!-- Same as package-res-and-assets, but without "-A ${asset-dir}" -->


<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>

<!-- Invoke the proper target depending on whether or not


an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir"
property="res-target" value="and-assets" />
<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>
<!-- Put the project's .class files into the output package file. -->
<target name="package-java" depends="compile, package-res">
<echo>Packaging java...</echo>
<jar destfile="${out-package}"
basedir="${outdir-classes}"
update="true" />
</target>

<!-- Put the project's .dex files into the output package file.
Use the zip command, available on most unix/Linux/MacOS systems,
to create the new package (Ant 1.7 has an internal zip command,
however Ant 1.6.5 lacks it and is still widely installed.)
-->
<target name="package-dex" depends="dex, package-res">
<echo>Packaging dex...</echo>
<exec executable="${zip}" failonerror="true">
<arg value="-qj" />
<arg value="${out-package}" />
<arg value="${intermediate-dex}" />
</exec>
</target>

<!-- Create the package file for this project from the sources. -->
<target name="package" depends="package-dex" />

98 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<!-- Create the package and install package on the default emulator -->
<target name="install" depends="package">
<echo>Sending package to default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="${out-package}" />
</exec>
</target>

</project>

ယခုအခါတျငး build.xml ဖိုငးကို manual နညး့လမး့်ဖငးံ အသဵု့်ပဳ်ခငး့၇ Android Projcet မ္ာ့ကို


Command-line ်ဖငးံ တညးေဆာကး်ခငး့ႏြငးံ Projcect File မ္ာ့်ပငးဆငး်ခငး့တို႕သာမက Anroid Activity
မ္ာ့တညးေဆာကးပဵုကို ေကာငး့စျာနာ့လညးၿပီ့်ဖစးသညးဟုယူဆပါမညး၈ ထို႕ေနာကး ပထမဆဵု့ေလံလာရ
မညး႕ဖိုငးမ္ာ main.xml ဖိုငးပငး်ဖစးပါသညး၈ Windows Explorer ကို အသဵု့်ပဳၿပီ့
AndroidHelloWorld\res\layout ဟူေသာ folder အတျငး့မြ main.xml ကို ဖျငးံၾကညး႕ရပါမညး၈

Creating the Hello World! Activity in the Windows


CLI
ယခုအပိုငး့တျငး Command-line interface ကိုအသဵု့်ပဳ၍ Project file မ္ာ့ကို်ပငးဆငး်ခငး့အေၾကာငး့က
ေဖား်ပမညး်ဖစးပါသညး၈ ်ပငးဆငးရမညး႕ဖိုငးမ္ာ့မြာ အထကးတျငးေဖား်ပခဲံေသာ ActivityCreator.bat ဖိုငးကို
အသဵု့်ပဳ်ခငး့်ဖငးံရရိြလာေသာ Project File မ္ာ့်ဖစးပါသညး၈ Eclipse ကိုအသဵု့မ်ပဳဘဲ အဆိုပါ ဖိုငးမ္ာ့ကို
်ပငးဆငး်ခငး့၇ အဆိုပါဖိုငးမ္ာ့အတျငး့တျငး Code မ္ာ့ထညး႕သျငး့်ခငး့စေသာလုပးေဆာငးခ္ကးမ္ာ့ကို ယခု
အပိုငး့တျငး လုပးေဆာငးၾကညး႕ရပါမညး၈

Editing the Project Files


main.xml ဖိုငးကို XML editor သို႕မဟုတး (အကယး၍ သီ့သနး႕အသဵု့်ပဳရေသာ XML editor မရိြလြ္ငး)
Notepad တျငးဖျငးံပါ၈ ထို႕ေနာကး ထို main.xml ဖိုငးအတျငး့မြ <TextView/> definition ကိုဖ္ကးၿပီ့
်ပငးဆငးရပါမညး၈ ထို႕ေနာကး ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအတိုငး့ main.xml ဖိုငးကို Save ်ပဳလုပးသိမး့
ဆညး့ပါ၈

မ္ကးပျငးံစာေပ 99
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Save လုပးသိမး့ဆညး့လိုကးေသာ main.xml ဖိုငးသညး အချဵ Shell တစးခု်ဖစးသညး၈ ၁ငး့သညး


<activity>.java ဖိုငးကို်ပငးဆငးရနးအတျကး Platform တစးခုသတးမြတးေပ့်ခငး့ဟုလညး့ ဆိုႏိုငးပါသညး၈
အဆိုပါ <activity>.java ဖိုငးကို Directory ချဲေပါငး့မ္ာ့စျာရိြေသာ Folder တျငးရိြၿပီ့ အတိအက္ဆိုရလြ္င
AnroidHelloWorld\src\android\programmers\guide တျငွ
း ငးၾကညး႕ႏိုငးပါသညး၈ Hello World!
Application ကို်ပနးးလညးတညးေဆာကးရနးအတျကး TextView တစးခုကို တညးေဆာကးရနး၇ သတးမြတးရန
ႏြငးံအသဵု့်ပဳရနးအတျကး ေအာကးပါ Code Line မ္ာ့ကို ေပါငး့ထညး႕ရပါမညး၈

/**Hello World JFD */


/**BEGIN */
/**Create TextView */
TextView HelloWorldTextView = new TextView(this);
/**Set text to Hello World */
HelloWorldTextView.setText("Hello World!");
/**Set ContentView to TextView */
setContentView(HelloWorldTextView);
/**END

ထို႕ေနာကး HelloWorldCommandLine.java ဖိုငးထဲတျငး TextView Package ကိုထညး႕သျငး့ရနး


မေမံေလြ္ာံသငးံပါ၈ ေအာကးေဖား်ပပါ Code ကိုထညး႕သျငး့ေပ့ရပါမညး၈

import android.widget.TextView;

ထညး႕သျငး့ၿပီ့ေသာ HelloWorldCommandLine.java ဖုိငးမြ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ေသာ


ပဵုအတိုငး့ေတျ႕ရိြရမညး်ဖစးပါသညး၈

100 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး Project File မ္ာ့ကိုသတးမြတးေပ့သငးံပါသညး၈ ထို႕ေနာကး Program ကို Compile ်ပဳလုပးၿပီ့


Anroid Emulator အတျငး့တျငး Run ၾကညး႕ႏိုငးၿပီ်ဖစးသညး၈

Adding the JAVA_HOME Variable


Project ကို Compile မ်ပဳလုပးမီတျငး JDK ကိုညႊနးေပ့ႏိုငးေသာ environment variable ေနာကးတစးခုက
PC_JAVA_HOME သို႕ထညး႕သျငး့ေပ့ရပါမညး၈ ထို လမး့ေၾကာငး့သညး PATH statement တျငးအသဵု့်ပဳ
ထာ့သညး႕တိုငးေအာငးပငး JAVA_HOME ဟူေသာ Variable အသစးတစးခုကို မ်ဖစးမေန တညးေဆာကး
ေပ့ရပါမညး၈ JAVA_HOME ဟူေသာ variable ကို Command-line environment ကိုအသဵု့်ပဳေသာအခါ
တျငးသာလိုအပးၿပီ့ အကယး၍ Eclipse ကိုသာအသဵု့်ပဳမညးဆိုပါက အဆိုပါ Variable ကိုတညးေဆာကးေန
စရာမလိုပါ၈

ှ၈ Computer (My Computer) ကို Right Click ႏြိပၿး ပီ့ Properties ကိုေရျ့ခ္ယးပါ၈

ဿ၈ ထိုမြ Advanced System Settings ကိုေရျ့ခ္ယးၿပီ့ ေပၚလာေသာ Dialogbox ေပၚတျငး Advanced


ဟူေသာ Tab ကိုေရျ့ခ္ယးပါ၈ ထို႕ေနာကး Environment Variable ခလုတးကိုထပးမဵတစးခ္ကးႏိြပးေပ့ပါ၈

၀၈ Environment Variable Window ေပၚလာေသာအခါတျငး New ခလုတးကိုတစးခ္ကးႏိြပး၍ New


Variable Name တျငး JAVA_HOME ဟုအမညးေပ့ၿပီ့ Value တျငး Java SDK ရိြသညး႕ လမး့ေၾကာငး့
အ်ပညး႕အစဵုကို ရိုကးထညး႕ေပ့ရပါမညး၈ ေအာကးေဖား်ပပါပဵုတျငးေဖား်ပထာ့ပါသညး၈

မ္ကးပျငးံစာေပ 101
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Compiling and Installing the Application


ယခုအခ္ိနးသညး စမး့သပးရမညး႕အခ္ိနးပငး်ဖစးပါသညး၈ Command-line ်ဖငးံေရ့သာ့ထာ့ေသာ Project
ကို Compile ်ပဳလုပးႏိုငးၿပီ်ဖစးသညး၈ ထိုသို႕ Compile ်ပဳလုပးရနးအတျကး ANT ကိုအသဵု့်ပဳရပါမညး၈
Project ကို Compile ်ပဳလုပးၿပီ့ေသာအခါတျငး ၁ငး့ကို Emulator အတျငး့တျငး Install ်ပဳလုပးရပါမညး၈

Compiling Your Project with ANT

ဲJAVA_HOME environment variable ကိုသတးမြတးၿပီ့ေသာအခါတျငး PATH statement အတျငး့တျငး


ANT ကိုရရိြလာေစမညး်ဖစးကာ တညးေဆာကးထာ့ေသာ build.xml ဖိုငးရိြသညး႕ Directory လမး့ေၾကာငး့

102 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

သို႕ွငးေရာကး၍ ant ဟူေသာ Command ကိုအသဵု့်ပဳ၍ Run ႏိုငးပါသညး၈ Project Directory အတျငး့
တျငး Command Prompt Window ကိုဖျငးံၿပီ့ ant ဟုရိုကးထညး႕၍ ေအာကးပါပဵုအတိုငး့ Run ႏိုငးပါသညး၈

ant Command ကို Run ်ခငး့်ဖငးံ .apk ဖိုငးရရိြလာမညး်ဖစးၿပီ့ Emulator အတျငး့ တိုကးရိုကး Install
်ပဳလုပးႏိုငးေသားလညး့ Eclipse ကိုအသဵု့်ပဳခဲံစဥးကလညး့ တိုကးရိုကး Install ်ပဳလုပးခဲံ်ခငး့်ဖစးေသာေၾကာင
ယခုေနရာတျငး Manual နညး့်ဖငးံသာ Install ်ပဳလုပးၾကညး႕ၾကပါမညး၈ ထိုသို႕်ပဳလုပးရနး Android Debug
Bridge (adb) Android Tool ကိုအသဵု့်ပဳရမညး်ဖစးၿပီ့ ေနာကးအပိုငး့တစးခုတျငး အသဵု့်ပဳပဵုမ္ာ့ကို ေဖား်ပ
ေပ့ထာ့ပါသညး၈

What to Do if Running ant Produces an Error

အကယး၍ Application Project ကို Run သညး႕အခါတျငး ANT Command မြ Error တစးခုကို ထုတးေပ့
ခဲံလြ္ငးလညး့ စို့ရိမးစရာမလိုပါ၈ ထိုသို႕ ထျကးလာႏိုငးသညး႕ Error ကိုေအာကးေဖား်ပပါပဵုတျငး ေဖား်ပထာ့ပါ
သညး၈

မ္ကးပျငးံစာေပ 103
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေ်ဖရြငး့ရနးနညး့လမး့မြာ build.xml ကို်ပငးဆငးရ်ခငး့်ဖစးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code


မ္ာ့သညး်ပငးဆငးထာ့ေသာ Code မ္ာ့်ဖစးၿပီ့ အမြနးတကယး ရိြေနေသာ Code မ္ာ့်ဖငးံ တိုကးဆိုငးစစးေဆ့
၍ လိုအပးသညးမ္ာ့ကို ်ဖညး႕စျကး်ပငးဆငးေပ့ရပါမညး၈ ေ်ပာငး့လဲသျာ့ေသာ code မ္ာ့ကို စာလဵု့အမဲ
(Bold) ်ဖငးံေဖား်ပထာ့ပါသညး၈ ေလံလာၾကညး႕ႏိုငးပါသညး၈

<?xml version="1.0" ?>


<project name="HelloWorldCommandLine" default="package" basedir=".">
<property name="sdk-folder" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows" />
<property name="android-tools" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows\tools" />
<property name="android-framework" value="${android-
tools}/lib/framework.aidl"
/>

<!-- The intermediates directory -->


<!-- Eclipse uses "bin" for its own output, so we do the same. -->
<!-- Use full path for output dir - FIX - BLOCK START -->
<property name="outdir" value="${basedir}/bin" />
<!-- Use full path for output dir - FIX - BLOCK END -->

<!-- No user servicable parts below. -->

<!-- Input directories -->

<property name="resource-dir" value="res" />


<property name="asset-dir" value="assets" />
<property name="srcdir" value="src" />
<!-- Output directories -->
<property name="outdir-classes" value="${outdir}/classes" />

<!-- Create R.java in the source directory -->


<property name="outdir-r" value="src" />

104 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<!-- Intermediate files -->


<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${outdir}/${dex-file}" />

<!-- The final package file to generate -->


<property name="out-package" value="${outdir}/${ant.project.name}.apk"/>

<!-- Tools -->


<property name="aapt" value="${android-tools}/aapt" />
<property name="aidl" value="${android-tools}/aidl" />
<condition property="dx" value="${android-tools}/dx.bat" else="${android
tools}/dx" >
<os family="windows"/>
</condition>

<property name="dx" value="${android-tools}/dx" />

<property name="zip" value="zip" />


<property name="android-jar" value="${sdk-folder}/android.jar" />

<!-- Rules -->

<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
</target>

<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="compile" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-r}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>

<!-- Generate java classes from .aidl files. -->


<target name="aidl" depends="dirs">
<apply executable="${aidl}" failonerror="true">
<fileset dir="${srcdir}">
<include name="**/*.aidl"/>

</fileset>
</apply>
</target>

<!-- Compile this project's .java files into .class files. -->
<target name="compile" depends="dirs, resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
srcdir="."
destdir="${outdir-classes}"

မ္ကးပျငးံစာေပ 105
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

bootclasspath="${android-jar}" />
</target>

<!-- Convert this project's .class files into .dex files. -->
<target name="package-dex" depends="dex, package-res">
<echo>Packaging dex...</echo>
<exec executable="${zip}" failonerror="true">
<!--<arg value="-Xmx384M" />-->
<!-- Move Xmx parameter to dx.bat - FIX - BLOCK END -->
<arg value="--dex" />
<arg value="--output=${intermediate-dex}" />
<arg value="--locals=full" />
<arg value="--positions=lines" />
<arg path="${outdir-classes}" />
</exec>
</target>

<!-- Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>

<!-- Same as package-res-and-assets, but without "-A ${asset-dir}" -->


<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />

<arg value="AndroidManifest.xml" />


<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>
<!-- Invoke the proper target depending on whether or not
an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
Only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir"

106 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

property="res-target" value="and-assets" />


<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>

<!-- Put the project's .class files into the output package file. -->
<target name="package-java" depends="compile, package-res">
<echo>Packaging java...</echo>
<jar destfile="${out-package}"
basedir="${outdir-classes}"
update="true" />
</target>
<!-- Put the project's .dex files into the output package file. -->
<target name="package-dex" depends="dex, package-res">
<echo>Packaging dex...</echo>
<exec executable="${zip}" failonerror="true">
<arg value="-qj" />
<arg value="${out-package}" />
<arg value="${intermediate-dex}" />
</exec>
</target>
<!-- Create the package file for this project from the sources. -->
<target name="package" depends="package-dex" />
</project>

အထကးပါအတိုငး့ build.xml ကို်ပငးဆငးၿပီ့ေနာကး ant Command ကိုအသဵု့်ပဳ၍ ေနာကးတစးႀကိမး ်ပနး


Run ၾကညး႕ႏိုငးပါသညး၈

Installing Your Application with adb

ပထမဆဵု့အဆငးံမြာ Emulator ကိုစတငးရနး်ဖစးပါသညး၈ Android/Tools ဟူေသာ Folder ထဲတျငး


emulator.exe ဆိုေသာ ဖိုငးကိုရြာေဖျ၍ Double Click ႏိြပး၍ ေမာငး့ႏြငးပါ၈ ၁ငး့သညး Android Server ကို
စတငးေစမညး်ဖစးပါသညး၈ ထိုအခါ PC ေပၚတျငး Cell Phone အတုတစးလဵု့ကဲံသို႕ပငး Emulator သညး
စတငးလာေစမညး်ဖစးသညး၈ ေအာကးေဖား်ပပါပဵုတျငး ်ပထာ့ပါသညး၈ Application မ္ာ့ Install ်ပဳလုပး်ခငး့
ႏြငးံ Shell Environment တစးခုကိုေခၚယူရနး စေသာ လုပးေဆာငးခ္ကးမ္ာ့်ပဳလုပးရနး Server ႏြငးံအတူ
အ်ခာ့ေသာ Tool မ္ာ့ကိုလညး့ အသဵု့်ပဳႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 107
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေရ့သာ့ထာ့ေသာ Command-line Application ကို Android Server တျငး Install ်ပဳလုပးရနးအတျက


adb ကို အသဵု့်ပဳရနးလိုပါသညး၈ adb သညး Emulator ကိုအစ်ပဳႏိုငးေသာ Android Server နြငးံခ္ိတးဆကး
ေပ့ပါသညး၈ adb တျငး အသဵု့ွငးေသာ function အမ္ာ့အ်ပာ့ပါွငးၿပီ့ Application မ္ာ့ကို Install
်ပဳလုပးစမး့သပးႏိုငးေသာ Android Server ကဲံသို႕ လုပးေဆာငးချငးံေပ့ပါသညး၈ ေအာကးတျငးေဖား်ပထာ့
ေသာ ဇယာ့ကျကးတျငး adb ၏အသဵု့်ပဳႏိုငးေသာ Command မ္ာ့ကို ေဖား်ပထာ့ပါသညး၈

Command Description
Install <path> Installs applications to the server
Pull <remote file><local file> Pulls a remote file off the server
Push <local file><remote file> Pushes a local file to the server
Shell Opens a shell environment on the server
Forward <local port><remote port> Forwards traffic from one port to another
(to and from the server)
Start-server Starts the server
Kill-server Stops the server
PPP <tty><params> Uses a PPP connection over USB

108 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Devices Lists the available emulators


Help Lists th adb commands
Version Displays the adb version

Application ကို Server သို႕ကူ့ယူရနး build.xml ဖုိငးရိြသညး႕ Directory အတျငး့တျငး Windows


Command Prompt ကိုဖျငးံပါ၈ ထိုသို႕ဖျငးံရနးအတျကး build.xml ဖိုငးရိြသညး႕ Directory (Folder) ၏
ေနရာလျတးတစးခုတျငး Mouse ကိုထာ့၍ Keyboard မြ Shift key ကိုဖိႏပ
ိြ းထာ့လ္ကးႏြငးံ Right Click
ႏိြပးၿပီ့ ေပၚလာေသာ Pop-up Menu တျငး Open Command Window Here ကိုေရျ့ခ္ယး်ခငး့်ဖငးံ
ဖျငးံႏိုငးပါသညး၈ Application ကို Install ်ပဳလုပးရနးအတျကး adb ၏အသဵု့်ပဳရမညး႕ပဵုစဵမြာ ေအာကးပါအ
တိုငး့်ဖစးပါသညး၈

adb install <apk path>


အကယး၍ Application ကို ဖုနး့အတျငး့သို႕ Install လုပးပါက ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့
Install ်ပဳလုပးလိုကးသညး႕ Application ၏ Package Size ကို Feedback အ်ဖစး်ပနးလညးေဖား်ပေပ့မည
်ဖစးပါသညး၈

ထို႕ေနာကး Android Emulator သို႕သျာ့ေရာကး၍ Install ်ပဳလုပးထာ့ေသာ Application ရိြ၇မရိြ ၾကညး႕ရြဳ


ႏိုငးပါသညး၈

What to Do if Running the Application Produces an Error

အသစး်ပငးဆငးထာ့ေသာ build.xml ဖိုငးကို အသဵု့်ပဳ၍ ပထမဆဵု့အႀကိမး်ဖစး application ကိုေမာငး့ႏြငး


ေသာအခါ Android Emulator တျငး Error Message တစးခုကိုေတျ႕ရိြရပါသညး၈ ေအာကးတျငးေဖား်ပထာ့
ေသာပဵုအရ ထို Error သညး Class တစးခုေပ္ာကးဆဵု့်ခငး့ဟု ဆိုပါသညး၈

မ္ကးပျငးံစာေပ 109
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးတျငးေဖား်ပထာ့ေသာ Error Message ကိုအပးက္မတးက္ေတျ႕ရမညးဟုမဆိုလိုပါ၈ အသဵု့်ပဳေသာ


Android SDK ေပၚတျငးမူတညး၍ ေတျ႕ေကာငး့ ေတျ႕ႏိုငးမညး်ဖစးၿပီ့ အကယး၍ႀကဵဳေတျ႕ခဲံရပါက ေ်ဖရြငး့
ႏိုငရ
း နးအတျကး ေ်ဖရြငး့ပဵုမ္ာ့ကိုေဖား်ပထာ့်ခငး့်ဖစးပါသညး၈ ထို ေ်ဖရြငး့ခ္ကးမ္ာ့သညး ေနာကးပိုငး့ project
မ္ာ့ေရ့သာ့သညး႕အခါတျငး Error မ္ာ့ႀကဵဳေတျ႕ပါက ေကာငး့မျနးစျာေ်ဖရြငး့ႏိုငးမညး်ဖစးပါသညး၈

အဆိုပါ Error သညး HelloWorldCommandLine.apk ဖိုငးမြ Classes မ္ာ့ေပ္ာကးဆဵု့သျာ့်ခငး့ေၾကာငးံ


ေပၚလာေသာ Error ဟုယူဆရၿပီ့ ထုိ Error ကို မညးသညး႕ Android SDK command-line tool မ္ာ့ကို
မြ္အသဵု့်ပဳစရာမလိုဘဲ ေ်ဖရြငး့ႏိုငးပါသညး၈ စကာ့မစပးေ်ပာရလြ္ငး .apk ဖိုငးမ္ာ့သညး .zip ဖိုငးမ္ာ့ႏြငးံ
တူညီပါသညး၈ ထို႕ေၾကာငးံ ထို .apk ဖိုငးမ္ာ့ကို .zip ဖိုငးမ္ာ့ဖျငးံေသာ decompressor Software မ္ာ့်ဖငးံ
ဖျငးံ၍ရၿပီ့ အထဲတျငးရိြေသာအရာမ္ာ့ကိုၾကညး႕ရြဳႏိုငးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအရ Hello
WorldCommandLine.apk ဖိုငးကို WinRAR Software ်ဖငးံဖျငးံ၍ ေတျ႕်မငးရေသာပဵုကိုေဖား်ပထာ့
်ခငး့်ဖစးပါသညး၈

110 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထိုအခါ ေပ္ာကးဆဵု့ေနေသာ ဖိုငးကိုသိရိြရၿပီ့်ဖစးကာ ေပ္ာကးဆဵု့ေနေသာဖိုငးမြာ classes.dex ဖိုငး်ဖစးသညး၈


ထိုဖိုငးအတျငး့တျငးပါွငးေသာ Classes မ္ာ့ကို Dalvik ်ဖငးံ execute လုပးယူ်ခငး့်ဖစးသညး၈ ထို႕ေနာကး
ေရ့သာ့ထာ့ေသာ HelloWorldCommandLine Project ၏ Bin Folder ကိုသျာ့ေရာကး၍ဖျငးံပါ၈ ant
Command မြ Compile ်ပဳလုပးတညးေဆာကးထာ့ေသာ classes.dex ဖိုငးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈
ယခု Error Message ေပၚရ်ခငး့သညး ထို Classes.dex ဖိုငးက္နးခဲံ်ခငး့ေၾကာငးံ်ဖစးပါသညး၈ WinRAR တျငး
ဖျငးံထာ့ေသာ အဆိုပါ .apk ဖိုငးထဲသို႕ ထို classes.dex ဖိုငးကိုဆျဲထညး႕လိုကးရပါမညး၈ ထိသ
ု ို႕ထညး႕သျငး့
ၿပီ့ေနာကး WinRAR တျငးဖျငးံထာ့ေသာ အဆိုပါ .apk ဖိုငးကို Save ်ပဳလုပးသိမး့ဆညး့၍ ပိတးပါ၈

Uninstalling a Prior Version of an Activity

Running ်ဖစးေနေသာ Android Server သို႕ဖိုငးမ္ာ့ေပါငး့မထညး႕မီ ယခငးထညး႕သျငး့ထာ့ခဲံေသာ


HelloWorldCommandLine.apk ၏ Version အေဟာငး့ကို Uninstall ်ပဳလုပးၾကညး႕ပါမညး၈ ထိုတစးႀကိမး
ထို Application ကိုထပးမဵ install မ်ပဳလုပးမီ Install ်ပဳလုပးထာ့ၿပီ့်ဖစးေသာ Application အေဟာငး့ကို
အမြနးတကယးအာ့်ဖငးံ Uninstall ်ပဳလုပးစရာမလိုပါ၈ သို႕ရာတျငး Android Server မြ်ပဳလုပးေဆာငးရျက
ခ္ကးမ္ာ့ကို နာ့လညးေစလိုသညး႕အတျကးေၾကာငးံ ယခငး Application အေဟာငး့ကို Uninstall ်ပဳလုပး
ၾကညး႕ပါမညး၈ Android Emulator ပျငးံေနစဥးတျငး Command Prompt သို႕သျာ့ေရာကးၿပီ့ adb shell
ဟူေသာ Command ကို Run ေပ့ရပါမညး၈ ၁ငး့ adb shell သညး Android Server ၏ shell
environment ကိုဖင
ျ းံေပ့မညး်ဖစးပါသညး၈ လုပးေဆာငးခ္ကးေအာငး်မငးေသာအခါတျငး Command Prompt
သညး > ဟူေသာသေကၤတမြ # ဟူေသာ သေကၤတအ်ဖစးသို႕ေ်ပာငး့လဲသျာ့သညးကိုေတျ႕ရမညး်ဖစးသညး၈
ထို႕ေနာကးတျငး Android Server တျငး Shell တစးခုကိုဖျငးံလိုကးၿပီ့်ဖစးပါသညး၈ Shell တျငး မ္ာ့စျာေသာ

မ္ကးပျငးံစာေပ 111
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

function မ္ာ့ကိအ
ု သဵု့်ပဳႏိုငးေသားလညး့ ယခုေနရာတျငး HelloWorldCommandLine.apk ဖိုငးအေဟာငး့
ကိုဖယးထုတးရနးအတျကးကိုသာအသဵု့်ပဳမညး်ဖစးပါသညး၈

မြတးသာ့ရနးအခ္ကးမြာ Android ကို Operating System environment တစးခုအ်ဖစးမြတးယူပါ၈ အဆိုပါ


Shell အတျငး့တျငးအသဵု့်ပဳရေသာ Command မ္ာ့ကို Standard POSIX Command မ္ာ့ဟုေခၚဆိုပါ
သညး၈

Android Server ေပၚတျငး User မြ Install ်ပဳလုပးထာ့ေသာ Application မ္ာ့ကို /data/app ဟူေသာ
directory ေအာကးတျငးသိမး့ဆညး့ထာ့ပါသညး၈ CD Command ကိုအသဵု့်ပဳ၍ app directory သို႕
ေရာကးရိြေစရနး သျာ့ေရာကးရပါမညး၈ ေအာကးေဖား်ပပါပဵုတင
ျ း အသဵု့်ပဳရပဵုကိုေဖား်ပရြငး့လငး့ထာ့ပါသညး၈

ေရာကးရိြေနေသာ Directory အတျငး့မြ File မ္ာ့ကို List လုပးၾကညး႕ရြဳရနး ls ဟူေသာ Command ကို
အသဵု့်ပဳရပါသညး၈ ထိုအခါ HelloWorldCommandLine.apk ဖိုငးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈ ထိုဖုိငး
သညး Install ်ပဳလုပးထာ့ေသာ .apk ဖိင
ု း (Activity) ကိုကိုယးစာ့်ပဳပါသညး၈ ထို႕ေနာကး ထိုဖိုငးကို ဖ္ကးပစး
ၾကညး႕ၾကပါမညး၈ Application တစးခုကိုဖ္ကးရနးအသဵု့်ပဳရေသာ Command မြာ rm HelloWorld
CommandLine.apk ်ဖစးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုတျငး rm ဟူေသာ Command ကိုအသဵု့
ဲ်ပဳ၍ HelloWorldCommandLine.apk ဖိုငးကိုဖ္ကးပစး်ခငး့ကို ေဖား်ပထာ့ေသာပဵု်ဖစးပါသညး၈ ေအာငး်မငးစျာ
ဖ္ကးပစးႏိုငးခဲံပါက မညးသညး႕ Feedback ကိုမြ္်မငးေတျ႕ရမညးမဟုတးပါ၈ ထို႕ေနာကး Ls Command ကို
ေနာကးတစးႀကိမး်ပနး Run ၍ အမြနးတကယး ဖ္ကးပစး်ခငး့ဟုတး၇မဟုတး စစးေဆ့ၾကညး႕ႏိုငးပါသညး၈

112 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

သတိ်ပဳရနးအခ္ကးမြာ Linux Server တစးခု်ဖစးေသာ Shell Command ကိုအသဵု့်ပဳခ္ိနးတျငး Command


မ္ာ့်ဖငးံအလုပးလုပးေဆာငးသညး႕အခါ အကၡရာအႀကီ့၇အေသ့ (Case Sensitive) ကိုသတိ်ပဳရပါမညး၈

Application ကိုဖ္ကးၿပီ့သညး႕ေနာကးတျငး exit ဟူေသာ Command ကိုအသဵု့်ပဳ၍ Shell မြထျကးကာ


Command Prompt သို႕်ပနးလညးေရာကးရိြလာေစပါမညး၈

Reinstalling and Launching the Application

ထို႕ေနာကး adb install ဟူေသာ Command ကိုထပးမဵအသဵု့်ပဳ၍ Application ကိုအသစးတဖနး Install


်ပဳလုပးပါမညး၈

adb install HelloWorldCommandLine.apk

Application ကို Server တျငး Install ်ပဳလုပးၿပီ့သညး႕အခါတျငး Emulator သို႕်ပနးၾကညး႕ပါ၈ Emulator မြ


Application ကိုေမာငး့ႏြငးၾကညး႕ပါ၈ ေကာငး့မျနးစျာအလုပးလုပးေဆာငးေၾကာငး့ ေအာကးပါပဵုအရ ်မငးေတျ႕ရ
မညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 113
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ယခုအခါတျငး Windows OS တျငး Application မ္ာ့တညးေဆာကး်ခငး့၇ ်ပငးဆငး်ခငး့ကို ေဖား်ပခဲံၿပီ့်ဖစး၍


လာမညး႕အပိုငး့တျငး Linux OS ကိုအသဵု့်ပဳ၍ Application မ္ာ့တညးေဆာကး်ခငး့၇ ်ပဳ်ပငး်ခငး့တို႕ကို ေလံ
လာရမညး်ဖစးပါသညး၈ အကယး၍ အသဵု့်ပဳသူသညး Window ကိုအသဵု့မ်ပဳဘဲ Linux ကိုသာအသဵု့်ပဳသ
်ဖစးလြ္ငး ေအာကးတျငးေဖား်ပထာ့သညး႕လုပးေဆာငးခ္ကးမ္ာ့ကို အေလ့ထာ့၍ ေလံလာသငးံပါသညး၈

Hello World! On Linux


Open Source Software မ္ာ့ကိုၾကိဳကးႏြစးသကးေသာ Programmer မ္ာ့သညး Linux ကို Develop
်ပဳလုပးမညး႕ Platform အ်ဖစးေရျ့ခ္ယးတတးၾကပါသညး၈ Google ႏြငးံ Open Handset Alliance မြလညး့
ထိုကဲံသို႕ေသာ programmer မ္ာ့အတျကး Android SDK ကိုထုတးလုပးဖနးတီ့ေပ့ထာ့ပါသညး၈ အဆိုပါ
SDK သညး Windows တျငးအသဵု့်ပဳရေသာ SDK ႏြငးံအတူတူပငး်ဖစးၿပီ့ (Java သညး Portable ်ဖစးေသာ
ေၾကာငး)ံ Tool မ္ာ့မြာ ကျာ်ခာ့မႈရိြပါသညး၈ Linux တျငး Android Development ်ပဳလုပးရနးအတျက
အသဵု့်ပဳရမညး႕ Linux သညး libstdc ++.so.6. ကိုေထာကးပဵံရနးလိုအပးမညး်ဖစးပါသညး၈ Android
Documentation မ္ာ့အရ Ubuntu Dapper Drake ကိုသဵု့စျဲရနးအၾကဵ်ပဳထာ့ပါသညး၈ သို႕ရာတျငး Linux
Distribution မ္ာ့သညး အလျနးတရာမကျာ်ခာ့ေသာေၾကာငးံ ႀကိဳကးႏြစးသကးရာ Linux ကိုေရျ့ခ္ယးအသဵု့

114 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

်ပဳႏိုငးပါသညး၈ သတိ်ပဳရနးမြာ Linux တျငး Eclipse ကိုအသဵု့်ပဳရနး သကးဆိုငးရာ Linux အတျကးသီ့သနး႕


်ပဳလုပးထာ့သညး႕ Eclipse Version ကိုလိုအပးမညး်ဖစးပါသညး၈

Configuring the PATH Statement


Application မ္ာ့မေရ့သာ့မီတျငး ဦ့စျာ်ပဳလုပးရမညး႕အဆငးံမြာ PATH statement ကို Configure ်ပဳလုပး
ရနး်ဖစးပါသညး၈ Path ဆိုသညးမြာ Directory မ္ာ့၏လမး့ေၾကာငး့်ဖစးေသာေၾကာငးံ လကးရိြ Configure
်ဖစးေနေသာ path ကိုေတျ႕်မငးရေစရနးအတျကး Terminal တျငး ေအာကးပါ Command ကိုရိုကးထညး႕ေပ့
ရပါမညး၈

echo $PATH

Application မ္ာ့မေရ့သာ့မီတျငး ဦ့စျာ်ပဳလုပးရမညး႕အဆငးံမြာ PATH statement ကို Configure ်ပဳလုပး


ရနး်ဖစးပါသညး၈ Path ဆိုသညးမြာ Directory မ္ာ့၏လမး့ေၾကာငး့်ဖစးေသာေၾကာငးံ လကးရိြ Configure
်ဖစးေနေသာ path ကိုေတျ႕်မငးရေစရနးအတျကး Terminal တျငး ေအာကးပါ Command ကိုရိုကးထညး႕ေပ့
ရပါမညး၈ ထိုအခါ ေအာကးေဖား်ပပါပဵုအတိုငး့တျငး လကးရိြ Configure ်ဖစးေနေသာ Path ကိုေတျ႕်မငးရမည
်ဖစးပါသညး၈

ထို႕ေနာကး Path Statement အတျငး့သို႕ Android ကိုထညး႕သျငး့ရနး export ဟူေသာ Command ကို
အသဵု့်ပဳရပါမညး၈ ေအာကးေဖား်ပပါပဵုတျငး ေလံလာႏိုငးပါသညး၈

export PATH=$PATH:<android path>

မ္ကးပျငးံစာေပ 115
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Linux တျငး Path Statement ကို်ပငးဆငး်ခငး့တျငး လကးရိြ Terminal Session အတျကးသာေ်ပာငး့လဲေစ


ႏိုငးပါသညး၈ ထို႕ေၾကာငးံ PATH statement ကို အၿမဲတမး့ေ်ပာငး့လဲေစရနးအတျကး .bash_profile ကို
်ပငးဆငးေပ့ရပါမညး၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ .bash_profile ကို်ပငးဆငးရနးအတျကး vi
ဟူေသာ Command ကိုအသဵု့်ပဳႏိုငးပါသညး၈

ထိုအခါ .bash_profile သညး vi editor တျငးပျငးံလာမညး်ဖစးၿပီ့ ေအာကးပါပဵုအတိုငး့ေတျ႕်မငးရမညး်ဖစးၿပီ့


PATH Statement ကိုလညး့ ရြငး့လငး့လျယးကူစျာေတျ႕်မငးႏိုငးပါသညး၈ Insert Mode တျငးအသဵု့်ပဳရနး
အတျကး Command :I ကိုအသဵု့်ပဳရမညး်ဖစးၿပီ့ PATH statement သို႕ Android ကိုေပါငး့ထညး႕ႏိုငးပါ
သညး၈ ထို႕ေနာကး Esc key ကိုတစးခ္ကးႏိြပးၿပီ့ Command:w ်ဖငးံ File သို႕ေရ့သာ့ရပါမညး၈ ထို႕ေနာကး
:q ဟူေသာ Command ကိုအသဵု့်ပဳကာ ်ပနးထျကးႏိုငးပါသညး၈

116 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Linux အတျကး Android SDK သညး Python Script ်ဖငးံလာၿပီ့ activityCreator.py သညး Project
မ္ာ့ကိုတညးေဆာကးရနးအသဵု့်ပဳရပါမညး၈ Python Script ကိုေမာငး့ႏြငးေသာအခါတျငး ေရ့သာ့မညး႕
Project အတျကး Output directory ကိုတညးေဆာကးေပ့မညး်ဖစးပါသညး၈ သို႕ရာတျငး ကိုယးတိုငး
manual နညး့လမး့်ဖငးံလညး့ တညးေဆာကးႏုိငးပါသညး၈ ထိုသို႕တညးေဆာကးရနးအတျကး mkdir ဟူေသာ
Command ကိုအသဵု့်ပဳရပါမညး၈ ေအာကးပဵုတျငးေဖား်ပထာ့ပါသညး၈

Project အတျကး Directory တညးေဆာကးၿပီ့ေနာကး Python Script ်ဖစးေသာ activityCreator.py ကို


ေမာငး့ႏြငးႏိုငးပါမညး၈ အသဵု့်ပဳရမညး႕ပဵစ
ု ဵမြလညး့ Windows တျငးအသဵု့်ပဳခဲံစဥးကႏြငးံ အလျနးနီ့စပးပါသညး၈

activityCreator.py --out <output directory> package.activityName

မ္ကးပျငးံစာေပ 117
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

activityCreator.py script ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ Project ကို Setup ်ပဳလုပးရပါမညး၈ ေအာကးတျငးေဖား်ပ


ထာ့ေသာပဵုအရ activityCreator.py Script ကို ေမာငး့ႏြငး၍ထျကးေပၚလာေသာ Output ကိုေတျ႕်မငးႏိုငး
မညး်ဖစးပါသညး၈

သတိး်ပဳရနးမြာ activityCreator.py ဟူေသာ Command ကိုအသဵု့်ပဳေသာအခါတျငး ေရြ႕တျငး sudo


ဟူေသာ Code ကိုထညး႕ေပ့ရပါမညး၈ sudo ဟူေသာ Command ကိုအ်ခာ့ေသာ user မ္ာ့၏
Permission ကို emulate လုပရ
း နးအတျကး အသဵု့်ပဳရပါသညး၈

Project ကိုဖနးတီ့တညးေဆာကးၿပီ့ေသာအခါတျငး TextView ကိုထညး႕သျငး့ရနးအတျကး HelloWorld


Linux.java ဖိုငးကို ်ပငးဆငးရပါမညး၈ Linux တျငး .java ဖိုငးကို်ပငးဆငးရနး နညး့လမး့ေပါငး့မ္ာ့စျာရိြပါ
သညး၈ Vi Command ကိုလညး့ေနာကးတစးဖနးအသဵု့်ပဳႏိုငးသကဲသု
ံ ိ႕ ေအာကးတျငး်ပထာ့သညး႕အတိုငး့
Text Editor တစးခုခုကိုလညး့ အသဵု့်ပဳႏိုငးပါသညး၈

118 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေနာကးဆဵု့အေန်ဖငးံ TextView ကို main.xml မြဖယးရြာ့ပါ၈ လုပးေဆာငးရမညး႕လုပးေဆာငးခ္ကးမ္ာ့သည


ေဖား်ပခဲံၿပီ့်ဖစးေသာ Windows ကိုအသဵု့်ပဳ၍လုပးေဆာငးရေသာ လုပးေဆာငးခ္ကးမ္ာ့ႏြငးံ တူညီပါသညး၈
ကျဲ်ပာ့ေသာအခ္ကးမြာ Compile ်ပဳလုပး်ခငး့်ဖစး၍ Linux တျငး Application ကို Compile ်ပဳလုပးရနး ANT
ကိုပငးအသဵု့်ပဳပါသညး၈ Linux တျငး Apache ANT ကိုနဂိုကတညး့က ထညး႕သျငး့ထာ့ၿပီ့်ဖစးေလံရိြပါ
သညး၈ မရိြေသ့ပါက Download ်ပဳလုပး၍ Install ်ပနးလုပးေပ့ရပါမညး၈

ant ကိုေမာငး့ႏြငးေသာအခါတျငး ထျကးလာမညး႕ Output ကိုေအာကးေဖား်ပပါပဵုတျငး်ပသထာ့ပါသညး၈

မ္ကးပျငးံစာေပ 119
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး Android Emulator ကိုစတငးၿပီ့ Application ကို Install ်ပဳလုပးရပါမညး၈ Emulator စတငး
Run ေသာအခါတျငး ေအာကးပါ Command ်ဖငးံ Application ကို Install ်ပဳလုပးႏိုငးပါသညး၈

adb install HelloWorldLinux.apk

Linux Android Server တျငး Application ကို Install ်ပဳလုပးၿပီ့ေနာကး Android Emulator အတျငး့တျငး
ေမာငး့ႏြငးၾကညး႕ႏိုငးၿပီ်ဖစးပါသညး၈ ေနာကးလာမညး႕အခနး့တျငး Phone Event မ္ာ့ကို Android SDK မြ
မညးကဲံသို႕အသဵု့်ပဳသညးဆိုေသာအေၾကာငး့အရာမ္ာ့ကို ေလံလာရပါမညး၈

120 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

(အိမးစာ)Create an Image-Based Hello World! in the CLI

ယခုအခနး့တျငးေဖား်ပခဲံၿပီ့်ဖစးသညး႕ Command-line Tool မ္ာ့ကိုအသဵု့်ပဳ၍ Image ပဵုတစးပဵုကိုအသဵု့်ပဳ


ကာ အခနး့ (၂) တျငးေဖား်ပခဲံသညး႕ Hello World Project ကဲံသို႕ Project တစးခုကိုတညးေဆာကးပါ၈
Project ကိုတညးေဆာကးၿပီ့ေသာအခါတျငး ေအာကးပါ Items မ္ာ့ကို တညးေဆာကး်ပဳလုပးၾကညး႕ပါ၈

 res Folder အတျငး့တျငး Image ပဵုတစးပဵုထညး႕သျငး့ပါ၈


 Image ကိုထညး႕သျငး့ရနး R.java ဖိုငးကို ကိုငးတျယးရနးအတျကးမညးသညး႕ Tool မ္ာ့ကိုအသဵု့်ပဳ ရ
မညးကိုစစးေဆ့ၾကညး႕ပါ၈
 ANT ကိုအသဵု့်ပဳ၍ Project ကို Compile ်ပဳလုပးၾကညး႕ပါ၈
 Adb install ဟူေသာ Command ်ဖငးံ Application ကို Emulator အတျငး့တျငးထညး႕သျငး့
ေမာငး့ႏြငးၾကညး႕ပါ၈

မ္ကးပျငးံစာေပ 121
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

122 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 7
Using Intents and the Phone Dialer

မ္ကးပျငးံစာေပ 123
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Using Intents
- Creating code that interacts with the phone hardware
- Learning the difference between dialing and calling

ယခုအခနး့အထိ ေလံလာခဲံရသမြ္ေသာ သငးခနး့စာတို႕တျငး Android Programming ၏ အေ်ခခဵသေဘာ


တရာ့မ္ာ့ကို ေဖား်ပခဲံပါသညး၈ Android Application ၏ Outline ကိုေလံလာခဲံရသကဲံသို႕ Android
Server အတျကး ပထမဦ့ဆဵု့ Android Program ကိုလညး့ေရ့သာ့ခဲံၿပီ်ဖစးပါသညး၈ Views ႏြငးံ
setContentView() တို႕ကိုမညးကဲံသို႕အသဵု့်ပဳမညးဆိုေသာအခ္ကးမ္ာ့ကိုလညး့ ေလံလာခဲံရသကဲံသို႕
XML UI တျငးလညး့ Application မ္ာ့ေရ့ဆျဲ်ခငး့ကိုေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈ အထကးတျငးေဖား်ပထာ့ေသာ
ေလံလာမႈမ္ာ့သညး static application တစးခုေရ့ဆျဲရာတျငး မ္ာ့စျာအေထာကးအကူ်ပဳေစႏိုငးပါသညး၈
မေမံသငးံေသာအခ္ကးတစးခုရိြပါသညး၈ ထုိအခ္ကးမြာ ယခုေရ့သာ့ေနေသာ Application မ္ာ့သညး Cell
Phone အတျကးသီ့သနး႕်ပဳလုပးထာ့ေသာ Platform ်ဖစးသညး႕ Android အတျကးေရ့သာ့ေန်ခငး့်ဖစ
သညးဆိုေသာအခ္ကးပငး်ဖစးပါသညး၈

ထိုသို႕ Cell Phone အေပၚတျငးတညးမြီမညး႕ Hardware မ္ာ့တျငး Android ကိုအေ်ခခဵရ်ခငး့ေၾကာငးံ


Person to person communication အတျကး ဒီဇိုငး့်ပဳလုပးထာ့်ခငး့ဆိုသညး႕အခ္ကးကိုမေမံသငးံပါ၈
ထို႕ေၾကာငးံ Android Programming တျငး ဖုနး့ေခၚဆိုလကးခဵႏိုငးေသာ Code မ္ာ့ကိုေရ့သာ့ႏိုငးပါသညး၈
ထိုသို႕ေသာအေၾကာငး့အရငး့မ္ာ့ေၾကာငးံ ယခုအခနး့တျငး Phone Hardware ကိုအဓိကထာ့ေသာ Code
မ္ာ့အေၾကာငး့ကိုေလံလာရမညး်ဖစးပါသညး၈

ယခုအခနး့အဆဵု့ထိေလံလာၿပီ့ေသာအခါတျငး Phone ၏အေ်ခခဵ Function အခ္ိဳ႕်ဖငးံ အလုပးလုပးေဆာင


ႏိုငးစျမး့ရရိြသျာ့မညး်ဖစးပါသညး၈ ထိ႕ု အတူ ဖုနး့အတျငး့ပါွငးေသာ Dailer ကိုအသဵု့်ပဳ၍လညး့ ဖုနး့ Call
မ္ာ့ ေပ့ပို႕လကးခဵ (ဖုနး့ဆကး၇ ဖုနး့ကိုငး်ခငး့) မ္ာ့်ပဳလုပးသျာ့ႏိုငးမညး်ဖစးပါသညး၈ ထိုသို႕်ပဳလုပးရမညး႕
Tool မ္ာ့ႏြငးံ အရညးအခ္ငး့မ္ာ့ကိုေပါငး့စပး၍ Android Platform တျငး အသဵု့ွငးလြေသာ Application
မ္ာ့တညးေဆာကးရနး Idea ရရိြေစပါလိမးံမညး၈

124 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခုစာအုပးကို Application မ္ာ့ Design ်ပဳလုပးလိုေသာရညးရျယးခ္ကး်ဖငးံ ွယးယူဖတးရြ်ခငး့်ဖစးသ်ဖင


Phone Hardware မ္ာ့ကိုတညးမီြ၍ Android အလုပးလုပးေဆာငးပဵုကိုေလံလာသငးံပါသညး၈ ထို hardware
မ္ာ့၏အလုပးလုပးေဆာငးပဵုမ္ာ့တျငး ဖုနး့ေခၚဆို်ခငး့၇ ဖုနး့လကးခဵေ်ပာဆို်ခငး့သညးလညး့ ပါွငး၍ ယခုအခနး့
တျငးထုိအခ္ကးကို အသာ့ေပ့ေလံလာရမညး ်ဖစးသညး၈

ယခုအခနး့တျငး ပထမဆဵု့ေလံလာရမညး႕သငးခနး့စာမြာ ဖုနး့ Call တစးခုကိုေခၚဆို်ခငး့်ဖစးပါသညး၈


ထို႕ေၾကာငးံ ထိုလုပးေဆာငးခ္ကးကို Application တစးခုေရ့သာ့ရမညး်ဖစးၿပီ့ ထိုသို႕ေရ့သာ့ရနးအတျကး
Phone Dialer ႏြငးံ ဖုနး့ေခၚဆိုမႈမ္ာ့်ပဳလုပးႏိုငးသညး႕ Intent တစးခုကိုအသဵု့်ပဳရပါမညး၈

သတိ်ပဳရနးအခ္ကးမြာ Andorid Platform တျငး dialing ်ပဳလုပး်ခငး့ႏြငးံ Calling ်ပဳလုပး်ခငး့လုပးေဆာင


ခ္ကးႏြစးခုသညး တူညီမေယာငးႏြငးံ ကျာ်ခာ့ပါသညး၈ ဖုနး့နဵပါတးတစးခုကို Dial ်ပဳလုပးရာတျငး Keypad မြ
ဂဏနး့မ္ာ့ကို ရိုကးထညး႕ရေသားလညး့ ဖုနး့ Call ်ဖစးမလာပါ၈ Dialing သညး Send ခလုတးကို ႏိြပး်ခငး့်ဖငးံ
သကးဆိုငး်ခငး့မရိြပါ၈ ဖုနး့နဵပါတးတစးခုကိုဖုနး့ေခၚဆိုေသာအခါတျငး Handset မြ Signal တစးခုကိုထုတ
လႊတးေပ့ပါသညး၈ ထို်ဖစးစဥးသညး ဖုနး့နဵပါတးမ္ာ့ကိုႏိြပးရဵု်ဖငးံ ်ဖစးေပၚလာ်ခငး့မရိြပဲ Send (သို႕မဟုတ)း
Call ခလုတးကို လကး်ဖငးံ်ဖစးေစ၇ Program နညး့လမး့အာ့်ဖငးံ်ဖစးေစ ႏိြပးလိုကးေသာအခါတျငးမ
်ဖစးေပၚလာပါသညး၈ ထိုသို႕ Action ႏြစးခု၏ အလုပးလုပးေဆာငးပဵုကို အၾကမး့်ဖငး့နာ့လညးထာ့သငးံၿပီ့
ထိုသို႕နာ့လညးေသာအခါတျငးမြ ထိုအေၾကာငး့အရာမ္ာ့ႏြငးံစပးလ္ဥး့၍ Application တစးခုေရ့သာ့ရနး
ေကာငး့မျနးစျာ စဥး့စာ့ႏိုငးမညး်ဖစးပါသညး၈

What are Intents?


Phone dialer ကိုအသဵု့မ်ပဳမီတျငး အလုပးလုပးေဆာငးမညး႕ Code ၏သေဘာတရာ့မ္ာ့ကို နာ့လညး
သေဘာေပါကးရနးလိုအပးပါသညး၈ Android သညး Application တစးခုအတျငး့ သတးမြတးထာ့ေသာ
အလုပးမ္ာ့ကိုလုပးေဆာငးႏိုငးရနး intent မ္ာ့ကိုအသဵု့်ပဳပါသညး၈ အကယး၍ intent အသဵု့်ပဳပဵုကိုသာ ကၽျမး့
က္ငးပင
ို းႏိုငးလာခဲံမညးဆိုပါက Android development မြအသစးအဆနး့ေသာ Application ကိုရြာႀကဵတီ
ထျငးႏိုငးမညး်ဖစးပါသညး၈ Intent မ္ာ့အသဵု့်ပဳ်ခငး့တျငး ကၽျမး့က္ငးလာေစရနး Application Development
မြလမး့ေၾကာငး့ဖျငးံေပ့ထာ့ပါသညး၈ ယခုအပိုငး့တျငး Intent ဆိုသညးမြာ ဆိုေသာအခ္ကးႏြငးံ Intent မ္ာ့
ကိုအသဵု့်ပဳရပဳမ္ာ့ကို အသာ့ေပ့ေဖား်ပေပ့ပါမညး၈

မ္ကးပျငးံစာေပ 125
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Intent ဆိုသညးမြာ တိက္ေသာအခ္ကးအလကးမ္ာ့ကို Activity တစးခုမြ ေနာကးတစးခုသို႕လကးဆငးံကမး့


ေပ့ႏိုငးေသာ Android ၏ နညး့လမး့တစးခုပငး်ဖစးပါသညး၈ ပိုမိုရို့ရြငး့ေသာေတျ့ေခၚမႈ်ဖငးံစဥး့စာ့လြ္င
Andorid ကိုေဖား်ပရနးအတျကး Intent သညးတစးစဵုတစးရာကိုလုပးေဆာငးသညး႕အရာဟု ေတျ့ေတာႏိုငး
ပါသညး၈ Intent တစးခုကို Activity မ္ာ့အၾကာ့ ဆကးသျယးႏိုငးေသာ Message တစးခုဟူ၍လညး့ စဥး့စာ့
ႏိုငးပါသညး၈ ဥပမာအာ့်ဖငးံ Web Browswer တစးခုကိုဖျငးံရနးႏြငးံ အဆိုပါ Web Page ကို Android Device
တျငး်ပသရနး လုပးေဆာငးႏိုငးေသာ Activity တစးခုရိြသညးဆိုပါအဵံ၈ ထို Activity သညး “intent to open x
page in the web browser” ဟူေသာ WEB_SEARCH_ACTION intent ကို Android Intent Resolver
သို႕ေပ့ပို႕မညး်ဖစးသညး၈ ထိုအခါ Intent Resolver သညး Activity မ္ာ့၏စာရငး့ကို သရုပးချဲမညး်ဖစးၿပီ့
အသဵု့်ပဳရမညး႕ intent ႏြငးံကိုကးညီေသာ တစးခုကို Web Browser Activity အတျကး ေရျ့ခ္ယးေပ့
မညး်ဖစးပါသညး၈ ထို႕ေနာကး Intent Resolver သညး Browser သို႕်ဖတးသနး့၍ Web Page ကို်ပသမညး
်ဖစးၿပီ့ Web Browser Activity ကိုစတငးေစမညး်ဖစးပါသညး၈

Intent မ္ာ့ကို အဓိကအာ့်ဖငးံ အုပးစုႏြစးစုချဲ်ခာ့ႏိုငးပါသညး၈

 Activity Action Intent မ္ာ့သညး Application ်ပငးပမြ အ်ခာ့ေသာ Activity မ္ာ့ကိုေခၚယူရနး


အသံု့်ပဳပါသညး၈ Activity တစးခုတညး့ကိုသာလြ္ငး Intent အ်ဖစးအသဵု့်ပဳႏိုငးပါသညး၈ ဥပမာ
အာ့်ဖငးံ Web Browser တစးခုတျငး Page တစးခုကိုေဖား်ပရနး Web Browser Activity တစးခုကို
ဖျငးံေပ့ရနး လိုအပးသကဲံသို႕ ်ဖစးပါသညး၈
 Broadcast intents မ္ာ့သညး မ္ာ့စျာေသာ Acitivity မ္ာ့်ဖငးံ လုပးေဆာငးႏိုငးပါသညး၈ ဥပမာအာ့
်ဖငးံ Broadcast Intent တစးခုသညး လကးရိြ Battery Level ႏြငးံ ပတးသကးေသာ Message
တစးေစာငးေပ့ပို႕သညးဆိုပါအဵံ၈ မညးသညး႕ Activity မဆို အဆိုပါ Intent ်ဖငးံလုပးေဆာငးႏိုငးၿပီ့
တဵု႕်ပနးမႈလညး့ေပ့ႏိုငးပါသညး၈ ဥပမာအာ့်ဖငးံ သတးမြတးထာ့ေသာ Battery Level ထကးပိုနိမးံခဲံ
လြ္ငး Activity ကိုပယးဖ္ကးရနး စသညးတို႕်ဖစးသညး၈

ေအာကးတျငးေဖား်ပထာ့ေသာ ဇယာ့တျငး အသဵု့်ပဳႏိုငးေသာ Activity Action Intent မ္ာ့ကိုိေဖား်ပေပ့


ထာ့ပါသညး၈ မ္ာ့စျာေသာ ကိစၥရပးမ္ာ့အတျကး Intent အမညးမ္ာ့ႏြငးံ ၁ငး့တို႕၏လုပးေဆာငးခ္ကးမ္ာ့က
သိရိြထာ့်ခငး့သညး Application မ္ာ့ကိုေရ့သာ့ေသာအခါတျငး ပိုမိုေကာငး့မျနးပါလိမးံမညး၈

126 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Activity Action Intent Messsage


ADD_SHORTCUT_ACTION Add a function shourtcut to the Android Home Screen

ALL_APPS_ACTION List all the applications available on the devices

ANSWER_ACTION Answer an imcoming Call

BUG_REPORT_ACTION Open the Bug Reporting Activity

CALL_ACTION Place a call to supplied location

DELETE_ACTION Delete the specified data

DIAL_ACTION Open the Dial Acitivity and dial the specified number

EDIT_ACTION Provide editable access to the supplied data

EMERGENCY_DIAL_ACTION Dial an emergency number

FACTORY_TEST_ACTION Retrieve factory test settings

GET_CONTENT_ACTION Select and return specified data

INSERT_ACTION Insert and empty item

MAIN_ACTION Establish the Activity start point

PICK_ACTION Pick an item and return the selection

PICK_ACTIVITY_ACTION Pick a given Activity (returns a class)

RUN_ACTION Execute the given data

SEARCH_ACTION Launch a search on the system

SEND_ACTION Send data without specifying the recipient

SENDTO_ACTION Send data to the recipient specified

SETTINGS_ACTION Launch System Settings

SYNC_ACTION Sync phone data with external source

VIEW_ACTION Open a View

(DEFAULT_ACTION)
WALLPAPER_SETTINGS_ACTION Show settings for modifying the Android Wallpaper
WEB_SEARCH_ACTION Open Google Search, or another web page if specified

မ္ကးပျငးံစာေပ 127
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

သတိ်ပဳရနးအခ္ကးမြာ ယခုအခနး့တျငး ေရ့သာ့မညး႕ Application မ္ာ့အတျကး အထကးပါဇယာ့တျင


ေဖား်ပထာ့ေသာ Intent ႏြစးမ္ိဳ့်ဖစးေသာ CALL_ACTION ႏြငးံ DIAL_ACTION တို႕ကိုအသဵု့်ပဳပါမညး၈
အဆိုပါ Intent မ္ာ့သညး Phone ၏ Dialing ်ပဳလုပး်ခငး့ႏြငးံ ဖုနး့ေခၚဆိုႏိုငးေသာ လုပးေဆာငးခ္ကးမ္ာ့ကို
ချငးံ်ပဳေပ့ပါသညး၈

ေအာကးတျငးေဖား်ပထာ့ေသာ ဇယာ့အရ အသဵု့်ပဳႏိုငးေသာ Current Broadcast Intent မ္ာ့ကို ေဖား်ပ


ထာ့ပါသညး၈ Receiver ကို သတးမြတးထာ့ေသာ intent အတျကး establish ်ပဳလုပးလိုေသာအခါ အဆိုပါ
ဇယာ့ကို ကို့ကာ့ႏိုငးပါသညး၈

Broadcast Intent Messsage


CALL_FORWARDING_STATE_CHANGED_ACTION The phone’s call forwarding state has changed

CAMERA_BUTTON_ACTION The camera button has been pressed

CONFIGURATION_CHANGED_ACTION The device’s configuration has changed

DATA_ACTIVITY_STATE_CHANGED_ACTION The device’s data activity state has changed

DATA_CONNECTION_STATE_CHANGED_ACTION There has been a change in the data connection state

DATE_CHANGED_ACTION The phone’s system date has changed

FOTA_CANCEL_ACTION Cancel pending system update downloads

FOTA_INSTALL_ACTION An update has been downloaded and must be installed


immediately (sent by the system)
FOTA_READY_ACTION An update has been downloaded and can be installed
– but does not need to be installed immediately (sent
by the system)
FOTA_RESTART_ACTION Restart a system update download

FOTA_UPDATE_ACTION Begin the download of a system update

GTALK_SERVICES_CONNECTED-ACTION Sent when a GTALK sessions has been successfully


established
GTALK_SERVICES_DISCONNECTED_ACTION Sent when a GTALK session has been disconnected

MEDIA_BAND_REMOVAL_ACTION Sent when an SD Memory Card was removed but


unsuccessfully unmounted from the system
MEDIA_BUTTON_ACTION Sent when the media button has been pressed

128 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

MEDIA_EJECT_ACTION Sent when the eject action has been initiated on an SD


Memory Card
MEDIA_MOUNTED_ACTION Sent when an SD Memory Card was successfully
mounted to the system
MEDIA_REMOVED_ACTION Sent when an SD memory card was delected as having
been removed
MEDIA_SCANNER_FINISHED_ACTION Sent when the scanner has finished

MEDIA_SHARED_STARTED_ACTION Sent when the scanner has begun

MEDIA_UNMOUNTED_ACTION Sent when an SD Memory card has been detected but


has not been mounted
MESSAGE_WAITING_STATE_CHANGED The “Message waiting” state on the phone has
changed

NETWORK_TICKLE_RECEIVED_ACTION A new device network notification has been received

PACAGE_ADDED_ACTION Sent when a new package has been installed on the


device
PACKAGE_CHANGE_ACTION Sent when an existing package has been modified

PACKAGE_INSTALL_ACTION A package can be downloaded and installed

PACKAGE_REMOVED_ACTION A package has been removed

PHONE_INTERFACE_ADDED_ACTION The device’s phone interface has been created

PHONE_STATE_CHANGED_ACTION The device’s phone state has changed

PROVIDER_CHANGED_ACTION The device has received a notification from a provider

PROVISIONING_CHECK_ACTION Check for the latest settings from the provisioning


service
SCREEN_OFF_ACTION The screen has been shut off (sent by the device)

SCREEN_ON_ACTION The screen has been turned on (sent by the device)

SERVICE_STATE_CHANGED_ACTION The service state has changed

SIGNAL_STRENGTH_CHANGED_ACTION The signal strength has changed

SIM_STATE_CHANGED_ACTION The state of the SIM card has changed

TIME_CHANGED_ACTION The device’s time was set

TIME_TICK_ACTION The current time has changed

မ္ကးပျငးံစာေပ 129
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

TIMEZONE_CHANGED_ACTION The device’s timezone has changed

UMS_CONNECTED_ACTION The device has connected via USB

UMS_DISCONNECTED_ACTION The device has been disconnected from its USB host

WALLPAPER_CHANGED_ACTION The device’s wallpaper has been changed

သတိ်ပဳရနးအခ္ကးမြာ TIME_TICK_ACTION ႏြငးံ SINGAL_STRENTH_CHANGED_ACTION ကဲံသို႕


ေသာ အခ္ိဳ႕ေသာ အထကးတျငးေဖား်ပထာ့ေသာ Broadcast Intent မ္ာ့သညး မၾကာခဏ အသဵု့်ပဳတတး
ပါသညး၈ အကယး၍ အာ့လဵု့ကိုအသဵု့်ပဳႏိုငးဟုဆိုတိုငး့ ထိုကဲံသို႕ေသာ Broadcast Intent မ္ာ့ကို မသဵု့
သငးံပါ၈

ႈIntent တစးခုသညး တစးစဵုတစးရာကို်ပဳလုပးႏိုငးေသားလညး့ သူကိုယးတိုငးကမူ မညးသညး႕အလုပးကိုမြ္


မ်ပဳလုပးႏိုငးပါ၈ ထို႕ေၾကာငးံ Intent မ္ာ့ကို Listen ်ပဳလုပးႏိုငးရနးႏင
ြ းံ interpret ်ပဳလုပးႏိုငးရနး Intent Filter
မ္ာ့ႏြငးံ Intent Receiver မ္ာ့ကို လိုအပးပါမညး၈ Intent Receiver တစးခုသညး Activity တစးခု၏
Mailbox နြငးံ ဆငးတူပါသညး၈ Intent Receiver တစးခုကို သတးမြတးထာ့ေသာ Intent တစးခုကို
လကးခဵရနးအတျကး Activity တစးခုကို ချငးံ်ပဳေပ့ရနး အသဵု့်ပဳပါသညး၈ ယခငးေဖား်ပခဲံၿပီ့်ဖစးေသာ Web
Browser ဥပမာတျငး Web Browser Activity ကို Web Browser Intent မ္ာ့ကိုလကးခဵရနးအတျကး Set
up ်ပဳလုပးေစပါသညး၈ ထိုကဲံသို႕ေသာ စနစးတစးခုတျငး အလုပးလုပးေဆာငးမႈမရိြမရိြေသာ Intent မ္ာ့ကို
လ္စးလ္ဴရြဳ်ပဳရနးအတျကး ဆကးႏျယးမႈမရိြေသာ Activity မ္ာ့ကိုချငးံ်ပဳေပ့ပါသညး၈ ၁ငး့သညး Activity
တစးခုကိုမညးကဲံသို႕ေခၚရမြနး့မသိေသာအခါတျငးလညး့ အ်ခာ့ေသာ Activity တစးခု၏ အကူအညီကို
လိုအပးေသာအခါတျငးလညး့ အဆိုပါ Activity မ္ာ့ကိုချငးံ်ပဳေပ့ပါသညး၈

ႈIntent မ္ာ့ႏြငးံ Intent Receiver မ္ာ့တျငး Activity တစးခုသညး Intent တစးခုကို ေပ့ပို႕ေနစဥးတျငး
အ်ခာ့ေသာ Intent တစးခုကို လကးခဵေစႏိုငးပါသညး၈ သို႕ရာတျငး ထိုသို႕လုပးေဆာငးရာတျငး Activity ႏြစး
ခုအၾကာ့ ေပ့ပို႕နိုငးေသာ Information အမ္ိဳ့အစာ့မ္ာ့ကို ထိနး့ခ္ဳပးႏိုငးေသာ တစးစဵုတစးရာကို လုိအပးပါ
လိမးံမညး၈ ၁ငး့လုပးေဆာငးခ္ကးကို Intent Filter မြလုပးေဆာငးေပ့ႏိုငးပါသညး၈ Intent Filter မ္ာ့ကို
Activity မ္ာ့မြ လကးခဵရရိြလိုေသာ Intent အမ္ိဳ့အစာ့မ္ာ့ကို ေဖား်ပရနး အသဵု့်ပဳပါသညး၈ ပိုမိုအေရ့ႀကီ့
ေသာအခ္ကးမြာ ၁ငး့သညး Intent ႏြငးံအတူ ်ဖတးသနး့သျာ့ေသာ Data အမ္ိဳ့အစာ့ကို ေဖား်ပရပါမညး၈
ထို႕ေၾကာငးံ အထကးတျငးေဖား်ပခဲံေသာ ဥပမာတျငး Web Browser ကို Web Page ကိုဖျငးံရနး လိုအပးခဲံ်ခငး့

130 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

်ဖစးပါသညး၈ URL တစးခု၏အသျငး်ဖစးေသာ WEB_SEARCH_ACTION ႏြငးံအတူပငး Data ်ဖတးသနး့မႈမ္ာ့


ကို Intent Filter မြေဖား်ပေပ့ႏိုငးပါသညး၈ ေနာကးလာမညး႕အပိုငး့တျငး Intent မ္ာ့ကိုဖျငရ
းံ နး ႏြငးံ Phone
၏ Dialer ကိုစတငးအသဵု့်ပဳၾကညး႕ၾကရ ေတာံမညး်ဖစးပါသညး၈

Using the Dialer


Intent ၏အဓိပၸါယးကိုသိၿပီ့ေနာကး Phone Dialer ကိုဖျငးံရနး DIAL_ACTION ကိုမညးကဲံသို႕အသဵု့်ပဳမည
ဆိုေသာအခ္ကးကို ေလံလာၾကညး႕ရပါမညး၈ ေရ့သာ့ထာ့ေသာ Application ေကာငး့မျနးစျာအလုပးလုပ
ေဆာငးခဲံလြ္ငး Intent ကို်ဖတးသနး့ွငးေရာကးလာေသာ နဵပါတးမ္ာ့ကို Dialer တျငးေတျ႕်မငးရမညး်ဖစးပါ
သညး၈ ်ပဳလုပးရမညး႕ပထမအဆငးံမြာ အခနး့(၂)တျငးေဖား်ပခဲံေသာလုပးေဆာငးခ္ကးမ္ာ့အတိုငး့ အဆိုပါ
Activity အတျကး Project အသစးတစးခုတညးေဆာကးရနး်ဖစးပါသညး၈ Project ၏အမညးကို Android
PhoneDialer ဟုအမညးေပ့ပါမညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအရ ယခု Project အတျကး Android
Project Wizard အသစးတစးခုတညးေဆာကးပဵုကိုသိရိြႏိုငးပါမညး၈

မ္ကးပျငးံစာေပ 131
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Application ကို Eclipse တျငးဖျငးံၿပီ့ေသာအခါတျငး ပထမဆဵု့လုပးရမညး႕အလုပးမြာ main.xml ဖိုငးမြ


ပါွငးေသာ Hello World Statement ကိုေရ့သာ့ထာ့သညး႕ TextView ကိုဖ္ကးပစးရနး်ဖစးပါသညး၈
ထိုအခါ main.xml ဖိုငးကိုေအာကးပါအတိုငး့ေတျ႕်မငးရမညး်ဖစးသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>

ထို႕ေနာကး DIAL_ACTION intent ကိုအသဵု့်ပဳႏိုငးမညး႕ package ႏြစးခုကိုေအာကးတျငးေဖား်ပထာ့သညး႕


အတိုငး့ Project တျငးထညး႕သျငး့ေပ့ရပါမညး၈ ပထမ package သညး intent မ္ာ့ကို set up ်ပဳလုပးေပ့
ရနး အသဵု့်ပဳရ်ခငး့်ဖစးၿပီ့ ဒုတိယတစးခုမြာ URI မ္ာ့ကို သရုပးချဲရနးအသဵု့်ပဳပါသညး၈ (မြတးခ္ကး၈ ၈ Android
PhoneDialer.java ဖိုငးတျငး်ပဳလုပးရမညး႕ Code မ္ာ့်ဖစးပါသညး)

import android.content.Intent;
import android.net.Uri;

သတိ်ပဳရမညး႕အခ္ကးမြာ DIAL_ACTION intent တျငး ကျဲ်ပာ့ေသာ Intent Filter မ္ာ့စျာရိြၿပီ့ အသဵု့်ပဳ


ႏိုငးပါသညး၈ Phone Number တစးခုကို URI ကဲံသို႕ ်ဖတးသနး့ႏိုငးေသာ Filter ကိုအသဵု့်ပဳပါမညး၈

ေနာကးတစးဆငးံတျငး Intent ကို တညးေဆာကးေပ့ရပါမညး၈ Intent တစးခုကိုတညးေဆာကးရမညး႕ပဵုစဵကို


ေအာကးတျငးေဖား်ပထာ့ပါသညး၈

Intent <intent_name> = new Intent(<Android_Intent>,<data>)

ယခု်ပဳလုပးမညး႕ Application အတျကး <intent_name> ဟူေသာ ပထမ parameter ကို DialIntent


ဟုအမညးေပ့ပါမညး၈ ဒုတိယ Parameter <Android_Intent> အတျကး အထကးတျငးေဖား်ပခဲံၿပီ့်ဖစးေသာ
Activity Actions ဇယာ့တျငးၾကညး႕ပါ၈ Dialer ကို ေခၚႏိုငးေသာ Intent ်ဖစးသညး႕ DIAL_ACTION ကို
အသဵု့်ပဳရပါမညး၈ Intent ကိုေကာငး့မျနးစျာေခၚယူႏိုငးရနး format အမြနးအတိုငး့အသဵု့်ပဳရမညး်ဖစးေသာ
ေၾကာငးံ Intent.DIAL_ACTION ဟုအသဵု့်ပဳရပါမညး၈ ေနာကးဆဵု့ <data> parameter သညး ဖုနး့နဵပါတး
သာ်ဖစးပါသညး၈

132 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

DIAL_ACTION Intent သညး data ကို URI အ်ဖစးယူႏိုငးပါသညး၈ ထို႕ေၾကာငးံ Uri parse ကိုအသဵု့်ပဳၿပီ့
Phone Number ကိုသရုပးချဲေဖား်ပႏိုငးပါသညး၈ Uri parse ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ DIAL_ACTION ဟူေသာ
Intent ကို ဖုနး့နဵပါတးတစးခု၏ ဖုနး့ေခၚဆိမ
ု ႈကိုနာ့လညးေစပါသညး၈ ဖုနး့ေခၚဆိုလိုေသာ ဖုနး့နဵပါတးတစးခုခု
ကို String အ်ဖစးသတးမြတး၍ Uri.parse ကို pass ်ပဳလုပးႏိုငးပါသညး၈ ယခုဥပမာတျငး ဖုနး့နဵပါတး
“tel:5551212” ကိုအသဵု့်ပဳမညး်ဖစးၿပီ့ ထိုဖုနး့နဵပါတးတျငးႏြစးသကးရာ ဖုနး့နဵပါတးတစးခုကိုအသဵု့်ပဳႏိုငးပါ
သညး၈ ထို႕ေနာကး ်ပဳလုပးထာ့ေသာ Intent အတျကး Code မ္ာ့ကိုေအာကးပါအတိုငး့ေတျ႕်မငးရမည
်ဖစးပါသညး၈

Intent DialIntent = new


Intent(Intent.DIAL_ACTION,Uri.parse("tel:5551212"));

သတိ်ပဳရနးအခ္ကးမြာႀကိဳကးႏြစးသကးရာဖုနး့နဵပါတးကိုေခၚဆိုရနးအတျကး tel:<Phone_number> ကိုအသဵု့


်ပဳရပါမညး၈ Voicemail ကိုလညး့အသဵု့်ပဳႏိုငးၿပီ့ အသဵု့်ပဳရနးအတျကး tel:<voicemail_shortcut>
ကိုအသဵု့်ပဳရပါမညး၈

ဖနးတီ့ထာ့ေသာ Intent ႏြငးံအတူ Android ကို ဖုနး့နဵပါတးကို Dial ်ပဳလုပးေသာအခါတျငး Activity အသစး
တစးခုကို Launch ်ပဳလုပးရနးအတျကး Intent ၏ setLaunchFlags() ဟူေသာ method
ကိုအသဵု့်ပဳရပါမညး၈ launch ်ပဳလုပးရနးအတျကး setLaunchFlags() တျငးသငးံေတားေသာ parameter
ကိုအသဵု့်ပဳရပါ မညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ list တျငးအသဵု့်ပဳႏိုငးေသာ flag မ္ာ့ကို
ေဖား်ပထာ့ပါသညး၈

သတိ်ပဳရနးမြာ အခ္ိဳ႕ေသာအသဵု့်ပဳရမညး႕ေနရာမ္ာ့တျငး ေအာကးတျငးေဖား်ပထာ့ေသာ Flag မ္ာ့ကို တစးခု


ထကးမကအသဵု့်ပဳ၍ ဆႏၵရိြသညး႕ကိစၥရပးမ္ာ့အတျကး ပူ့ေပါငး့၍အသဵု့်ပဳႏိုငးပါသညး၈

 NO_HISTORY_LAUNCH - သညး Activity ကို System ၏ Launch History ထဲတျငး မြတးသာ့


ထာ့်ခငး့မရိြဘဲ Launch ်ပဳလုပးႏိုငးရနးအသဵု့်ပဳပါသညး၈
 SINGLE_TOP_LAUNCH - သညး အကယး၍ Activity တစးခုခုကိုေမာငး့ႏြငးထာ့ၿပီ့်ဖစးေနပါက
Launch မ်ပဳလုပးရနး ေ်ပာႏိုငးပါသညး၈
 NEW_TASK_LAUNCH - သညး Activity တစးခုကို Launch ်ပဳလုပးေပ့ပါသညး၈

မ္ကးပျငးံစာေပ 133
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

 MULTIPLE_TASK_LAUNCH - သညး Activity တစးခု Run ေနလြ္ငးေသားမြ ထို Activity ကို


Launch ေပ့မညး်ဖစးသညး၈
 FORWARD_RESULT_LAUNCH - သညး ထျကးေပၚလာေသာ result မ္ာ့ကို လကးခဵရနးအတျက
ယခငးရိြၿပီ့သာ့ Activity ကို ပဵုမြနး Forward ်ပဳလုပးေပ့ႏိုငးေသာ Activity အသစးတစးခုကို
Launch ်ပဳလုပးေပ့မညး်ဖစးပါသညး၈ယခုဥပမာကိုလုပးေဆာငးရာတျင
intent.NEW_TASK_LAUNCH ကိုအသဵု့်ပဳရပါမညး၈ ထို Launch ်ဖငးံ Dialer ်ပဳလုပးမညး႕
Activity အသစးတစးခုကို တညးေဆာကးရနး ချငးံ်ပဳေပ့မညး်ဖစးပါသညး၈

DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );

ေနာကးဆဵု့်ပဳလုပးရမညး႕အဆငးံမြာ Activity ကို အမြနးတကယး Launch ်ပဳလုပးမညး႕ Command တစးခုကို


ထညး႕သျငး့ရနး်ဖစးသညး၈ ထို Command သညး Dialer ကိုစတငးရနး Anrdoid ကိုခိုငး့ေစမညး်ဖစးေသာ
ေၾကာငးံ startActivity() ဟူေသာ Method ကိုအသဵု့်ပဳရနး လိုအပးပါမညး၈

startActivity(DialIntent);

Intent သညး startActivity () ကို်ဖတးသနး့သျာ့ရေၾကာငး့ သတိထာ့ပါ၈ Intent သသသညး Android


ကို်ဖတးသနး့၍ လုပးေဆာငးခ္ကးမ္ာ့ကိုလုပးေဆာငးမညး်ဖစးပါသညး၈ AndroidPhoneDialer.java ဖိုငး၏
်ပငးဆငးရိုကးထညး႕ဖနးတီ့ထာ့ေသာ Code အ်ပညး႕အစဵုကိုေအာကးတျငးေလံလာအသဵု့်ပဳႏိုငးပါသညး၈

package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.net.Uri;
public class AndroidPhoneDialer extends Activity {
/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
/** Create our Intent to call the Dialer */
/** Pass the Dialer the number 5551212 */
Intent DialIntent = new
Intent(Intent.DIAL_ACTION,Uri.parse("tel:5551212"));
/** Use NEW_TASK_LAUNCH to launch the Dialer Activity */
DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
/** Finally start the Activity */
startActivity(DialIntent);
} }

134 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး AndroidPhoneDialer ကို compile ်ပဳလုပးၿပီ့ Emulator တျငး Run ႏိုငးၿပီ်ဖစးသညး၈ အဆိုပါ
Compile လုပးေဆာငးခ္ကးမ္ာ့ကို ယခငးအခနး့တျငးေဖား်ပခဲံၿပီ့်ဖစးသညး႕အတျကး ေကာငး့မျနးစျာလုပးေဆာင
ႏိုငးမညးဟု ထငးပါသညး၈ Application ကို Run ေစေသာအခါ Emulator ပျငးံလာၿပီ့ေနာကး ယခုေရ့သာ့
ထာ့ေသာ Acitity ကိုေတျ႕်မငးရမညး်ဖစးသညး၈

မြတးသာ့ရနး၈ ၈ Eclipse တျငး Android Program မ္ာ့ေရ့သာ့သညး႕အခါတျငး စမး့သပးရနးအတျကး


Emulator ကိုအသဵု့်ပဳၿပီ့ေနာကးတျငး ်ပနးမပိတးသငးံပါ၈ ထိုသို႕်ပနးမပိတး်ခငး့်ဖငးံ သိသာထငးရြာ့ေသာ
အာ့သာခ္ကးႏြစးရပးရိြပါသညး၈ ပထမတစးခ္ကးမြာ အခ္ိနးကုနးသကးသာ်ဖငး့်ဖစးပါသညး၈ Emulator ကို
ဖျငးံေသာအခါတျငး Loading ်ပဳလုပးရနး အခ္ိနးအနညး့ငယးေစာငးံဆိုငး့ရတတးပါသညး၈ ထိုအခ္ိနးကန
ု း်ခငး့ကို
ေက္ားလႊာ့ေစႏိုငးမညး်ဖစးပါသညး၈ ဒုတိယအခ္ကးမြာ Activity ေရ့သာ့်ခငး့ကို အေ်ပာငး့အလဲအနညး့ငယ
်ပဳလုပးေသာအခါ အခ္ိနးအနညး့ငယးယူပါသညး၈ ထိုအေ်ပာငး့အလဲမ္ာ့ကို Emulator သို႕ကူ့ယူထာ့်ခငး့မ
ရိြေသာေၾကာငးံ Emulator ကိုအ်မဲတမး့ဖျငးံထာ့်ခငး့်ဖငးံ အခ္ိနးကုနးသကးသာေစပါသညး၈ Emulator ကို
ပတးေသာအခါတျငး Emulator အတျကး Cache ဖိုငး်ဖစးေသာ userdata-qemu.img ဖိုငးကို ဖ္ကးလိုကး
ပါသညး၈ ်ပနးဖျငးံေသာအခါတျငး ်ပနးလညးတညးေဆာကးပါသညး၈ ထို႕အတျကးလညး့ အခ္ိနးကုနးပါသညး၈
ထို႕ေၾကာငးံ Programming ေရ့သာ့ရာတျငး Emulator ကိုအ်မဲတမး့ဖျငးံထာ့ရနး အႀကဵေပ့လိုပါသညး၈

အထကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့ကို AndroidPhoneDial.java ဖိုငးတျငးေရ့သာ့ၿပီ့ေနာကး Run


ၾကညး႕လြ္ငး ေအာကးပါပဵုအတိုငး့ Emulator တျငးေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 135
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးတျငးေတျ႕်မငးရသညး႕ပဵုအတိုငး့ပငး Phone ၏ Dialer Activity ပျငးံလာေၾကာငး့ေတျ႕ရပါမညး၈


Dialer တျငး Phone Number ကိုေဖား်ပေပ့ေနပါမညး၈ Emulator မြ Send (Call) ခလုတးကိုႏိြပး်ခငး့်ဖင
ဖုနး့နဵပါတး 555-1212 ကိုေခၚဆိုေနမညး်ဖစးပါသညး၈ ထိုသို႕ Dialer Activity ကိုေဖား်ပ်ခငး့သညး အကယး
၍ အသဵု့်ပဳသူမြ ဖုနး့ေခၚဆို်ခငး့မ်ပဳမီ နဵပါတးမ္ာ့ကို ်ပငးဆငးေစလိုေသာ Application မ္ာ့ကိုေရ့သာ့လုိ
ေသာအခါတျငး အသဵု့ွငးေစပါသညး၈ ထို႕ေနာကး ေနာကးလာမညး႕အပိုငး့တျငး ထိုသို႕်ပငးဆငး်ခငး့မ်ပဳဘ
တိုကးရိုကးဖုနး့ေခၚဆိုေစႏိုငးေသာ Application တစးပုဒးကိုေရ့သာ့ၾကညး႕ပါမညး၈

Placing a Call from your Activity


ယခုအပိုငး့တျငး Dialer ကို ဖုနး့ေခၚဆိုရာတျငး Activity တျငးမညးသညး႕ Intent ကိုထညး႕သျငး့ရမညးက
ေလံလာရမညး်ဖစးသညး၈ ထို႕အ်ပငး မညးသညး႕ေနရာတျငး Intent ကိုထညး႕သျငး့ရမညးဆိုေသာအခ္ကးက
ပါ ေလံလာရပါမညး၈ ထို႕ေနာကးတျငး URI ကဲံသုိ႕ Phone Number ကိုမညးသို႕ကျပးကဲထိနး့ခ္ဳပးမညးဆ
ေသာအခ္ကးကိုလညး့ ေလံလာရပါမညး၈ Dialer Activity မြ Call Activity သို႕ေ်ပာငး့လဲရနးအတျက
ေ်ပာငး့လဲမႈမ္ာ့စျာကို ်ပဳလုပးရနးလိုအပးပါသညး၈ ထို႕ေၾကာငးံ အထကးတျငးေဖား်ပခဲံေသာ AndroidPhone
Dialer Activity ကိုပငး ်ပငးဆငး၍ Dialer ကိုဖျငးံ၍ ဖုနး့ေခၚဆိုရနးအတျကး Application တစးခုကို ေရ့သာ့
ၾကညး႕ၾကပါမညး၈

Adding the Intent to Your Activity


ႈေအာကးတျငးေဖား်ပထာ့သညး႕အတိုငး့ Intent ႏြငးံ Uri package မ္ာ့ကိုအသဵု့်ပဳရနးလိုအပးေနဆဲ်ဖစးပါ
သညး၈ ထို႕ေၾကာငးံ AndroidPhoneDialer.java ဖိုငး၏ header တျငးေအာကးပါ Package မ္ာ့ကို import
လုပးေပ့ရပါမညး၈

import android.content.Intent;
import android.net.Uri;

အဆိုပါ package မ္ာ့သညး လိုအပးေသာ Intent ကို စတငးအသဵု့်ပဳချငးံေပ့ရဵုသာမက ေခၚဆိုမညး႕


ဖုနး့နဵပါတးကိုလညး့ (Uri package ႏြငးံအတူ) Intent သို႕်ဖတးသနး့ချငးံ်ပဳေပ့ေစမညး်ဖစးပါသညး၈ ယခငး
အပိုငး့တျငးေဖား်ပထာ့ၿပီ့်ဖစးသညး႕ Activity Action Intent ဇယာ့ကိုၾကညး႕၍ ကိုကးညီမညး႕ Intent ကို
စဥး့စာ့ၾကညး႕ပါ၈ အသဵု့်ပဳရနးလိုအပးသညး႕ Intent မြာ CALL_ACTION ်ဖစးပါသညး၈ DIAL_ACTION ႏြငးံ

136 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

တူညီစျာ Android Dialer ကိုဖျငးံေပ့ၿပီ့ CALL_ACTION အရ Phone ၏ Calling လုပးေဆာငးခ္ကးက


launch လုပးေပ့ၿပီ့ သတးမြတးထာ့ေသာ ဖုနး့နဵပါတးကို ဖုနး့ေခၚဆိုေပ့မညး်ဖစးပါသညး၈

Intent ကိုဖနးတီ့ရနးအတျကး ယခငး်ပဳလုပးခဲံေသာ DIAL_ACTION အတိုငး့ပငး်ဖစးပါသညး၈ အမညးအာ့


်ဖငးံသာ DIAL ေနရာတျငး CALL ဟုသဵု့စျဲ်ခငး့်ဖစးသညး၈ ေအာကးတျငးေလံလာပါ၈

Intent CallIntent = new


Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));

ထို႕ေနာကး Uri.parse ကိုအသဵု့်ပဳ၍ Telephone Number ကို Activity သို႕ မြနးကနးေသာ parse ်ဖငးံ
pass ်ပဳလုပးေပ့ရပါမညး၈ ေနာကးတစးဆငးံအရ Android ကို Activity ကို launch ်ပဳလုပးရနး ေ်ပာဆိုရ
မညး်ဖစးၿပီ့ Lauch ်ပဳလုပးပါမညး၈ ထိုအဆငးံကို ေအာကးပါ Code မ္ာ့ထညး႕သျငး့်ခငး့်ဖငးံ လုပးေဆာငးႏိုငး
ပါသညး၈

CallIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(CallIntent);

ပထမ Code စာေၾကာငး့တျငး NEW_TASK_LAUNCH သို႕ lauch flag ကိုေပ့ပို႕ပါမညး၈ ၁ငး့သညး Call
Activity အသစးတစးခုကို launch ်ပဳလုပးေစပါလိမးံမညး၈ ေနာကးတစးေၾကာငး့တျငး Activity ကိုစတငးရနး
်ဖစးပါသညး၈ ထို Code စာေၾကာငး့မ္ာ့ကို ထညး႕သျငး့ၿပီ့ေနာကးတျငး AndroidPhoneDial.java ဖိုငးသညး
ေအာကးတျငးေဖား်ပထာ့သညး႕အတိုငး့ ်ဖစးလာပါမညး၈

package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.net.Uri;

public class AndroidPhoneDialer extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
/** Create our Intent to call the device's Call Activity */
/** Pass the Call the number 5551212 */
Intent CallIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));

/** Use NEW_TASK_LAUNCH to launch the Call Activity */


CallIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );

မ္ကးပျငးံစာေပ 137
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

/** Finally start the Activity */


startActivity(CallIntent);
}
}

ထို Application ကို Compile လုပးၿပီ့ Run ၍ထျကးေပၚလာေသာ Output ကိုေလံလာၾကညး႕ေသာအခါ


ေအာကးတျငးေဖား်ပထာ့ေသာပဵုႏြငးံ တူညီေသာ Error Message တစးခုကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

အထကးတျငး ေဖား်ပထာ့ေသာ Error ကိုေအာကးပါအတိုငး့ ေတျ႕်မငးႏိုငးမညး်ဖစးပါသညး၈

Application_Error:

Java.lang.SecurityException:
Permission Denial: starting Intent

ထို Application ကို Compile လုပးၿပီ့ Run ၍ထျကးေပၚလာေသာ Output ကိုေလံလာၾကညး႕ေသာအခါ


ေအာကးတျငးေဖား်ပထာ့ေသာပဵုႏြငးံ တူညီေသာ Error Message တစးခုကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈
အထကးတျငးေဖား်ပထာ့ေသာ Error သညး Android မြ Permission မရိြေသာေၾကာငးံ ေပၚေသာ Error
်ဖစးၿပီ့ ေ်ဖရြငး့ခ္ကးမ္ာ့ကို ေနာကးအပိုငး့တျငးေတျ႕်မငးရမညး်ဖစးပါသညး၈

138 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Editing Actvity Permissions


Activity Action Intent အမ္ာ့စုသညး Android မြ လုပးေဆာငးခ္ကးကိုမလုပးမီတျငး Proper permission
ကိုသတးမြတးေပ့ရနးလိုအပးေသာ အမ္ိဳ့အစာ့ထဲတျငပ
း ါွငးပါသညး၈ မ္ာ့စျာေသာ OS system မ္ာ့အတိုငး့
ပငး Android သညး မြနးကနးေသာ Credential ရိြေသာ Activity မ္ာ့ကိုသာ လုပးေဆာငးခ္ကးမ္ာ့ လုပး
ေဆာငးရနးချငးံ်ပဳေပ့ပါသညး၈ ယခုအသဵု့်ပဳခဲံေသာ Activity မ္ာ့သညး အဆိုပါ Credential ထကးေက္ား
လျနးေနေသာေၾကာငးံ လုပးေဆာငးခ္ကးမ္ာ့ကို လုပးေဆာငးႏိုငးစျမး့မရိြ်ခငး့်ဖစးပါသညး၈ အသဵု့်ပဳႏိုငးေသာ
Permission မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

 ACCESS_ASSISTED_GPS
 ACCESS_CELL_ID
 ACCESS_GPS
 ACCESS_LOCATION
 ACCESS_SURFACE_FLINGER
 ADD_SYSTEM_SERVICE
 BROADCAST_PACKAGE_REMOVED
 BROADCAST_STICKY
 CALL_PHONE
 CHANGE_COMPONENT_ENABLED_STATE
 DELETE_PACKAGES
 DUMP
 FOTA_UPDATE
 GET_TASKS
 INSTALL_PACKAGES
 INTERNAL_SYSTEM_WINDOW
 RAISED_THREAD_PRIORITY
 READ_CONTACTS

မ္ကးပျငးံစာေပ 139
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

 READ_FRAME_BUFFER
 RECEIVE_BOOT_COMPLETED
 RECEIVE_SMS
 RECEIVE_WAP_PUSH
 RUN_INSTRUMENTATION
 SET_ACTIVITY_WATCHER
 SET_PREFERRED_APPLICATIONS
 SIGNAL_PERSISTENT_PROCESSES
 SYSTEM_ALERT_WINDOW
 WRITE_CONTACTS
 WRITE_SETTINGS

အထကးတျငးေဖား်ပထာ့ေသာ Permission မ္ာ့ကိုေဖား်ပေသာဇယာ့ႏြငးံ ယခငးအပိုငး့တျငး ေဖား်ပထာ့ခဲံ


ၿပီ့်ဖစးသညး႕ Activity Action Intent ဇယာ့ပါ Intent မ္ာ့ကိုႏိႈငး့ယြဥးၾကညး႕ပါ၈ Intent အမ္ာ့စုသညး
သကးဆိုငးရာ permission မ္ာ့်ဖငးံကိုကးညီသညးကိုေတျ႕ရမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ အထကးအပိုငး့တျင
ေဖား်ပခဲံေသာ CALL_ACTION Intent အတျကးလညး့ Permission ကိုသတးမြတးေပ့ရနးလိုပါသညး၈
အသဵု့်ပဳမညး႕ Activity ကိုမြနးကနးေသာ Permission ကိုသတးမြတးႏိုငးရနးအတျကး မညးသညး႕ Permission
ကိုသတးမြတးရနးလိုအပးသညးကို သိရိြထာ့ရနးလိုအပးပါသညး၈ လကးရိြ အသဵု့်ပဳလုပးေဆာငးေနေသာ ဥပမာ
Project သညး Dialer Activity ကိုအသဵု့်ပဳ်ခငး့်ဖစးပါသညး၈ Dialer Activity ကို CALL_PHONE ဟူေသာ
permission မြ ထိနး့ခ္ဳပးပါသညး၈ ေရ့သာ့ေနေသာ Activity တျငး Permission ကိုထညး႕သျငး့ assign
်ပဳလုပး်ခငး့်ဖငးံ Android မြ Dialer Activity ကို launch ်ပဳလုပးရနး intent ကိုချငးံ်ပဳေပ့မညး်ဖစးသညး၈
Activity တျငး Permission မ္ာ့ထညး႕သျငး့ရနးအတျကး Activity ၏ Manifest ကို်ပငးဆငးရနးလိုအပးပါ
သညး၈ Eclispse ကိုအသဵု့်ပဳေန်ခငး့်ဖစးသညး႕အတျကး AndroidMainfest.xml ဖိုငးတျငး Double Click
ႏိြပးပါ၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Android Manifest Overview Window ေပၚလာသညးက
ေတျ႕်မငးရမညး်ဖစးပါသညး၈

140 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Activity ၏ permission ကို်ပငးဆငးရနးအတျကး အထကးတျငးေဖား်ပထာ့ေသာပဵုမြ Permission ဟူေသာ


link တျငး Click တစးခ္ကးႏိြပးေပ့ပါ၈ ထိုအခါေအာကးတျငးေဖား်ပထာ့သညး႕အတိုငး့ Android Manifest
Permission Windows ေပၚလာသညးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 141
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို Windows တျငး လကးရိြ Activity အတျကး assign ်ပဳလုပးထာ့ေသာ Permission မ္ာ့ကိုေဖား်ပေန
မညး်ဖစးသညး၈ အထကးပါပဵုတျငး Project အသစးႏြငးံအလုပးလုပးေဆာငးေနသညး႕အတျကး မညးသညး႕
Permission ကိုမြ္ သတးမြတးထာ့်ခငး့မရိြေၾကာငး့ေတျ႕ရပါမညး၈ ထို႕ေၾကာငးံ လုပးေဆာငးခ္ကးကိုစတငးရန
Add ခလုတးတျငး Click ႏိြပးပါ၈ Dialogbox တစးခုပျငးံလာေသာအခါတျငး Uses Permission ကိုေရျ့ခ္ယး၍
OK ကို Click ႏိြပးပါ၈ ထိုအခါ Android Manifest Permission Window သို႕်ပနးေရာကးလာၿပီ့ Name ဟူ
ေသာ drop-down list တျငး android.permission.CALL_PHONE ကိုေရျ့ခ္ယးရပါမညး၈ ေအာကးတျငး
ေဖား်ပထာ့ေသာပဵုတျငး ်ပထာ့ပါသညး၈ ထိုစာေၾကာငး့ကိုေရျ့ခ္ယး်ခငး့်ဖငးံ ေရ့သာ့ေနသညး႕ Activity
အတျကး CALL_PHONE permission ကိုထညး႕သျငး့ေပ့်ခငး့်ဖစးပါသညး၈

142 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

CALL_PHONE permission ကိုထညး႕သျငး့ၿပီ့ေနာကး AndroidManifest.xml ဖိုငးတျငးေရ့သာ့ထာ့ေသာ


Code မ္ာ့ကိုၾကညး႕ပါ၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code အမ္ာ့အတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

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


<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidPhoneDialer">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidPhoneDialer"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission></manifest>

စိတွ
း ငးစာ့ဖျယးအေကာငး့ဆဵု့ Code စာေၾကာငး့မြာ ေအာကးပါ Code ပငး်ဖစးပါသညး၈
<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>

မ္ကးပျငးံစာေပ 143
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးေဖား်ပပါ Code မ္ာ့ကို Android plugin မြေပါငး့ထညး႕ထာ့ေပ့်ခငး့်ဖစးပါသညး၈ အကယး၍ ်ပဳလုပး


တတးပါက AndroidMainifest.xml တျငး အထကးေဖား်ပပါ Code မ္ာ့ေရ့သာ့်ခငး့်ဖငးံ ်ပငးဆငးႏိုငးမည
်ဖစးပါသညး၈ သို႕ရာတျငး အကယး၍ မညးကဲံသို႕ Permission မ္ာ့ထညး႕သျငး့ရမညးကို မသိေသာကာလ
တျငး လျဲေခ္ားမႈမ္ာ့ရိြႏိုငးေသာေၾကာငးံ Manifest ၏ Wizard ကိုသာအသဵု့်ပဳသငးံပါသညး၈

Permission ကို Assign ်ပဳလုပးသတးမြတးၿပီ့ေနာကး Activity ကို Recompile ်ပနးလုပး၍ Run ်ပနးလုပး
ၾကညး႕ပါ၈ Emulator တျငး Phone Call တစးခုေခၚဆိုေနေၾကာငး့ကို ေအာကးပါပဵုအရ ေတျ႕်မငးႏိုငးမညး
်ဖစးပါသညး၈

တညးေဆာကးခဲံေသာ Activity တျငး Call Activity ကို Launch ်ပဳလုပးရနး Intent တစးခုကို အသဵု့်ပဳခဲံပါ
သညး၈ အထကးပါဥပမာတျငး Intent တစးခုကို အက္ိဳ့ရိြရိြအသဵု့်ပဳခဲံ်ခငး့ကိုေဖား်ပခဲံပါသညး၈ သို႕ရာတျငး
အဆိုပါ Application တျငးလကးေတျ႕လုပးေဆာငးရေသာ လုပးေဆာငးခ္ကးအနညး့ငယး ပါ ပါသညး၈
ေနာကးလာမညး႕အပိုငး့တျငး ပိုမိုလကးေတျ႕က္ေသာ application မ္ာ့တညးေဆာကးၾကညး႕ၾကမညး်ဖစးၿပီ့
ခလုတးတစးခုထညး႕သျငး့တညးေဆာကး၍ Call_Action ကိုပါ တစးပါတညး့အသဵု့်ပဳၾကညး႕ပါမညး၈ ထို႕အ်ပငး

144 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

textbox တစးခုကိုပါ ထညး႕သျငး့၍ ထို textbox ထဲတျငး ေခၚဆိုလိုေသာ ဖုနး့နဵပါတးမ္ာ့ကိုရိုကးထညး႕


အသဵု့်ပဳေစႏိုငးမညး်ဖစးပါသညး၈

Modifying the AndroidPhoneDialer


ယခုအပိုငး့တျငး ယခငးတညးေဆာကးစမး့သပးခဲံေသာ AndroidPhoneDialer Project ကို်ပငးဆငးၿပီ့
ပိုမိုလကးေတျ႕က္က္အသဵု့်ပဳႏိုငးေစရနး feature အသစးမ္ာ့ကိုထညး႕သျငး့ၾကညး႕ၾကပါမညး၈ ယခုအပိုငး့ကို
ေလံလာၿပီ့ေနာကးတျငး Intent မ္ာ့ အသဵု့်ပဳ်ခငး့ကိုသာမက EditText ႏြငးံ Button မ္ာ့အေၾကာငး့
ကိုလညး့ ေသခ္ာစျာ နာ့လညးအသဵု့်ပဳတတးေစမညး်ဖစးပါသညး၈

Adding a Button
ယခုအပးိုငး့တျငး Button တစးခုထညး႕သျငး့အသဵု့်ပဳ၍ မညးသို႕်ပငးဆငးမညးကို ေလံလာရပါမညး၈ Activity
ကို စတငးသညးႏြငးံ Intent ကိုအလုပးေစမညး႕အစာ့၇ Button ကိုႏိြပးေသာအခါတျငးမြ Intent ကိုလုပး
ေဆာငးေစရနး ်ပငးဆငးပါသညး၈ Text မ္ာ့၇ Button မ္ာ့သညး မညးသညး႕ Application တျငးမဆို အသဵု့
အမ္ာ့ဆဵု့ေသာ Object မ္ာ့်ဖစးပါသညး၈ Button မ္ာ့သညး အသဵု့်ပဳသူႏြငးံ Application အၾကာ့တျငး
ကူ့လူ့စျာဆကးသျယးမႈေပ့ေသာ Object တစးခုလညး့်ဖစးပါသညး၈ Button ႏြငးံ ၁ငး့ Button ၏အလုပး
လုပးေဆာငးပဵုကိုေလံလာ်ခငး့်ဖငးံ လကးေတျ႕က္ေသာ၇ အသဵု့ွငးေသာ Activity တစးခုကိုတညးေဆာကးႏိုင
မညး်ဖစးပါသညး၈ Button ကိုတညးေဆာကးရနးအတျကး main.xml သို႕ွငးေရာကး၍ တညးေဆာကးရပါမညး၈
အခနး့ (၂) တျငးေဖား်ပခဲံေသာ Hello World! Activity အတျကး TextView တညးေဆာကးခဲံ်ခငး့က
်ပနးလညးေတျ့ေတာၾကညး႕ႏိုငးပါသညး၈

သတိ်ပဳရနးအခ္ကးမြာmain.xml ဖိုငးတျငး View တစးခုကိုတညးေဆာကးေသာအခါတျငးေပၚေစလိုေသာ


View ကိုသာ Android သို႕ေတာငး့ဆိုခဲံရပါသညး၈ ထို႕အ်ပငး AndroidPhoneDialer.java ဖိုငးအတျငး့တျငး
Function က္နစျာ Assign ်ပဳလုပးရနးလိုအပးသညးကို သတိရသငးံပါသညး၈

<View android:id=<id>
android:layout_width=<width>
android:layout_height=<height>
>

မ္ကးပျငးံစာေပ 145
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးတျငးေဖား်ပထာ့ေသာ Code ၏ Format မ္ာ့သညး View မ္ာ့အတျကးလိုအပးေသာ Code မ္ာ့


်ဖစးသကဲံသို႕ပငး Button ကိုအသဵု့်ပဳေသာအခါတျငးလညး့ ထိုအတိုငး့အသဵု့်ပဳရပါမညး၈ Button အတျကး
သတးမြတးရနးလိုအပးေသာ XML attribute မ္ာ့မြာ android:id၇ android:layout_width၇ android:
layout_height ႏြငးံ android:text တို႕ပငး်ဖစးပါသညး၈ ထို XML attribute ေလ့ခုကို Button မ္ာ့ကို
တညးေဆာကးေသာအခါတျးင ေဖား်ပရနးလိုအပးပါသညး၈ ထိုသို႕ေဖား်ပေသာအခါတျငးမြ Activity အတျငး့
တျငးအဆိုပါ Button ကိုအသဵု့်ပဳေစႏိုငးမညး်ဖစးပါသညး၈

ှ၈ အသဵု့်ပဳမညး႕ Button ၏ ID ကို callButton ဟု assign ်ပဳလုပးသတးမြတးပါမညး၈

android:id="@+id/callButton"

ဿ၈ layout_width ႏြငးံ Layout_height မ္ာ့ကို fill_parent ႏြငးံ Wrap_content ဟုအသီ့သီ့သတးမြတ


ေပ့ရပါမညး၈

android:layout_width="fill_parent"
android:layout_height="wrap_content"

၀၈ Button အတျကးအသဵု့်ပဳမညး႕ စာသာ့ကို “Show Dialer” ဟုေရ့သာ့ပါမညး၈

android:text="Show Dialer"

Button အတျကးအသဵု့်ပဳရမညး႕ XML attribute မ္ာ့ေရ့သာ့ထာ့ေသာ Code မ္ာ့ကိုေအာကးတျငးေတျ႕


်မငးရပါမညး၈

<Button android:id="@+id/callButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Show Dialer" />

ထို႕ေနာကး Code မ္ာ့ေရ့သာ့ထာ့ၿပီ့ေသာ main.xml ဖိုငးမြ Code မ္ာ့ကိုၾကညး႕လြ္ငး ေအာကးပါအတိုငး့


ေတျ႕ရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

>

146 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<Button android:id="@+id/callButton"
android:layout_width="fill_parent"
0
android:layout_height="wrap_content"
android:text="Show Dialer" />
</LinearLayout>

Button အတျကး Function မ္ာ့ထညး႕သျငး့ၿပီ့ေနာကးတျငး AnroidPhoneDialer.java ဖိုငးတျငး အ်ခာ့


package တစးခုကိုထညး႕သျငး့ေပ့ရနးလိုအပးပါမညး၈ Button View ပါွငးေသာ Package မြာ

android.widget.Button;

ထို႕ေနာကး Button widget ကိုလညး့ Project အတျငး့တျငးထညး႕သျငး့ထာ့ၿပီ့်ဖစးပါသညး၈ ထို႕ေနာကး


Project အတျငး့ေရ့သာ့မညး႕ Code မ္ာ့ကိုစတငးရနးအတျကးအခ္ကးအလကးမ္ာ့ကို လိုအပးမညး်ဖစးပါ
သညး၈ ယခု Project အတျငး့မြ Code မ္ာ့ေရ့သာ့်ခငး့၏ ရလဒးအရ Activity အတျငး့ Button တစးခု
ရိြမညး်ဖစးၿပီ့ ထို Button ကိုႏိြပးလိုကး်ခငး့်ဖငးံ Call Activity ကိုစတငးေစရမညး်ဖစးသညး၈ Call Activity
တျငးလညး့ ဖုနး့နဵပါတး “tel:5551212” ကိုပငး Data အ်ဖစး launch လုပးေဆာငးေစပါမညး၈ ထျကးေပၚလာ
ေသာ Output သညးယခငးေရ့သာ့ခဲံေသာ AndroidPhoneDialer Project ႏြငးံ တူညီပါသညး၈ အထကး
တျငးေဖား်ပထာ့ေသာ Function မ္ာ့ကို Code ေရ့သာ့သညး႕အခါတျငး အယူအဆအမ္ိဳ့မ္ိဳ့်ဖငးံ ေရ့သာ့
ႏိုငးပါသညး၈ ပထမအေန်ဖငးံ Program တျငး Button တစးခုကိုေရ့ဆျဲၿပီ့ Button attrubte မ္ာ့ကို
main.xml တျငးေၾက်ငာပါသညး၈ ထို႕ေနာကး CALL_ACTION intent Code တစးခုကိုတညးေဆာကးပါ
မညး၈ ေနာကးဆဵု့ Button သညး Function ကို Execute ်ပဳလုပးရနးႏြငးံ Intent ကို launch ်ပဳလုပးရနး
လိုအပးဦ့မညး်ဖစးပါသညး၈ Button ကို်ပဳလုပးရမညး႕ပဵုစဵမြာ

final Button <button_name> = <button>

အထကးပါ Equation ၏ဘယးဘကး်ခမး့သညး Code အတျငး့ Button ကိုတညးေဆာကးရနး်ဖစးသညး၈


ညာဖကး်ခမး့သညး main.xml ဖိုငးမြ Button ၏ attribute မ္ာ့ကိုေခၚယူရနး်ဖစးပါသညး၈ attribute မ္ာ့ကို
ေခၚယူရနးအတျကး findViewById() ကိုအသဵု့်ပဳရမညး်ဖစးၿပီ့ Button တစးခု၏ attribute မ္ာ့အ်ဖစး
နာ့လညးေစပါသညး၈ ယခုေနရာတျငး လကးေတျ႕အသဵု့်ပဳၾကညး႕သညးထကးအနညး့ငယးရႈပးေထျ့ေနမည
်ဖစးၿပီ့ ဆကးလကးေလံလာၿပီ့ လကးေတျ႕်ပဳလုပးၾကညး႕်ခငး့်ဖငးံ လျယးကူသျာ့ေစမညး်ဖစးပါသညး၈ Button
Attribute မ္ာ့ကို main.xml တျငးေရ့သာ့ခဲံေသာအခါ Button အတျကးသတးမြတးထာ့ေသာ adroid:id
ကို callButton ဟုသတးမြတးခဲံ်ခငး့ကို မြတးမိဦ့မညးထငးပါသညး၈ အဆိုပါ id ႏြငးံသကးဆိုငးေသာ Code

မ္ကးပျငးံစာေပ 147
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

တစးေၾကာငး့လဵု့ကို R.id.callButton ဟူေသ id File အ်ဖစး Anroid Plugin မြ register ်ပဳလုပးထာ့ခဲံပါ


သညး၈ findViewById() ဟူေသာ Method ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ main.xml ဖိုငးမြ attribute မ္ာ့ကို အဆိုပါ
id CallButton ကို်ဖတးသနး့၍ ရရိြေစႏိုငးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးပါ Code အတိုငး့်ဖစးလာမညး်ဖစ
သညး၈

findViewById(R.id.callButton)

အဆိုပါ Command ၏ေရြ႕တျငး Button အ်ဖစးသတးမြတးရနးမေမံသငးံပါ၈ ထို႕ေၾကာငးံ ေအာကးပါ Code


အတိုငး့်ဖစးလာပါမညး၈

(Button) findViewById(R.id.callButton)

ယခုအခါ Code equation ၏ညာဖကးအ်ခမး့ကိုေရ့သာ့ၿပီ့သျာ့ေသာေၾကာငးံ Code Equation တစးခုလဵု့


ကိုေအာကးပါအတိုငး့ေတျ႕ရပါလိမးံမညး၈

final Button callButton = (Button) findViewById(R.id.callButton);

ယခုအခါ Button တစးခုကိုေအာငး်မငးစျာတညးေဆာကးႏိုငးၿပီ့်ဖစးေသားလညး့ ဆကးလကးလုပးေဆာငးစရာ


မ္ာ့ရိြေနပါေသ့သညး၈ Button တစးခုတျငး အလုပးလုပးေဆာငးေစေသာ Code မပါွငးပါက မညးသညး႕
အလုပးကိုမြ္ မလုပးေဆာငးေစႏိုငးပါ၈ ယခုေရ့သာ့ေနေသာ Application ၏ရညးရျယးခ္ကးမ္ာ့အရ
CALL_ACTION Intent ကို Button မြ Execute ်ပဳလုပးေပ့ႏိုငးေသာ လုပးေဆာငးခ္ကးကို ေရ့သာ့ရနး
လိုအပးပါလိမးံမညး၈ ထို႕ေၾကာငးံ ရိြၿပီ့်ဖစးေသာ Intent Call ႏြငသ
းံ ကးဆိုငးေသာ ေသ့ငယးေသာ Function
တစးခုတညးေဆာကးရပါမညး၈ ထို function သညး Button ကို ႏိြပးလိုကးေသာအခါ Phone Call ေခၚဆိုရနး
အတျကး ေရ့သာ့ရ်ခငး့်ဖစးပါသညး၈ ယခငးေရ့သာ့ခဲံေသာ Intent Code ကိုေခၚယူရနးအတျကး onClick()
ဟူေသာ Method ကို setup ်ပဳလုပးရပါလိမးံမညး၈ onClick() Method သညး View တစးခုကို Argument
တစးခုသဖျယး ယူဆေသားလညး့ ယခု Project တျငး onClick() method ကို View တစးခုအ်ဖစး အသဵု့်ပဳ
ေခၚယူမညးမဟုတးပါ၈

public void onClick(View v){


Intent callIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));
callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(callIntent);
}

148 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကးက္နးရိြေသာ ေရ့သာ့ရနးလိုအပးသညး႕ Code မြာ Button ႏြငးံ onClick Method ကိုဆကးစပးေပ့


ေစႏိုငးေသာ Listener ်ဖစးပါသညး၈ Listener ဆိုသညးမြာ အ်ခာ့ေသာ Oject မ္ာ့မြ ေခၚယူေသာအခါ
Java Object မ္ာ့မြ Listen ်ပဳလုပးေစႏိုငးေသာ Method တစးခုပငး်ဖစးပါသညး၈ Android တျငးလညး့ ထို
အယူအဆကိုဆကးလကးအသဵု့်ပဳၿပီ့ Listener မ္ာ့ကို Establish ်ပဳလုပးေသာအခါ အ်ခာ့ေသာ input
မ္ာ့မြ Android Views handle မ္ာ့ကိုေခၚယူရနး ချငးံ်ပဳေပ့ပါသညး၈ ယခု Project တျငး Button မြ onClick
Event ကို Listen ်ပဳလုပးေစမညး႕ Listener တစးခုကိုတညးေဆာကးရနးလိုအပးပါသညး၈ အသဵု့်ပဳသူမြ
Button ကိုႏိြပးလိုကးေသာအခါတျငး Listener သညး onClick() Method အတျငး့မြ Code ကိုေခၚယူမည
်ဖစးပါသညး၈ ထိုသို႕ Listener ကို တညးေဆာကး (establish) ်ပဳလုပးရနးလိုအပးေသာအခါတျငး Button ၏
setOnClickListener() ဟူေသာ method ကိုအသဵု့်ပဳႏိုငးပါသညး၈ Java Development တျငးအသဵု့်ပဳဖူ့ခဲံ
ပါက အဆိုပါ Structure သညးအစိမး့သကးသကး်ဖစးမညးမဟုတးပါ၈ ၁ငး့သညး Java တျငး အသဵု့်ပဳေလံရိြ
ေသာ onClickListener interface implementation တစးခုသာ်ဖစးပါသညး၈ Button အတျကး
onClickListen () ဟူေသာ method ကို သဵု့စျဲ (implement) ရနး Java anonymous class ကိုအသဵု့်ပဳရ
ပါမညး၈ ထို႕ေၾကာငးံ anonymous class တစးခုအ်ဖစး်ဖငးံ Local variable မ္ာ့၏သဵု့စျဲမႈကို ယူငငးသဵု့စျဲရ
ပါမညး၈ ယခု Project တျငး Button အတျကး Variable ကို final အ်ဖစး define ်ပဳလုပးသတးမြတးေစပါမညး၈

setOnClickListen() ဟူေသာ method တျငး Argument တစးစဵုကိုအသဵု့်ပဳပါသညး၈ ပထမ Argument


သညး onClickListen() ၏ Installation ်ဖစးၿပီ့ ဒုတိယ argument သညး ယခငးသတးမြတး establish
်ပဳလုပးခဲံေသာ onClick() method ပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ setOnClickListen() method ကို
ေအာကးပါအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

callButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
Intent callIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));
callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(callIntent);
}
});

အထကးပါ Code Segment အရ callButton ကိုႏိြပးလိုကးေသာအခါ onClickListener သညး onClick


အတျငး့ရိြ Code မ္ာ့ကို execute ်ပဳလုပးေစပါမညး၈ onClick တျငးရိြေသာ code မ္ာ့သညးလညး့ CALL_
ACTION intent ကို execute ်ပဳလုပးေစမညး်ဖစးၿပီ့ Phone Number 555-1212 ကိုေခၚဆိုေစမညး်ဖစးပါ
မ္ကးပျငးံစာေပ 149
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

သညး၈ ထို႕ေနာကး Code အာ့လဵု့ကိုေရ့သာ့ၿပီ့သညး႕ AndroidPhoneDialer.java ဖိုငးမြ Code မ္ာ့ကို


ေအာကးပါအတိုငး့ေတျ႕်မငးႏိုငးပါမညး၈

package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.content.Intent;
import android.net.Uri;

public class AndroidPhoneDialer extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main );
/** Create the Button */
final Button callButton = (Button)
findViewById(R.id.callButton);
/** Set the onClickListener to call the onClick */
callButton.setOnClickListener(new Button.OnClickListener() {
/** Use the onClick to call the existing Intent code */
public void onClick(View v){
Intent callIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));
callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(callIntent);
}
});
}
}

ထို႕ေနာကး Project ကို Compile ်ပဳလုပး၍ Emulator အတျငး့တျငး Run ၾကညး႕ပါ၈ main Activity မြ
Show Dialer ဟုအမညးရသညး႕ Button တစးခုကိုေဖား်ပေပ့ေနမညး်ဖစးသညး၈ ထို Button ကိုႏိြပးလိုကး
ေသာအခါ Call Activity ပျငးံလာမညး်ဖစးၿပီ့ 555-1212 ကို Dial ်ပဳလုပးေနပါလိမးံမညး၈ အဆိုပါလုပးေဆာင
ခ္ကးမ္ာ့ကို်ပသထာ့ပဵုကိုေအာကးတျငးေတျ႕ႏိုငးပါသညး၈

150 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

်မငးေတျ႕ခဲံရသညး႕အတိုငး့ပငး Android သညးၾကဵ႕ခိုငးၿပီ့ ်ပဳလျယး်ပငးလျယး်ဖစးေသာ Platform တစးခု်ဖစး


ေၾကာငး့ေတျ႕ရပါမညး၈ စာတစးမ္ကးႏြာထကးနညး့ပါ့ေသာ Code မ္ာ့ကိုေရ့သာ့်ခငး့်ဖငးံပငး Device ၏
Hardware ကိုအက္ိဳ့်ပဳၿပီ့ Button တစးခုပါပါွငးလုပးေဆာငးႏိုငးေသာ Activity တစးခုကိုဖနးတီ့ၿပီ့ ်ဖစးပါ
သညး၈ ထို႕အ်ပငး Android Handles မ္ာ့်ဖစးေသာ Activity မ္ာ့၇ Intent မ္ာ့၇ View မ္ာ့်ဖငးံအလုပးလုပ
ေဆာငး်ခငး့သညးလညး့ မခကးခဲလြသညးကို ်မငးေတျ႕ခဲံရပါသညး၈ အထကးတျငးေဖား်ပခဲံေသာ Android
PhoneDial Activity သညးအေတားအတနးအသဵု့ွငး၍လကးေတျ႕ဆနးပါသညး၈ သို႕ရာတျငး ထို႕ထကးပိုမို
အသဵု့ွငးႏိုငးေသာ Activity တစးခုကိုတညးေဆာကးၾကညး႕ၾကပါမညး၈ ထို Activity တျငး Phone Number
အ်ဖစး အသဵု့်ပဳသူမြထညး႕သျငး့ႏိုငးေသာ EditText View ၏အသဵု့်ပဳပဵုကို ေလံလာရမညး ်ဖစးပါသညး၈
ဖုနး့နဵပါတးကိုလညး့ tel:5551212 ဟုအေသမမြတးထာ့ဘဲ CALL_ACTION ကို်ဖတးသနး့ႏိုငးမညး႕
Number အရြငးတစးခုကို အသဵု့်ပဳၾကညး႕ၾကပါမညး၈

Implementing an EditText View


Activity တျငး View တစးခုကိုထညး႕သျငး့်ခငး့်ဖငးံ ၁ငး့သညး စာသာ့အခ္ိဳ႕ကိုအသဵု့်ပဳသူမြ ထညး႕သျငး့ရနး
ချငးံ်ပဳေပ့ေစပါသညး၈ အဆိုပါ စာသာ့ကို ယူ၍ ယခငးအပိုငး့တျငးေဖား်ပခဲံေသာ Intent Call သို႕ပို႕ေဆာငး

မ္ကးပျငးံစာေပ 151
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေပ့ပါမညး၈ အာ့လဵု့ေသာ View မ္ာ့သညး Base View မြအေမျဆကးခဵ်ခငး့်ဖစးေသာေၾကာငးံ Sturcture


ပိုငး့ႏြငးံအသဵု့်ပဳရသညး႕အပိုငး့တျငးအလျနးတူညီပါသညး၈ ထို႕ေၾကာငးံ EditText တစးခုကို Implement ်ပဳ
လုပးရ်ခငး့သညး အလျနးရို့ရြငး့ေသာ လုပးေဆာငးခ္ကးတစးခု်ဖစးသညးကို ေတျ႕ရပါလိမးံမညး၈

ေရြ့ဦ့စျာ main.xml ဖိုငးတျငး View မ္ာ့ကိုသတးမြတးပါမညး၈ အတိအက္ဆိုရလြ္ငး View ႏြစးခုကိုထညး႕


သျငး့မညး်ဖစးၿပီ့ တစးခုမြာ အသဵု့်ပဳသူကိုလမး့ညႊနးခ္ကးမ္ာ့ေပ့ႏိုငးေသာ Label တစးခုကဲံသို႕ အသဵု့်ပဳမညး႕
TextView တစးခု်ဖစးၿပီ့ေနာကးတစးခုမြာ User မြရိုကးထညး႕လိုကးေသာ input ကိုလကးခဵေစမညး႕ EditText
တစးခုပငး်ဖစးပါသညး၈ အဆိုပါ View ႏြစးခုကို လိအ
ု ပးခ္ကးႏြငးံကိုကးညီေအာငး Activity အတျငး့တျငး
ထညး႕သျငး့ေပ့ရပါမညး၈ Activity အတျငး့မြ .xml ဖိုငးကို စိတးထဲတျငးတညးေဆာကးၾကညး႕ပါ၈ TextView
ကို EditView ၏အထကးတျငးေပၚေစခ္ငးသညးဆိုပါအဵံ၈ ထို႕ေၾကာငးံ main.xml ဖိုငးအတျငး့တျငး TextView
ကို EditText ထကးအလ္ငးဦ့စျာ ထာ့ေပ့ရပါလိမံးမညး၈

ႊTextView မ္ာ့ကို ယခငးအပိုငး့မ္ာ့တျငး အႀကိမးမ္ာ့စျာအသဵု့်ပဳခဲံၿပီ်ဖစးေသာေၾကာငးံ TextView တစးခု


တညးေဆာကးရာတျငးအခကးအခဲမရိြႏိုငးဟုယူဆပါမညး၈ TextView အတျကးသတးမြတးေပ့ရသညး႕
Attrubte မ္ာ့ကိုေအာကးတျငးေတျ႕်မငးႏိုငးပါသညး၈

<TextView android:id="@+id/textLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter Number to Dial:"
/>

အထကးပါ Code မ္ာ့အရ သာမနးထကးပိုမိုမခကးခဲပါ၈ TextView တျငးအသဵု့်ပဳမညး႕စာသာ့ကို Enter


Number to Dial: ဟုေရ့သာ့ထာ့ၿပီ့ ထို TextView ကို EditView အတျကး Label တစးခုအေန်ဖငးံ
်ပဳလုပးဖနးတီ့ထာ့်ခငး့်ဖစးပါသညး၈ ေအာကးတျငး EditView အတျကးလုိအပးေသာ Attribute မ္ာ့ကို ေဖား်ပ
ေပ့ထာ့ပါသညး၈

<EditText android:id="@+id/phoneNumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

မြတးသာ့ရနး၈ ၈ အထကးပါ EditView တျငး Activity စတငးလိုကးသညးႏြငးံ Default အေန်ဖငးံ ေပၚေနေစ


လိုေသာ စာသာ့ကိုမလိုအပးေသာေၾကာငးံ android:text ဟူေသာ attribute ကိုသတးမြတးေနစရာမလိုပါ၈
152 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

EditView အတျကး id ကို PhoneNumber ဟုသတးမြတးထာ့ပါသညး၈ ထိုအမညးသညး Code အတျငး့မြ


EditText ကိုညႊနး့ဆိုရနးအတျကး အသဵု့်ပဳရမညး႕အမညး်ဖစးပါသညး၈ ထို႕ေနာကး main.xml ဖိုငးအတျငး့
ရိြေနမညး႕ Code မ္ာ့ကိုေအာကးတျငးၾကညး႕ရြဳႏိုငးပါသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/textLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter Number to Dial:"
/>
<EditText android:id="@+id/phoneNumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/callButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Show Dialer" />

</LinearLayout>

main.xml ဖိုငးကို်ပငးဆငးၿပီ့စီ့သျာ့ၿပီ့်ဖစးသညး႕အတျကး AndroidPhoneDialer.java ဖိုငးသို႕သျာ့ေရာက


ရပါမညး၈ အကယး၍ ယခငးအပိုငး့တျငးေဖား်ပခဲံေသာ AndroidPhoneDialer.java ကိုလုပးေဆာငးၾကညး႕ခ
်ခငး့မရိြပါက ယခငးအပိုငး့သို႕သျာ့ေရာကး၍ .java ဖိုငးအတျငး့ မညးသညး႕ Code မ္ာ့ထညး႕သျငး့ခဲံသညးက
သျာ့ေရာကး၍ေလံလာၾကညး႕ရြဳႏိုငးပါသညး၈ ထိုသို႕ၾကညး႕ရြဳ်ခငး့်ဖငးံေရ့သာ့မညး႕ Code မ္ာ့၏ ထညး႕သျငး့
ရမညး႕ေနရာကိုေသခ္ာႏိုငးေစပါမညး၈

အဆိုပါ .java ဖိုငးတျငး ဦ့စျာထညး႕သျငး့ရမညး႕ Code မ္ာ့မြာ package definition မ္ာ့်ဖစးပါသညး၈ Uri၇
Button၇ ႏြငးံ Intent မ္ာ့အတျကးသာမက EditText အတျကးကိုသာ package မ္ာ့ထညး႕သျငး့ရနး လိုအပး
ပါသညး၈ ထညး႕သျငး့ရမညး႕ package မ္ာ့ကိုေအာကးတျငးေတျ႕်မငးႏိုငးပါသညး၈

import android.widget.Button;
import android.content.Intent;
import android.net.Uri;
import android.widget.EditText;

မ္ကးပျငးံစာေပ 153
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

EditText ကို Setup ်ပဳလုပးရမညး႕ ပဵုစဵသညး Button ကို Setup ်ပဳလုပး်ခငး့ႏြငးံတူတူပငး်ဖစးပါသညး၈

final EditText <edittext_name> = <edittext>

ထို႕ေနာကး EditText phoneNumber ကိုေခၚရပါမညး၈ EditText တညးေဆာကးရနးအတျကး အသဵု့်ပဳရ


မညး႕ Code မြာ

final EditText phoneNumber = (EditText) findViewById(R.id.phoneNumber);

ထို႕ေနာကး phoneNumber ဟုအမညးရသညး႕ EditText ကိုတညးေဆာကးၿပီ့လြ္ငး၁ငး့ကို Device ေပၚတျငး


အသဵု့်ပဳမညး႕ Input အတျကး Text အ်ဖစး Reference ်ပဳလုပးႏိုငးၿပီ်ဖစးပါသညး၈ User မြရိုကးထညး႕ေသာ
Input ကိုရယူရနးအတျကး phoneNumber.getText() ဟူေသာ Method ကိုအသဵု့်ပဳရပါမညး၈
နဵပါတးအေသ်ဖစးေသာ tel:5551212 ဟူေသာ ဖုနး့နဵပါတးေနရာတျငး EditText ကိုအစာ့ထို့ရနးအတျက
ေအာကးေဖား်ပပါ ယခငးအသဵု့်ပဳခဲံသညး႕ Code ကို

Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212"));

ဟူေသာ Code ကိုေအာကးေဖား်ပပါ Code ်ဖငးံအစာ့ထို့ေပ့ရပါမညး၈

Intent(Intent.CALL_ACTION,Uri.parse("tel:" + phoneNumber.getText()));

အထကးပါ Code သညးယခု Project အတျကး ်ပငးဆငးရနးလိုအပးေသာ Code အသစး်ဖစးပါသညး၈ ရို့ရြငး့


ေသာ View အသစးႏြစးခုထပးတို့ခဲံၿပီ့ အသဵု့်ပဳသူကို Object တစးခု်ပသေစကာ input ကိုအဆိုပါ Object
တျငးထညး႕သျငး့်ခငး့ေပ့ထာ့ပါသညး၈ ထို႕ေနာကး အဆိုပါ Input ထညး႕သျငး့ထာ့ေသာ Number ကို
Phone ၏ Call Activity သို႕ပို႕ေဆာငးေပ့ပါမညး၈ .java ဖိုငးအတျငး့ရိြေနမညး႕ Code အ်ပညး႕အစဵုကို
ေအာကးတျငးၾကညး႕ရြဳႏိုငးပါသညး၈

package android_programmers_guide.AndroidPhoneDialer;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.content.Intent;
import android.net.Uri;
import android.widget.EditText;

public class AndroidPhoneDialer extends Activity {


/** Called when the activity is first created. */

154 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main );
final EditText phoneNumber = (EditText) findViewById(R.id.phoneNumber
);
final Button callButton = (Button) findViewById(R.id.callButton);
callButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
Intent CallIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:" + phoneNumber.getText()));
CallIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(CallIntent);
}
});
}
}

အထကးပါ Project ကို Emulator အတျငး့ Run ေစေသာအခါတျငး ေအာကးေဖား်ပပါပဵုအတိုငး့ေပၚလာ


သညးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

(အိမးစာ)Modify the AndroidPhoneDialer Project


အကယး၍ ေနာကးဆဵု့ေရ့သာ့ခဲံေသာ AndrodPhoneDialer ကိုေသခ္ာစျာေလံလာၾကညး႕လြ္ငး တစးစဵုတစး
ရာေပ္ာကးဆဵု့က္က္နးခဲံသညးကို သတိ်ပဳမိေကာငး့ သတိ်ပဳမိႏိုငးပါလိမးံမညး၈ ကဵမေကာငး့စျာပငး ယခငး

မ္ကးပျငးံစာေပ 155
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေလံလာခဲံရေသာ Project တျငး Input သညး EditText View သို႕မညးသညး႕ အမ္ိဳ့အစာ့ Value ကိုမဆို
လကးခဵေစသညးကိုေတျ႕ရပါလိမးံမညး၈ (ဖုနး့နဵပါတးအတျကး ဂဏနး့ရိုကးထညး႕်ခငး့မဟုတးဘဲ စာသာ့မ္ာ့
ရိုကးထညး႕သညး႕အခါတျငးလညး့ လကးခဵ်ခငး့ကိုဆိုလိုပါသညး) ၁ငး့သညးထိုကဲံသို႕ Option ရိုကးထညး႕ရ
ေသာ အမ္ိဳ့အစာ့မဟုတးပါ၈ ထို႕ေၾကာငးံ Research အနညး့ငယး်ပဳလုပးကာ EditText အတျကး
Validation (ဂဏနး့၇ စာသာ့စသညး႕ Input ၏ Value ကိုစစးေဆ့်ခငး့) အခ္ိဳ႕ကိုထပးမဵေပါငး့ထညး႕ၾကညး႕
ရနးအတျကး ေအာကးပါ Parameter မ္ာ့အသဵု့်ပဳ၍ Project ကို်ပငးဆငးႏိုငးပါသညး၈

 Phone Number တစးခုကို EditText အတျငး့တျငး ထညး႕သျငး့ထာ့၇မထာ့ကို စစးေဆ့ရနး


(validate) ်ပဳလုပးရနး ပဵုမြနး expression ကိုအသဵု့်ပဳ်ခငး့ (package java.regex)
 အသဵု့်ပဳသူမြ Input ကိုရိုကးထညး႕သညး႕အခါ အသဵု့်ပဳရမညး႕ပဵုစဵ်ဖငးံမကိုကးညီေၾကာငး့ ်ပသေစ
ႏိုငးမညး႕ Message တစးခု၏ အသဵု့်ပဳမႈပဵုစဵ်ဖစးေသာ showAlert() ဟူေသာ Method ကိုအသဵု့်ပဳ
ရနး

အထကးပါလိုအပးခ္ကးမ္ာ့ကိုေ်ဖရြငး့ႏိုငးသညး႕ Code မ္ာ့စဥး့စာ့၍ Activity (Application) တညးေဆာကး


ၾကညး႕ပါ၈ စဥး့စာ့၍ ႀကိဳ့စာ့ေရ့သာ့ၿပီ့ေသာအခါ ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့်ဖငးံ ႏိႈငး့ယြဥး
ၾကညး႕ႏိုငးပါသညး၈

main.xml

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/textLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter Number to Dial:"
/>
<EditText android:id="@+id/phoneNumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/callButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
156 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:text="Show Dialer" />

</LinearLayout>

AndroidPhoneDialer.java
package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.content.Intent;
import android.net.Uri;
import android.widget.EditText;
import java.util.regex.*;
public class AndroidPhoneDialer extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main );
final EditText phoneNumber = (EditText)
findViewById(R.id.phoneNumber );
final Button callButton = (Button) findViewById(R.id.callButton);
callButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
if (validatePhoneNumber(phoneNumber.getText().toString())){
Intent CallIntent = new
Intent(Intent.CALL_ACTION,Uri.parse("tel:" + phoneNumber.getText()));
CallIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH );
startActivity(CallIntent);
}
else{
showAlert("Please enter a phone number in the X-XXX-XXX-XXXX
format.",0, "Format Error", "Re-enter Number",false);
}
}
});
}
public boolean validatePhoneNumber(String number){
Pattern phoneNumber = Pattern.compile("(\\d-)?(\\d{3}-)?\\d{3}
\\d{4}");
Matcher matcher = phoneNumber.matcher(number);
return matcher.matches();
}
}

Project ေရ့သာ့ၿပီ့ Run ၾကညး႕ေသာအခါတျငး ဖုနး့နဵပါတးမဟုတးေသာ (Format မက္ေသာ) text မ္ာ့


ရိုကးထညး႕မိပါက ေအာကးေဖား်ပပါအတိုငး့ Message တစးခုေပၚလာၿပီ့ သတိေပ့မညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 157
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးလာမညး႕အခနး့တျငး ယခုအခနး့တျငးေဖား်ပခဲံေသာ View မ္ာ့ထကးပိုမိုေသာ View မ္ာ့ကို ေလံလာ


ရပါမညး၈ ထို႕အ်ပငး တစးခုထကးပိုမိုေသာ Activity မ္ာ့ပါွငးသညး႕ Application မ္ာ့တညးေဆာကးပဵုက
လညး့ေလံလာရပါမညး၈ ထို႕အ်ပငး Menu စနစးမ္ာ့ပါွငးေသာ Activity မ္ာ့၏ Launch ်ပဳလုပးပဵုမ္ာ့ကို
လညး့ သငးၾကာ့ရပါမညး၈

158 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 8
Lists, Menus, and Other Views

မ္ကးပျငးံစာေပ 159
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Building Activities
- Using Android Menus
- Using the AutoCompleteTextView

ယခုအခနး့တျငး View မ္ာ့ႏြငးံ Intent မ္ာ့အေၾကာငး့ကိုပိုမိုနကးရိႈငး့စျာေလံလာရပါမညး၈ ထို View မ္ာ့ႏြငးံ


Intent မ္ာ့တျငးပါွငးေသာ Argument မ္ာ့သညး Android တျငး ဆရာတစးဆူ်ဖစးလာေစရနး မ္ာ့စျာ
အေရ့ႀကီ့ေသာ feature မ္ာ့လညး့်ဖစးပါသညး၈ ထို View ႏြငးံ Intent မ္ာ့ကိုအသဵု့်ပဳ်ခငး့ကို ယခငး
Activity မ္ာ့ေရ့သာ့ရာတျငးအဓိကအသဵု့်ပဳခဲံပါသညး၈ တညးေဆာကးေရ့သာ့မညး႕ Activity အာ့လဵု့နီ့
ပါ့တျငး View တစးခုထကးပိုမိုပါွငးလာမညး်ဖစးၿပီ့ View အမ္ာ့သညးလညး့ Intent တစးခုသို႕မဟုတး ႏြစးခု
ခနး႕ကို Call လုပးရနးလိုအပးမညး်ဖစးပါသညး၈

ယခုအပိုငး့တျငးေဖား်ပမညး႕အေၾကာငး့အရာမ္ာ့ကို ေလံလာရနးအတျကး အေကာငး့ဆဵု့နညး့လမး့မြာ လကး


ေတျ႕လုပးေဆာငးၾကညး႕်ခငး့ပငး်ဖစးပါသညး၈ ေဖား်ပပါအေၾကာငး့အရာမ္ာ့ႏြငးံအသဵု့်ပဳႏိုငးေစေသာattribute
မ္ာ့ကို်ပနးလညးေလံလာ်ခငး့သညး လုိအပးခ္ကးတစးခု်ဖစးေသားလညး့ ကိုယးပိုငး Code မ္ာ့ကို implement
လုပးယူ်ခငး့သညး လဵု့ွဥသဵုကျဲ်ပာ့်ခာ့နာ့ေစပါလိမးံမညး၈ ထို႕ေၾကာငးံ ယခငးအခနး့တျငးေလံလာခဲံရေသာ
Activity မ္ာ့ကို ပိုမိုခကးခဲေသာ View မ္ာ့ႏြငးံ Intent မ္ာ့ကိုအသဵု့်ပဳ၍ တညးေဆာကးၾကညး႕ၾကပါမညး၈
ထိုသို႕ Application မ္ာ့တညးေဆာကး်ခငး့မြ View မ္ာ့ႏြငးံ Intent မ္ာ့ကိုအသဵု့်ပဳ်ခငး့တျငး ေကာငး့မျနး
ေသာအေတျ႕အႀကဵဳမ္ာ့ကို ရရိြေစႏိုငးမညး်ဖစးပါသညး၈

လျနးခဲံေသာ အခနး့ႏြစးခနး့တျငး View မ္ာ့ႏြငးံ Intent မ္ာ့အေၾကာငး့ကို ရို့ရြငး့ေသာ Activity မ္ာ့


တညးေဆာကး်ခငး့်ဖငးံ အက္ဥး့ခ္ဵဳ့ေဖား်ပခဲံပါသညး၈ ယခုအခနး့တျငးမူ ပိုမိုရႈပးေထျ့ေသာ Activity မ္ာ့ကို
တညးေဆာကးကာ Intents မ္ာ့ကိုအသဵု့်ပဳ၍ တညးေဆာကးထာ့ေသာ Activity အသစးမ္ာ့ကိုေခၚယ
ၾကညး႕ၾကပါမညး၈ ဆကးလကးၿပီ့ ယခုအခနး့တျငး AutoComplete List ႏြငးံ Gallery မ္ာ့ကဲံသို႕ေသာ View
မ္ာ့၏ အေ်ခခဵ Function မ္ာ့အေၾကာငး့ကိုရြငး့်ပေပ့ရဵုသာမက View attribute တစးခုစီ၏ Variation
မ္ာ့အေၾကာငး့ကိုပါ နိဒါနး့အာ့်ဖငးံ ေလံလာၾကညး႕ၾကရမညး်ဖစးပါသညး၈

160 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

စတငးရနးအတျကး AndroidViews ဟူ၍အမညးေပ့ထာ့ေသာ Eclipse Project အသစးတစးခုကို တညး


ေဆာကးပါ၈ ထိုတညးေဆာကးရမညး႕ Project တျငးအသဵု့်ပဳရမညး႕ Parameter မ္ာ့ကိုေအာကးတျငး်ပထာ့
ေသာပဵုတျငးေဖား်ပထာ့ပါသညး၈

Project ကိုတညးေဆာကးၿပီ့ေနာကး main.xml ဖိုငးကိုဖျငးံပါ၈ main.xml ဖိုငးမြ Hello World! အတျကး


အသဵု့်ပဳသညး႕နဂိုပါွငးေသာ Code မ္ာ့ကိုဖ္ကးပါ၈ main.xml တျငးမညးသညး႕လုပးေဆာငးခ္ကးမြ္မရိြဘ
ရြငး့လငး့သျာ့ေသာအခါတျငး Code မ္ာ့ကိုစတငးထညး႕သျငး့ေရ့သာ့ႏိုငးၿပီ်ဖစးပါသညး၈

Building the Activities


စတငးေလံလာသညး႕အခ္ိနးမြယခုအထိ Sigle-Activity (Activity တစးခုတညး့သာ) ပါွငးေသာ Appli-
cation မ္ာ့ကိုသာေရ့သာ့ခဲံၾကပါသညး၈ Sigle-Activity သာရိြေသာ Application မ္ာ့သညး Screen
တစးခုစာကိုသာ ေဖား်ပႏုိငးေသာေၾကာငးံ အလျနးရို့ရြငး့သညး႕ Application
မ္ာ့ဟုသတးမြတးရပါမညး၈Application အမ္ာ့စုတျငး Screen တစးခုထကးမကပါွငးေသာေၾကာင

မ္ကးပျငးံစာေပ 161
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ယခုတညးေဆာကးမညး႕ Android Application မ္ာ့တျငးလညး့ တစးခုထကးပိုမိုေသာ Activity


မ္ာ့ကိုစုေပါငး့၍ တညးေဆာကးရပါလိမးံမညး၈

ပထမဆဵု့လုပးေဆာငးရမညး႕လုပးေဆာငးခ္ကးမြာ Activity မ္ာ့တညးေဆာကးရနး်ဖစးပါသညး၈ ထို႕ေနာကး ထို


Activity မ္ာ့ကို Call လုပးမညး႕ Intent မ္ာ့ကိုဆကးလကးတညးေဆာကးရပါလိမံးမညး၈ Activity မ္ာ့တညး
ေဆာကးရာတျငး ေအာကးပါ အဆငးံအသဵု့ဆငးံအတိုငး့ လုိကးနာေဆာငးရျကးရနး လိုအပးပါသညး၈

 .xml ဖိုငးအတျကး Intent Code


 .java ဖိုငးအတျကး Intent Code ႏြငးံ
 Intent ကိုအသဵု့်ပဳ၍ Activity မ္ာ့ေခၚယူရနးတို႕်ဖစးပါသညး၈

ပထမဆဵု့ေသာ Activity ေနာကးတစးခုကို တညးေဆာကးၿပီ့လြ္ငးက္နးေသာ Activity မ္ာ့ကိုတညးေဆာက


ရနး အလျနးလျယးကူပါသညး၈

အထကးတျငးေဖား်ပထာ့ေသာ အဆငးံမ္ာ့သညး အဆငးံအလိုကးလုပးေဆာငးရနးမလိုပါ၈ ႀကိဳကးႏြစးသကးရာ


အဆငးံကို ဦ့စျာလုပးေဆာငးႏိုငးပါသညး၈

Intent Code for the .xml File


Anroid Activity မ္ာ့တျငး အပိုငး့သဵု့ပိုငး့်ဖငးံဖျဲ႕စညး့ထာ့်ခငး့်ဖစးၿပီ့ .java ဖိုငးသညး Code မ္ာ့ေရ့သာ့
ရာေနရာ်ဖစးၿပီ့ .xml ဖိုငးသညး Layout မ္ာ့ကိုသိမး့ဆညး့ေသာေနရာ်ဖစးကာ ေနာကးတစးပိုငး့မြာ
package ၏ manifest ဖိုငး်ဖစးပါသညး၈ ယခုအခ္ိနးထိေလံလာခဲံသမြ္ Application မ္ာ့တျငး main.xml
ဖုိငးတစးဖိုငးတညး့ကိုသာအသဵု့်ပဳ၍ တစးခုတညး့ေသာ Activity ၏ Layout ကိုထိနး့ခ္ဳပးခဲံၾကပါသညး၈ သို႕
ရာတျငး Activity အမ္ာ့အ်ပာ့ကိုအသဵု့်ပဳရာတျငး .xml layout ဖိုငမ
း ္ာ့ကိုလညး့ အမ္ာ့အ်ပာ့ႀကဵဳေတျ႕ရ
ပါလိမးံမညး၈

.xml ဖိုငးအသစးတစးခုကိုတညးေဆာကးရနးအတျကး Eclipse Project ကိုဖျငးံ၍ Package Explorer ကိုပါ


ဖျငးံရပါမညး၈ ထို႕ေနာကး res directory ကိုဖျငးံပါ၈ res directory ထဲမြ layout folder ေပၚတျငး Right Click
ႏိြပးၿပီ့ New >File ကိုေရျ့ခ္ယးရပါမညး၈

162 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေပၚလာေသာ New File Dialogbox မြ File Name Text box တျငး test.xml ဟုအမညးေပ့ရပါမညး၈
ေအာကးပဵုတျငးေဖား်ပထာ့ပါသညး၈

မ္ကးပျငးံစာေပ 163
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

သတိ်ပဳရနး၈ ၈ .xml ဖိုငးအသစးမ္ာ့တညးေဆာကးရာတျငး lowercase (အကၡရာအေသ့) မ္ာ့ကိုသာ


အသဵု့်ပဳပါ၈ .xml ဖိုငးအသစးမ္ာ့သညး အကၡရာအေသ့်ဖငးံေပ့ထာ့ေသာအမညးမ္ာ့ကိုသာ လကးခဵႏိုငးစျမး့
ရိြပါသညး၈

.xml layout ဖိုငးကိုတညးေဆာကးၿပီ့်ဖစးေသားလညး့ တညးေဆာကးလိုကးေသာ layout ဖိုငးသညး အချဵ


(empty) ်ဖစးေနပါလိမးံမညး၈ မြနးကနးေသာ Activity တစးခုကိုတညးေဆာကးႏိုငးရနးအတျကး test.xml ဖိုငး
တျငးေအာကးေဖား်ပပါ Code မ္ာ့ကိုထညး႕သျငး့ေပ့ရပါမညး၈ ထို Code မ္ာ့သညး Layout ၏အေ်ခခဵ
အုတး်မစးအ်ဖစးေထာကးပဵံေပ့ေစႏိုငးပါသညး၈ အကယး၍ လိုအပးပါက main.xml ဖိုငးမြ Code မ္ာ့ကို
test.xml သို႕ကူ့ယူႏိုငးပါသညး၈

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


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>

Intent Code for the .java File


Package Explorer ကိုထပးမဵအသဵု့်ပဳ၍ src directory ကိုဖျငးံပါ၈ ထို႕ေနာကး ပဵုတျငး်ပထာ့သညး႕အတိုငး့
android_programmers_guide.AndroidViews package တျငး Right Click ႏိြပး၍ New>File ကိုေရျ့
ခ္ယးပါ၈

ဒုတိယတညးေဆာကးလိုကးေသာ Activity အတျကး Code မ္ာ့ကို အဆိုပါဖိုငးထဲတျငးေရ့သာ့ရမညး်ဖစးပါ


သညး၈ ထိုဖိုငးကို test.java ဟုအမညးေပ့ပါ၈ ဖိုငးအသစးတစးဖုိငးရရိြလာမညး်ဖစးေသားလညး့ ထိုဖိုငးသည
လညး့ အချဵ (empty) ပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့ကိုအဆိုပါ ဖိုငး
တျငး ရိက
ု းထညး႕၍ ထိုဖိုငးကို အသဵု့်ပဳႏိုငးေအာငး ဦ့စျာ်ပဳလုပးရပါမညး၈

164 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

package testPackage.test;
import android.app.Activity;
import android.os.Bundle;
public class test extends Activity {
/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.test);
/** This is our Test Activity
All code goes below */
}
}

R.layout.test ဟူေသာ context ကိုအသဵု့်ပဳ၍ setContentView () ဟူေသာ method ်ဖငးံ test.xml


ဖိုငးကုိ ေခၚရနးသတိ်ပဳပါ၈

setContentView(R.layout.test);

ထို Code စာေၾကာငး့သညး Activity အသစးတစးခုကို .xml ဖိုငးအေန်ဖငးံ layout ဖိုငးတစးဖိုငး


ကဲံသို႕အသဵု့်ပဳေနႏိုငးရနး ်ပဳလုပးေပ့ေစပါသညး၈

Modifying the AndroidManifest.xml


Eclipse အတျငး့မြ AndroidManifest.xml ဖိုငးကိုဖျငးံပါ၈ AndroidManifest.xml ဖိုငးအေၾကာငး့ကို အေသ့
စိပးမေလံလာခဲံရေသ့ပါ၈ AndroidManifest.xml ဖိုငးတျငး Project ်ဖငးံသကးဆိုငးေသာ Global Setting
မ္ာ့ပါွငးပါသညး၈ ထိ႕ု ထကးပိုမိုအေရ့ပါေသာအခ္ကးမြာ လကးရိြ Project အတျကး Intent Filter မ္ာ့
လညး့ပါွငးေနသညးဆိုေသာအခ္ကးပငး်ဖစးပါသညး၈

Intent Filter မ္ာ့ကိုအသဵု့်ပဳရ်ခငး့အေၾကာငး့ကို အခနး့ (၄) တျငးေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈ ထိုအခ္ကး


အလကးမ္ာ့သညး AndroidManifest.xml ဖိုငးတျငး သိမး့ထာ့ေသာ အဆိုပါ လုပးေဆာငးခ္ကးကို လျယးကူ
ေခ္ာေမျ႕ေအာငး်ပဳလုပးေပ့ပါသညး၈

သတိ်ပဳရနးအခ္ကးမြာ Project တစးခုတျငး AndroidManifest.xml တစးဖုိငးတညး့သာရိြပါသညး၈

အကယး၍ AndroidManifest.xml ဖိုငးသညးပျငးံေနခဲံလြ္ငး ေအာကးေဖား်ပပါအတိုငး့ေတျ႕ရိြရႏိုငးပါသညး၈

<activity android:name=".AndroidViews" android:label="@string/app_name">


<intent-filter>

မ္ကးပျငးံစာေပ 165
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<action android:name="android.intent.action.MAIN" />


<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

Project မြတညးေဆာကးထာ့ေသာ main Activity ်ဖစးေသာ AndroidViews Activity အတျကး Intent


Filter မ္ာ့ကို ယခုေနရာတျငးၾကညး႕ရြဳရပါမညး၈ ထိုဖိုငးအတျငး့တျငး Project ကို handle ်ပဳလုပးရနးအ်ခာ့
ေသာ မညးသညး႕ Intent Filter ကိုမဆိုထညး႕သျငး့ႏိုငးပါသညး၈ ယခုေနရာတျငး တညးေဆာကးထာ့ေသာ
Test Activity အသစးကို handle ်ပဳလုပးရနးအတါကး Intent Filter တစးခုကိုထညး႕သျငး့ရပါမညး၈ ေအာကး
တျငးေဖား်ပထာ့ေသာ Code မ္ာ့သညး AndroidManifest.xml ဖိုငးအတျကး ထညး႕သျငး့မညး႕ Intent
Filter အတျကး Code မ္ာ့်ဖစးပါသညး၈

<activity android:name=".Test" android:label="Test Activity">


<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

အထကးပါ Code မ္ာ့ကို AndroidManifest.xml ဖိုငးတျငးေပါငး့ထညး႕ေပ့်ခငး့်ဖငးံ Android သညး Test


Activity အတျကး Intent မ္ာ့ကို မြနးကနးေသာ ေနရာသို႕ Pass လုပးေစရနး ချငးံ်ပဳေပ့ပါသညး၈ ထို႕ေနာကး
AndroidManifest.xml ဖိုငးမြ Code အ်ပညး႕အစဵုကိုေအာကးတျငးေဖား်ပထာ့သညး႕အတိုငး့ေတျ႕်မငးရပါ
မညး၈

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


<manifest xmlns:android=http://schemas.android.com/apk/res/android

package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AutoComplete" android:label="AutoComplete">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>

166 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခုအခါ Activity သညး Test Activity အတျကး Intent Call မ္ာ့ကို Handle ်ပဳလုပးႏိုငးသျာ့ၿပီ်ဖစးသညး၈
Test Activity သို႕ Intent Call တစးခု်ပဳလုပးရနး အခနး့ (၄)တျငးအသဵု့်ပဳခဲံေသာ Structure တစးခု်ဖငးံ
အလျနးနီ့စပးေသာ Structure တစးခုကိုအသဵု့်ပဳရပါမညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code သညး
Intent ကို Setup ်ပဳလုပးမညး်ဖစးပါသညး၈

သတိ်ပဳရနး၈ ၈Application ကိုစတငးေသာအခါ ပျငးံလာမညး႕ Activity သညး Project တျငးတညး


ေဆာကးထာ့ၿပီ့်ဖစးေသာ AndroidViews ဟူေသာ Activity ်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးေဖား်ပပါ
Code ကို Test Activity ကိုစတငးေစရနးတျကး AndroidViews.java ဖိုငးတျငး ထညး႕သျငး့ေပ့ထာ့ရပါမညး၈

Intent testActivity = new Intent(this, test.class);

ထို Code လိုငး့သညး testActivity ဟုေခၚေသာ Intent တစးခုကိုတညးေဆာကးေပ့ပါလိမးံမညး၈ test.class


ဟူေသာ parameter သညး this Activity ်ဖငးံသကးဆိုငးေသာ TestActivity တျငး ေဖား်ပရနးအတျက
လိုအပးေသာ testActivity ဟူေသာ Intent ကိုေခၚယူေစမညး်ဖစးပါသညး၈

သတိ်ပဳရနး၈ ၈Intent မ္ာ့ႏြငးံအလုပးလုပးေဆာငးေသာအခါ android.content.Intent ဟူေသာ


package ကို AndroidViews.java ဖိုငးတျငး import ်ပဳလုပးရနးမေမံသငးံပါ၈

ေနာကးဆဵု့တျငး Test Activity ကိုအမြနးတကယးစတငးရနးအတျကး startActivity() ဟူေသာ method ကို


အသဵု့်ပဳရပါမညး၈

startActivity(autocomplete);

်ပငးဆငးခ္ကးမ္ာ့်ပဳလုပးၿပီ့စီ့သျာ့ေသာ AndroidViews.java ဖိုငးအတျငး့မြ Code မ္ာ့ကိုေအာကးပါအတိုငး့


ေတျ႕ရပါမညး၈

package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;
public class AndroidViews extends Activity {
/** Called when the Activity is first created. /
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
မ္ကးပျငးံစာေပ 167
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

setContentView(R.layout.main);
/**Set up our Intent /

အထကးတျငးေရ့သာ့ထာ့ေသာ Application ကို Android Emulator တျငးေမာငး့ႏြငးပါ၈ Android သညး


AndroidViews Activity ကို Launch လုပးမညး်ဖစးၿပီ့ ခ္ကးခ္ငး့လိုလိုပငး Test Activity ကို ဆကးလက
Launch ်ပဳလုပးမညး်ဖစးပါသညး၈

ေနာကးလာမညး႕အပိုငး့တျငး Activity အမ္ာ့အ်ပာ့ကို launch ်ပဳလုပးေစမညး႕ Application တစးခုကို


တညးေဆာကးရနးအတျကး အဆိုပါ နညး့စနစးမ္ာ့ကို ဆကးလကးအသဵု့်ပဳပါမညး၈ ယငး့ Activity တစးခုစီ
တျငး ကျဲ်ပာ့ေသာ Option အမ္ိဳ့မ္ိဳ့ကို အသဵု့်ပဳႏိုငးေသာ View တစးခုစီကို သိမး့ဆညး့ထာ့မညး်ဖစးသညး၈
ထိုသို႕်ပဳလုပး်ခငး့်ဖငးံ Activity မ္ာ့ႏြငးံ အလုပးလုပးေဆာငးေသာ View မ္ာ့ကို Displaying ်ပဳလုပးရနးႏြငးံ
manipulating ်ပဳလုပးရာတျငး ႀကီ့စျာေသာ အေလံအက္ငးံေကာငး့ကိုရရိြေစမညး်ဖစးပါသညး၈

သတိ်ပဳရနး၈ ၈ေနာကးလာမညး႕နမူနာမ္ာ့ကိုစမး့သပးမလုပးေဆာငးမီတျငး ယခုအပိုငး့တျငးလုပးေဆာငးခဲံ ေသာ


TestActivity ကိုဖယးထုတးရြငး့လငး့ထာ့ပါ၈ ေနာကးလာမညး႕လုပးေဆာငးခ္ကးမ္ာ့တျငး Test Activity
မပါွငးေသာ AndroidViews မ္ာ့ကိုဖနးတီ့်ခငး့အေၾကာငး့ကို ေလံလာရမညး်ဖစးေသာေၾကာငးံ ်ဖစးပါသညး၈

Using the Menu


ယခုအပိုငး့တျငး ကျဲ်ပာ့ေသာ View မ္ာ့မြ Select ်ပဳလုပးရနးအတျကး User တစးဦ့ကို ချငးံ်ပဳေစႏုိငးမညး႕
Application တစးခုကိုတညးေဆာကးၾကညး႕ၾကပါမညး၈ User မြ View တစးခုကိုေရျ့ခ္ယးလိုကးေသာအခါ
အေရျ့ခ္ယးခဵရေသာ View ပါွငးသညး႕ Activity အသစးတစးခုကို Launch ်ပဳလုပးေပ့ပါလိမံးမညး၈
အသဵု့်ပဳသူကို ေရျ့ခ္ယးမႈမ္ာ့်ပဳလုပးေပ့ႏိုငးေသာ Tool သညး Android Menu ပငး်ဖစးပါသညး၈
ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအရ Menu သညး user မြ Menu ခလုတးကိုႏိြပးေသာအခါ ပဵုအတုိငး့ ေပၚ
လာသညးကို ေတျ႕ရပါမညး၈

168 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အထကးပါပဵုတျငး်မငးေတျ႕ရသညး႕အတိုငး့ပငး Android Home Screen မြ Menu Button ကိုႏိြပးလိုကး်ခငး့


်ဖငးံ Wallpaper Settings Option ပျငးံလာသညးကို်မငးေတျ႕ရပါမညး၈ main Activity အတျကး ထိုကဲံသို႕
ေသာ Menu တစးခုကို View မ္ာ့်ပသ်ခငး့ကို ၾကညး႕ရႈႏိုငးရနးလုပးေဆာငးၾကညး႕ၾကပါမညး၈ ထို႕ေၾကာငးံ
AndroidViews.java ဖိုငးတျငးေရ့သာ့ထာ့ေသာ Code မ္ာ့ကိုေအာကးပါအတိုငး့်မငးေတျ႕ရမညး်ဖစးပါ
သညး၈

package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}

Menu ကိုဖနးတီ့ရနးအတျကး package အသစးတစးခုကို import ်ပဳလုပးရနးလိုအပးမညး်ဖစးပါသညး၈


ထို႕ေၾကာငးံ android.view.Menu ကို AndroidViews Activity သို႕ထညး႕သျငး့ေပ့ရပါမညး၈

Import android.view.Menu;

မ္ကးပျငးံစာေပ 169
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Menu တညးေဆာကးရနးအတျကး onCreateOptionsMenu() ဟူေသာ Method ကိုအသဵု့်ပဳရပါမညး၈


အဆိုပါ onCreateOptionsMenu() ဟူေသာ Method သညး Boolean method တစးခု်ဖစးၿပီ့ အသဵု့်ပဳသူ
မြ Menu Button ကုိေရျ့ခ္ယးလိုကးေသာအခါတျငး ေခၚယူေစပါသညး၈ ယငး့ Method ကိုအသဵု့်ပဳ၍ Menu
ကိုတညးေဆာကးရမညး်ဖစးၿပီ့ ေရျ့ခ္ယးႏိုငးေစမညး႕ Items မ္ာ့ကိုလညး့ အဆိပ
ု ါ Menu အတျငး့တျငး
ထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးပါ Code မ္ာ့ကို AndroidViews.java ဖိုငးတျငး
ေပါငး့ထညး႕ေပ့ရပါမညး၈

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
}

ကိုတညးေဆာကးရမညး်ဖစးၿပီ့ ေရျ့ခ္ယးႏိုငးေစမညး႕ Items မ္ာ့ကိုလညး့ အဆိုပါ Menu အတျငး့တျငး


ထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးပါ Code မ္ာ့ကို AndroidViews.java ဖိုငးတျငး
ေပါငး့ထညး႕ေပ့ရပါမညး၈ Menu ကိုတညးေဆာကးရနးအတျကoး nCreateOptionsMenu() Method
အတျငး့တျငး Code မ္ာ့ကိုေပါငး့ထညး႕ေပ့ရပါမညး၈ Menu အတျငး့တျငးထညး႕သျငး့ရနးလိုအပးသညး႕ Item
မ္ာ့မြာ ယခု Project အတျငး့ တညးေဆာကးရေစမညး႕ Views မ္ာ့်ဖစးပါသညး၈ Menu အတျငး့တျငး
ထညး႕သျငး့ေစႏိုငးေသာ Views မ္ာ့၏ အမညးကို ေအာကးတျငးေဖား်ပထာ့ပါသညး၈

 AutoComplete
 Button
 CheckBox
 EditText
 RadioGroup
 Spinner တို႕်ဖစးပါသညး၈

ယခငးေဖား်ပခဲံေသာ Code ်ဖစးသညး႕ onCreateOptionsMenu() method တျငး menu ဟူေသာေခၚေသာ


Menu Variable တစးခုကို်ဖတးသနး့ေစပါမညး၈ အဆိုပါ Variable သညး Android interface ေပၚတျငး
တညးေဆာကးထာ့ေသာ အမြနးတကယး menu ်ဖစးလာေစမညး႕ Item ကိုေဖား်ပေပ့ပါသညး၈

170 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Menu အတျငး့တျငး Item မ္ာ့၏ List စာရငး့ကိုထညး႕သျငး့ေပ့ရနးအတျကး menu.add() ဟူေသာ


method ကိုအသဵ့်ပဳရပါမညး၈ အသဵု့်ပဳရမညး႕ Code ၏ syntax မြာ

menu.add(<group>,<id>,<title>)

Parameter group ကို Menu Item မ္ာ့ကိုေပါငး့စပးရနးအတျကး အသဵု့်ပဳရပါသညး၈ ယခုဥပမာတျငး ထို


ကဲံသို႕ Group ်ပဳလုပးမညးမဟုတးပါ၈ သို႕ရာတျငး Value သညး အလျနးအေရ့ႀကီ့ပါသညး၈ Paramter Id
ကိုမညးသညး႕ Menu ကိုေရျ့ခ္ယးခဲံသညးဆိုေသာအခ္ကးကို ေရျ့ခ္ယးရနးအတျကးအသဵု့်ပဳရပါသညး၈
ေနာကးဆဵု့ေဖား်ပခ္ကးအရ Parameter Title သညး Menu အတျငး့တျငးေဖား်ပေပ့ေစမညး႕ Text ်ဖစးပါ
သညး၈ onCreateOpitonsMenu() method သို႕ေအာကးေဖား်ပပါ Code မ္ာ့ကိုေပါငး့ထညး႕ေပ့ရပါမညး၈

menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");

ထို႕ေနာကး AndroidViews.java ဖိုငးအတျငး့မြ Code မ္ာ့ကိုေအာကးပါအတိုငး့်မငးေတျ႕ရမညး်ဖစးပါသညး၈

package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");

မ္ကးပျငးံစာေပ 171
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

return true;
}
}

အထကးတျငးေရ့သာ့ထာ့ေသာ Code မ္ာ့ကိုေမာငး့ႏြငးၾကညး႕မညးဆိုလြ္ငး ေအာကးတျငးေဖား်ပထာ့ေသာ


ပဵုအတိုငး့ေပၚလာသညးကိုေတျ႕ရပါမညး၈

အထကးပါ Views မ္ာ့ကို accomplish ်ပဳလုပးရနးလိုလာ့မညးမြာ အေသအခ္ာပငး်ဖစးပါသညး၈ သို႕ရာတျငး


Menu အတျငး့မြ Option တစးခုခုကို Click ႏိြပးၾကညး႕ပါ၈ မညးသညး႕လုပးေဆာငးခ္ကးကိုမြ္ လုပးေဆာငး်ခငး့
မရိြသညးကိုေတျ႕ရပါလိမးံမညး၈ ထိုသို႕လုပးေဆာငးရနး Menu တျငး Event မ္ာ့သတးမြတးေပ့ရပါလိမးံမညး၈

Menu Item မ္ာ့သို႕ Call မ္ာ့ကို Handle ်ပဳလုပးႏိုငးေစမညး႕ Method မြာ onOptionsItemSelected()
ဟူေသာ Method ပငး်ဖစးပါသညး၈ onCreateOptionsMenu() ဟူေသာ Method ကဲံသို႕ပငး
onOptionsItemSelected() ဟူေသာ Method သညးလညး့ Menu Item တစးခုကိုေရျ့ခ္ယးေသာအခါ
တျငး သတးမြတးထာ့ေသာ Code ကို execute ်ပဳလုပးရနး Override ်ပဳလုပးေစႏိုငးေသာ Boolean method
တစးခုပငး်ဖစးပါသညး၈ အဆိုပါ Override Code ကိုေအာကးပါအတိုငး့ေတျ႕ရပါလိမံးမညး၈

172 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

@Override
public boolean onOptionsItemSelected(Menu.Item item){
}

ေဖား်ပပါ Code တျငး်ပသနာတစးခုရိြပါသညး၈ onOptionsItemSelected() သညးေယဘုယ္ဆနးေသာ


method တစးခုသာ်ဖစးေသာေၾကာငးံ မညးသညး႕ menu ကို select ်ပဳလုပးသညး်ဖစးေစ Intent ကုိေခၚယူ
ေစမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ onOpionsItemSelected() ကို menu Item မ္ာ့အၾကာ့ ချဲ်ခာ့ရနးအတျကး
နညး့လမး့သတးမြတးေပ့ရနးလိုအပးမညး်ဖစးၿပီ့ သကးဆိုငးရာ Code မ္ာ့ကိုလညး့ execute လုပးခိုငး့ရပါ
မညး၈ ထို႕ေၾကာငးံ switch/ case statement တစးခုကိုအသဵု့်ပဳၿပီ့ Select ်ပဳလုပးမညး႕ menu item မ္ာ့
အၾကာ့ ချဲ်ခာ့ႏိုငးမညး႕ method ကိုရြာေဖျေပ့ရပါမညး၈ Menu Item မ္ာ့ကိုတညးေဆာကးခဲံေသာအခါ 0
မြ 5 အထိ နဵပါတးစဥးမ္ာ့်ဖငးံ menu Item မ္ာ့ကို သတးမြတးခဲံၾကပါသညး၈ မညးသညး႕ Menu Item ကို
ေရျ့ခ္ယးခဲံသညးဟူေသာ အခ္ကးကိုဆဵု့်ဖတးရနး case statement အတျငး့ getId () ဟူေသာ method
်ဖငးံ အဆိုပါ Menu Item ကိုေခၚယူေစႏိုငးပါမညး၈

switch (item.getId()) {
case 0:
return true;
case 1:
return true;
case 2:
return true;
case 3:
return true;
case 4:
return true;
case 5:
return true;
}
return true;

အဆိုပါ case statement အတျငး့တျငး Id တစးခုစီ၏လုပးေဆာငးခ္ကးမ္ာ့ကို လကးရိြတျငး return ture ဟု


သတးမြတးထာ့ရပါမညး၈ ထိုသို႕သတးမြတးထာ့်ခငး့်ဖငးံ မညးသညး႕လုပးေဆာငးခ္ကးကိုလညး့ မလုပးေဆာငး
ေသားလညး့ လိုအပးေသာ Code မ္ာ့ထပးထညး႕ရနး ဧရိယာကိုဖျငးံေပ့ႏိုငးပါသညး၈ ထို႕ေနာကး Android
Views.java ဖုိငးသညး New Menu System မြ launch ်ပဳလုပးေစႏိုငးေသာ Activity မ္ာ့ တညးေဆာက
ရနးအတျကး အဆငးသငးံ်ဖစးေနေစၿပီ်ဖစးသညး၈ AndroidViews.java မြ Code အ်ပညး႕အစဵုကိုေအာကးပါ
အတိုငး့ေတျ႕ရိြႏိုငးပါသညး၈

package android_programmers_guide.AndroidViews;

မ္ကးပျငးံစာေပ 173
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
public class AndroidViews extends Activity {
/** Called when the Activity is first created. /
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

/** Add one menu item for each View in our project */
menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
}
/** Override onOptionsItemSelected to execute code for each
menu item */
@Override
public boolean onOptionsItemSelected(Menu.Item item){
}
/** Select statement to handle calls
to specific menu items */
switch (item.getId()) {
case 0:

return true;
case 1:
return true;
case 2:
return true;
case 3:
return true;
case 4:
return true;
case 5:
return true;
}
return true;
}
}

ထို႕ေနာကး AndroidViews.java ဖိုငးၿပီ့ဆဵု့ခဲံလြ္ငး အ်ခာ့ေသာ Activity မ္ာ့တညးေဆာကးမႈတျင


အာရဵုစိုကးရပါမညး၈ ေအာကးတျငးေဖား်ပမညး႕အပိုငး့တျငး View တစးခုစီအတျကး လိုအပးမညး႕ Activity တစး
174 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ခုကိုတညးေဆာကးၾကရမညး်ဖစးၿပီ့ Case Statement အတျငး့ View မ္ာ့၏ သကးဆိုငးရာ Activity မ္ာ့ကို


luaunch ်ပဳလုပးေစႏိုငးေသာ Code မ္ာ့ကိုထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈

Creating the Activity for AutoComlete


ယခုအပိုငး့တျငး AutoCompleteTextView ကို်ပသႏိုငးမညး႕ Activity တစးခုကိုတညးေဆာကးပါမညး၈ Auto
CompleteTextView မ္ာ့သညး Application အတျငး့တျးငအလျနး powerful ်ဖစးေသာ Tool မ္ာ့်ဖစးၾကပါ
သညး၈ AutoCompleteTextView ဟူေသာ TextView အမ္ိဳ့အစာ့သစးသညး စကာ့လဵု့တစးခု သို႕မဟုတး
phrase တစးခုကိုရိုကးထညး႕လိုကးေသာအခါ ်ဖစးႏိုငးဖျယးရာ စကာ့လဵု့မ္ာ့ကို ေဖား်ပေပ့ႏိုငးေအာငး ်ပဳလုပး
ထာ့သညး႕ modify ်ပဳလုပးထာ့ေသာ TextView တစးခုသာ်ဖစးပါသညး၈ အဆိုပါ View မ္ာ့သညး Mobile
Application မ္ာ့တျငး မ္ာ့စျာအသဵု့ွငးၿပီ့ ListView ကဲံသို႕ Space ပမာဏမ္ာ့စျာ မသတးမြတးလိုေသာ
အခါ သို႕မဟုတး Application အတျငး့ Text မ္ာ့ရိုကးထညး႕ေပ့ရသညး႕လုပးေဆာငးခ္ကးကို ပိုမိုလြ္ငး်မနး
ေစေသာအခါတျငး အသဵု့်ပဳရပါသညး၈ AutoCompleteTextView အတျကး Activity တစးခုကိုစတငး
တညးေဆာကးရနးအတျကး .xml ဖိုငးအသစးတစးခုကို layout အတျကး တညးေဆာကးရနးလိုအပးပါမညး၈
ထုိ႕အ်ပငး Code အတျကးသာမက Call မ္ာ့ကို Handle ်ပဳလုပးႏိုငးမညး႕ Intent Filter မ္ာ့ကိုအသဵု့်ပဳႏိုငး
ရနး .java ဖိုငးတစးဖိုငးကိုလညး့ ထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈အဆိုပါ Activity အတျကးလိုအပးေသာ
လုပးေဆာငးခ္ကးမ္ာ့ကို ယခငးအခနး့မြ “Building the Activities” ဟူေသာ
အပိုငး့တျငးေလံလာႏိုငးပါသညး၈ ယခု Project အတျကး ေဖား်ပပါ Activity မ္ာ့တညးေဆာကးရာတျင
လိုအပးပါကအဆိုပါ “Building the Activities” ဟူေသာအပိုငး့ကို ်ပနးလညးေလံလာႏိုငးပါသညး၈

Created an autocomplete.xml File

autocomplete.xml ဟုအမညးေပ့ထာ့ေသာ .xml ဖိုငးတစးခုကို AndroidViews Project အတျငး့


တညးေဆာကးပါ၈ ဖိုငးအမညးကို အကၡရာအေသ့ (lowercase) ်ဖငးံသာေပ့ရပါမညး၈ Package Explorer
အတျငး့မြ Layout Folder အတျငး့တျငး အဆိုပါ ဖိုငးေပၚလာေသာအခါ ထိုဖိုငးကို်ပငးဆငးရနးအတျကး ထို
ဖိုငးေပၚတျငး Double Click ႏိြပးပါ၈ ထိုဖိုငးကို AutoCompleteTextView Activity ၏ Layout ကိုထိနး့ခ္ဳပး
ေစႏိုငးရနးအတျကး ်ပဳလုပးမညး်ဖစးေသာေၾကာငးံ Layout အတျငး့တျငး AutoCompleteTextView တစးခု

မ္ကးပျငးံစာေပ 175
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ရိြေနရနးလိုအပးပါမညး၈ AutoCompleteTextView တစးခုကို XML တျငးထညး႕သျငး့ရမညး႕ Code မ္ာ့ကို


ေအာကးတျငးေဖား်ပထာ့ပါသညး၈

<AutoCompleteTextView android:id="@+id/testAutoComplete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

.xml ဖိုငးမ္ာ့အတျငး့တျငး မ္ာ့စျာေသာ View မ္ာ့ကိုတညးေဆာကးခဲံၿပီ့်ဖစးေသာေၾကာငးံ ထိုသို႕ထညး႕သျငး့


ရနး အခကးအခဲမရိြႏိုငးဟုယူဆပါသညး၈ AutoCompleteTextView အတျကး Setting ်ပဳလုပးရာတျငး Id ကို
testAutoComplete ဟုသတးမြတးေပ့ရမညး်ဖစးၿပီ့ width ကို fill_parent ဟုသတးမြတးကာ height ကို
wrap_content ဟုအသီ့အသီ့သတးမြတးေပ့ရပါမညး၈ ထို႕ေနာကး Button ႏြစးခုကိုလညး့ Layout တျငး
ေပါငး့ထညး႕ေပ့ရပါမညး၈ အဆိုပါ Button မ္ာ့ကို အေ်ပာငး့အလဲ်ပဳလုပးေစမညး႕ attribute မ္ာ့ကို ထိနး့
ခ္ဳပးရနးအတျကး အသဵု့်ပဳပါမညး၈ အဆိုပါ Button မ္ာ့ကို autoCompleteButton ႏြငးံ textColorButton
ဟူ၍ ေအာကးေဖား်ပပါ Code အတိုငး့ သတးမြတးပါမညး၈

<Button android:id="@+id/autoCompleteButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Layout"/>
<Button android:id="@+id/textColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Color"/>

ထို႕ေနာကးၿပီ့စီ့သျာ့မညး်ဖစးေသာ autocompleter.xml ဖိုငးမြ Code မ္ာ့ကိုေအာကးပါအတုိငး့ေတျ႕်မငးရ


ပါမညး၈

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


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<AutoCompleteTextView android:id="@+id/testAutoComplete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/autoCompleteButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Layout"/>
<Button android:id="@+id/textColorButton"
android:layout_width="fill_parent"

176 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:layout_height="wrap_content"
android:text="Change Text Color"/>
</LinearLayout>

Create an autocomplete.java File

ယခငးအခနး့တျငးေဖား်ပထာ့ၿပီ့်ဖစးသညး႕ “Creating a New .Java File” အပိုငး့ကို်ပနးလညးေလံလာ၍


autocomplete.java ဖိုငးတစးဖုိငးတညးေဆာကးပါ၈ Views မ္ာ့အတျကး ပထမဆဵု့်ပဳလုပးရမညး႕အခ္ကးမြာ
package မ္ာ့ထညး႕သျငး့ရနး်ဖစးပါသညး၈ ယခုေဖား်ပပါ Activity တျငး View အမ္ိဳ့အစာ့ႏြစးခုကိုအသဵု့်ပဳ
ထာ့ၿပီ့ တစးခုမြာ AutoCompleteTextView ႏြငးံ ေနာကးတစးခုမြာ Button ်ဖစးပါသညး၈ ထို႕အ်ပငး Color
မ္ာ့ႏြငးံ ArrayAdapter ကိုပါအသဵု့်ပဳရနးကိုလညး့ လိုအပးမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေဖား်ပပါ package
မ္ာ့ကို Activity အတျငး့တျငးထညး႕သျငး့ေပ့ရပါမညး၈

package android_programmers_guide.AndroidViews;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.graphics.Color;

သတိ်ပဳရနး၈ အဆိုပါ Color ႏြငးံ Array မ္ာ့ကို ယခုအခ္ိနးထိေလံလာရ်ခငး့မရိြေသ့ပါ၈ ထို႕ေၾကာငးံ ယခုေန


ရာတျငး Color ႏြငးံ Array မ္ာ့ကို အသဵု့်ပဳမညး႕ Package မ္ာ့ကိုထညး႕သျငး့်ခငး့ကိုသာ ေလံလာၾကညး႕ပါ၈
အေသ့စိပးကိုေနာကးပိုငး့တျငးဆကးလကးေလံလာရမညး်ဖစးသညး၈

ထို႕ေနာကးေအာကးေဖား်ပပါအတိုငး့ ကနဦ့လိုအပးသညး႕ AutoComplete Class ကို autocomplete.java


ဖိုငးတျငးထညး႕သျငး့ေပါငး့ထညး႕ေပ့ရပါမညး၈

public class AutoComplete extends Activity {


@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}

မ္ကးပျငးံစာေပ 177
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အဆိုပါ Class သညး Activity ၏ အ်ခာ့ေသာ Building မ္ာ့ကိုစတငးရနးအတျကး အေ်ခခဵ Class တစးခု
်ဖစးပါသညး၈ ေဖား်ပပါ Activity ၏ အာ့လဵု့ေသာ Function မ္ာ့ကို ယခု Class အတျငး့တျငးထညး႕သျငး့
မညး်ဖစးပါသညး၈ ထို႕ေနာကး autocomplete.xml ၏ Layout ကို Load လုပးေပ့ရနးလိုအပးပါမညး၈

setContentView(R.layout.autocomplete);

ယခုေဖား်ပပါ ဥပမာအတျကး ႏြစးတစးႏြစးပါွငးေသာ လမ္ာ့၏စာရငး့ကို AutoCompleteTextView တျငး


ထညး႕သျငး့တညးေဆာကးမညး်ဖစးပါသညး၈ အသဵု့်ပဳသူမြ အဆိုပါ Box အတျငး့ ရိုကးထညး႕လိုကးသညးႏြင
မညးသညး႕ လ ကိုရိုကးထညး႕သညးကို ႀကိဳတငးထညး႕သျငး့ေပ့မညး်ဖစးသညး၈ အဆိုပါ AutoCompleteText
View တျငး Month မ္ာ့၏ စာရငး့ကို ထညး႕သျငး့ရမညး်ဖစးေသာေၾကာငးံ AutoCompleteTextView
အတျကး List တစးခုကိုတညးေဆာကးရနးလိုအပးပါလိမးံမညး၈ ထို႕ေၾကာငးံ string array တစးခုကိုတညး
ေဆာကး၍ လအမညးမ္ာ့ကို assign ်ပဳလုပးေပ့ထာ့ရပါမညး၈

static final String[] Months = new String[]{


"January","February","March","April","May","June","July","August",
"September","October","November","December"
};

ေနာကးထပးလုပးေဆာငးရမညး႕အလုပးမြာ string array ကို AutoCompleteTextView တျငး assign ်ပဳလုပး


ရနး်ဖစးပါသညး၈ မ္ာ့စျာေသာ View အမ္ာ့အတျကး တညးေဆာကးခဲံၿပီ့်ဖစးေသာေၾကာငးံ ယခုတညးေဆာက
မညး႕ AutoCompleteTextView သညးလညး့ အတူတူပငး်ဖစးပါလိမံးမညး၈ ယခငးကအသဵု့မ်ပဳခဲံရေသ့
ေသာ string array အတျကး အသဵု့်ပဳရမညး႕ Code မ္ာ့မြာ ေအာကးပါအတိုငး့်ဖစးပါသညး၈

ArrayAdapter<String> monthArray = new ArrayAdapter<String>(this,


android.R.layout.simple_list_item_1, Months);
final AutoCompleteTextView textView = (AutoCompleteTextView)
findViewById(R.id.testAutoComplete);
textView.setAdapter(monthArray);

ပထမစာေၾကာငး့တျငး string array တစးခုတညးေဆာကးၿပီ့ ၁ငး့ကို monthArray ဟုအမညးေပ့ထာ့


သညး႕ ArrayAdapter ႏြငးံ assign ်ပဳလုပးထာ့ပါသညး၈ ထို႕ေနာကး .xml layout file အတျငး့တညး
ေဆာကးထာ့ေသာ AutoCompleteTextView ်ဖငးံခ္ိတးဆကးေပ့ရပါမညး၈ ေနာကးဆဵု့အေန်ဖငးံ set
Adapter() ဟူေသာ method ကိုအသဵု့်ပဳ၍ monthArray ဟူေသာ ArrayAdapter ကို AutoComplete
TextView ်ဖငးံ Assign ်ပဳလုပးေပ့ရပါမညး၈

178 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး Button ႏြစးခုအတျကး Code ကိုလညး့ လုပးေဆာငးေပ့ရဦ့မညး်ဖစးသညး၈ ထို Code မ္ာ့သညး


ယခငးအခနး့တျငးအသဵု့်ပဳခဲံၾကေသာ Code မ္ာ့်ဖငးံအတူတူပငး်ဖစးပါသညး၈ ကျဲ်ပာ့်ခာ့နာ့သညး႕အခ္ကးမြာ
မတညးေဆာကးရေသ့သညး႕ changeOption ႏြငးံ changeOption2 ဟူေသာ Function ႏြစးခုကိုေခၚယူ
ရနးအတျကး Code မ္ာ့ထညး႕ သျငး့ေပ့ရနးလိုအပးေသာအခ္ကးပငး်ဖစးပါသညး၈

AutoCompleteTextView ကို်ဖတးသနး့၍ Function ေခၚယူ်ခငး့ဟူေသာအခ္ကးကို သတိ်ပဳပါ၈ Function


မ္ာ့ကိုတညးေဆာကးရာတျငး ေဖား်ပပါ Parameter မ္ာ့ကိုသာ တညးေဆာကးရနး လိုပါလိမးံမညး၈

final Button changeButton = (Button)


findViewById(R.id.autoCompleteButton);

changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(textView);
}
});
final Button changeButton2 = (Button)
findViewById(R.id.textColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(textView);
}
});

အဆိုပါ Button မြ ေခၚယူေသာ Function မ္ာ့သညး AutoCompleteTextView ေပၚမြ layout attribute


မ္ာ့ကို ေ်ပာငး့လဲရနး အသဵု့်ပဳရပါမညး၈ modify ်ပဳလုပးရနးေရျ့ခ္ယးထာ့ေသာ Attribute ႏြစးခုမြာ layout
height ႏြငးံ text color တို႕်ဖစးပါသညး၈ အဆိုပါ Button မ္ာ့မြ တစးခုကို AutoCompleteTextView ၏
Layout height ်ဖစးေသာ 30 မြ 100 သို႕ေ်ပာငး့လၿပီ့ အေရာငးကိုလညး့ အနကးေရာငးအ်ဖစးသို႕ ေ်ပာငး့
လဲပါမညး၈ ေနာကးတစးခုကို View အတျငး့တျငး Text ၏ အေရာငးကို အနီေရာငးအ်ဖစးေ်ပာငး့လဲပါမညး၈
changeOption() ဟူေသာ function ်ဖငးံ AutoCompleteView ၏ Layout height ကို ေ်ပာငး့လဲႏိုငးပါ
သညး၈ ထို Function ၏ Code သညးလညး့ အလျနးရို့ရြငး့လြပါသညး၈

public void changeOption(AutoCompleteTextView text){


if (text.getHeight()==100){
text.setHeight(30);
}
else{
text.setHeight(100);
}
}

မ္ကးပျငးံစာေပ 179
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အထကးတျငးအသဵု့်ပဳခဲံေသာ Function အရ AutoCompleteTextView ၏ လကးရိြ height ကိုစစးေဆ့ၿပီ့


အကယး၍ Height သညး 100 ်ဖစးခဲံပါက 30 သို႕ေ်ပာငး့လဲမညး်ဖစးၿပီ့ သို႕မဟုတးပါက 100 သို႕ေ်ပာငး့လဲ
ေစမညး်ဖစးသညး၈

changeOption2() ဟူေသာ function သညးလညး့ အသဵု့်ပဳရလျယးကူပါသညး၈

public void changeOption2(AutoCompleteTextView text){


text.setTextColor(Color.RED);
}
}

အထကးပါ Function သညး AutoCompleteTextView အတျကး Color.RED အ်ဖစး Text Color ကို
သတးမြတးေပ့ပါသညး၈ Color.RED ဟူေသာ တနးဖို့သညး android.graphics.Color ဟူေသာ package မြ
ယူငငးသဵု့စျဲထာ့်ခငး့်ဖစးပါသညး၈ ထို package ကိုအသဵု့်ပဳ၍ ႏြစးသကးရာအေရာငးကို ေ်ပာငး့လဲအသဵု့်ပဳ
ႏိုငးပါသညး၈ အနီေရာငးသိုသာ သဵု့စျဲမညး်ဖစးေသာေၾကာငးံ Color.RED ဟုအသဵု့်ပဳထာ့်ခငး့်ဖစးပါသညး၈

ထို႕ေနာကး autocomplete.java ဖိုငးတျငးရိြေသာ Code အ်ပညး႕အစဵုကိုေအာကးပါအတိုငး့ေတျ႕်မငးရမည


်ဖစးပါသညး၈

package android_programmers_guide.AndroidViews;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.graphics.Color;

public class AutoComplete extends Activity {


@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.autocomplete);

ArrayAdapter<String> monthArray = new ArrayAdapter<String>(this,


android.R.layout.simple_list_item_1, Months);
final AutoCompleteTextView textView = (AutoCompleteTextView)
findViewById(R.id.testAutoComplete);
textView.setAdapter(monthArray);
final Button changeButton = (Button)
findViewById(R.id.autoCompleteButton);
changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
180 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

changeOption(textView);
}
});
final Button changeButton2 = (Button)
findViewById(R.id.textColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v){
changeOption2(textView);
}
});
}

static final String[] Months = new String[]{


"January","February","March","April","May","June","July","August",
"September","October","November","December"
};

public void changeOption(AutoCompleteTextView text){


if (text.getHeight()==100){
text.setHeight(30);
}
else{
text.setHeight(100);
}
}

public void changeOption2(AutoCompleteTextView text){


text.setTextColor(Color.RED);
}
}

Add an Intent Filter

Application ကိုေမာငး့ႏြငး်ခငး့မ်ပဳႏိုငးမီတျငး လိုအပးေသာေနာကးဆဵု့လုပးေဆာငးခ္ကးမြာ AndroidManifest


.xml ဟူေသာ ဖိုငးအတျငး့မြ Intent Filter ကိုသတးမြတးရနး်ဖစးပါသညး၈ ထိုသို႕သတးမြတးေသာအခါတျငးမ
Menu မြ Intent ကိုေခၚယူေစႏိုငးမညး်ဖစးပါသညး၈ Intent Filter ကိုအသဵု့်ပဳရနးအတျကး ေအာကးပါ Code
မ္ာ့ကိုထညး႕သျငး့ရပါမညး၈

<activity android:name=".AutoComplete" android:label="AutoComplete">


<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

ထို႕ေနာကး AndroidManifest.xml ဖိုငးမြ Code အ်ပညး႕အစဵုကိုေအာကးပါအတိုငး့ေတျ႕်မငးရပါမညး၈

မ္ကးပျငးံစာေပ 181
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

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


<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>

</activity>
<activity android:name=".AutoComplete"
android:label="AutoComplete">
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>

Handling the Intent Call

AndroidManifest.xml ဖိုငးတျငးလိုအပးေသာ Code မ္ာ့ကိုထညး႕သျငး့ၿပီ့ေနာကး AndroidViews.java ဖိုငး


အတျငး့တျငးလညး့ ေအာကးပါ function ကို ထညး႕်ဖညး႕ေပ့ရပါဦ့မညး၈

public void showAutoComplete(){


Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);
}

်ပဳလုပးထာ့ခဲံသညး႕ select/case statement မြ ေခၚယူေသာအခါတျငး အထကးေဖား်ပပါ function သညး


autocomplete Activity ကို ဖျငးံေပ့မညး်ဖစးပါသညး၈ case 0 ဟူေသာ statement ေနာကးတျငး အထကးပါ
function ကိုေခၚယူရနး Code ကိုေရ့သာ့ေပ့ရပါမညး၈

case 0:
showAutoComplete();
return true;

182 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Application ကို Android Emulator တျငးေမာငး့ႏြငးၾကညး႕ပါ၈ main Activity ကို Launch ်ပဳလုပးၿပီ့ေသာ
အခါ Menu Button ကို Click ႏိြပးပါ၈ Menu ေပၚလာသညးကိုေတျ႕ရပါမညး၈ AutoComplete menu Item
တျငး Click ႏိြပးပါ၈ AutoComplete Button Menu Item တျငး Click ႏိြပး်ခငး့်ဖငးံ autocomplete activity
ကိုအလုပးလုပးေဆာငးေၾကာငး့ ေအာကးပါပဵုအတိုငး့ေတျ႕ရပါလိမးံမညး၈

AutoCompleteTextView ကိုစမး့သပးရနးအတျကး January ဟူေသာ စကာ့လဵု့ကိုရိုကးၾကညး႕ပါ၈ အကၡရာ


တစးလဵု့၇ ႏြစးလဵု့ခနး႕ရိုကးအၿပီ့တျငး Text Box ၏ေအာကးနာ့တျငး January ဟူေသာ စကာ့လဵု့ကို ေဖား်ပ
ေနမညး်ဖစးေၾကာငး့ ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအရ ေတျ႕ရိြရမညး်ဖစးသညး၈

မ္ကးပျငးံစာေပ 183
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး Change Layout Button ကို Click ႏိြပးၾကညး႕ပါ၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့


Text Box သညးႀကီ့မာ့သျာ့ေၾကာငး့ေတျ႕ရပါလိမးံမညး၈

ထို႕ေနာကး Change Text Color ခလုတးကို ႏိြပးၿပီ့ေနာကး စာသာ့အနညး့ငယးရိုကးထညး႕ၾကညး႕ပါ၈


ေအာကးပါပဵုကိုၾကညး႕၍ အေ်ပာငး့အလဲကိုေလံလာႏိုငးပါသညး၈

184 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အထကးတျငးေဖား်ပခဲံေသာအပိုငး့ကိုေလံလာၿပီ့ေနာကး က္နးရိြေနေသာ Views ငါ့ခုအေၾကာငး့ကို ဆကး


လကး ေလံလာၾကညး႕ၾကပါမညး၈

Button
ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့ကိုေလံလာၾကညး႕ပါ၈ အဆိုပါ Code မ္ာ့သညး ဖိုငးေလ့ဖိုငးတျငး
အသဵု့်ပဳရမညး႕ Code မ္ာ့်ဖစးသညး၈ ထိုဖိုငးေလ့ဖိုငးမြာ AndroidManifest.xml၇ Button.xml၇ test
Button.java ႏြငးံ AndroidViews.java ဖိုငးမ္ာ့တျငးအသဵု့်ပဳရမညး႕ Code မ္ာ့်ဖစးပါသညး၈ ယခငးအပိုငး့
တျငး်ပဳလုပးထာ့ၿပီ့်ဖစးသညး႕ AndroidViews Activity ဟူေသာ Project တျငးအဆိုပါ Code မ္ာ့ကို
ထညး႕သျငး့ရမညး်ဖစးပါသညး၈

သတိ်ပဳရနး၈ အကယး၍ေလံလာသူသညးယခုေနရာမြစတငးေလံလာ၍ နာ့လညးမညးမဟုတးပါ၈ ထို႕ေၾကာငးံ


ယခုအခနး့အစတျငးေဖား်ပထာ့ေသာ သငးခနး့စာမ္ာ့မြ စတငးေလံလာသငးံပါသညး၈

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews"
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews"
android:label="@string/app_name">

မ္ကးပျငးံစာေပ 185
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AutoComplete" android:label="AutoComplete">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testButton" android:label="TestButton">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

Button.xml

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:id="@+id/testButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the test Button"/>
<Button android:id="@+id/layoutButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Layout"/>
<Button android:id="@+id/textColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Color"/>
</LinearLayout>

testButton.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.graphics.Color;
public class testButton extends Activity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);

186 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

setContentView(R.layout.Button);

final Button Button = (Button) findViewById(R.id.testButton);

final Button changeButton = (Button)findViewById(R.id.layoutButton);


changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(Button); }
});
final Button changeButton2 = (Button)
findViewById(R.id.textColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(Button);
}

});
}
public void changeOption(Button Button){
if (Button.getHeight()==100){
Button.setHeight(30);
}
else{
Button.setHeight(100);
}
}
public void changeOption2(Button Button){
Button.setTextColor(Color.RED);
}
}

AndroidViews.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
မ္ကးပျငးံစာေပ 187
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

}
@Override
public boolean onOptionsItemSelected(Menu.Item item){
switch (item.getId()) {
case 0:
showAutoComplete();
return true;

case 1:
showButton();
return true;
case 2:
return true;
case 3:
return true;
case 4:
return true;
case 5:
return true;
}
return true;
}
public void showButton() {
Intent showButton = new Intent(this, testButton.class);
startActivity(showButton);
}
public void showAutoComplete(){
Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);
}
}

ထို႕ေနာကး Application ကို Launch လုပးၾကညး႕ၿပီ့ Menu မြ Button Option ကိုေရျ့ခ္ယးၾကညး႕ပါမညး၈


ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Button Activity ကိုေတျ႕ရိြရပါလိမးံမညး၈

188 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Change Layout Button ကိုႏိြပးၾကညး႕ပါ၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Display Area က္ယး


်ပနး႕လာသညးကို်မငးေတျ႕ရမညး်ဖစးပါသညး၈

ထို႕ေနာကး Change Text Color ခလုတးကိုႏိြပးေသာအခါတျငး text အေရာငးသညး အနီေရာငးအ်ဖစး


ေ်ပာငး့လဲသျာ့သညးကိုေအာကးပါပဵုအတိုငး့ ေတျ႕်မငးရပါလိမးံမညး၈

မ္ကးပျငးံစာေပ 189
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

CheckBox
ယခုအပိုငး့တျငး CheckBox View အတျကး Activityတစးခုကိုတညးေဆာကးပါမညး၈ Activity တညးေဆာကး
ရနးအတျကး်ပဳလုပးရမညး႕အဆငးံမ္ာ့ကိုယခငးအပိုငး့မ္ာ့တျငးေဖား်ပထာ့ၿပီ့်ဖစးပါသညး၈ထို႕ေၾကာငးံ Android
Manifest.xml ဖိုငး၇ checkbox.xml ဖိုငးႏြငးံ testCheckBox.java ဖိုငးတျငးေရ့သာ့ရမညး႕ Code မ္ာ့
ကိုသာေဖား်ပေပ့ေတာံမညး်ဖစးပါသညး၈ ထိုဖိုငးမ္ာ့သညး ယခုအပိုငး့တျငးလိုအပးမညး႕ဖိုငးမ္ာ့လညး့ ်ဖစးပါ
သညး၈ယခုအပိုငး့အတျကး အသဵု့်ပဳမညး႕ AndroidView ၏ AndroidManifest.xml ဖိုငးအတျကး
လိုအပးေသာ Code အ်ပညး႕အစဵုကုိေအာကးတျငးေဖား်ပထာ့ပါသညး၈ Eclipse ကိုအသဵု့်ပဳခဲံ်ခငး့်ဖစးပါက
လကးရိြ လုပးဆာငးေနေသာ Project မြ AndroidManifest.xml ဖိုငးမြ Code မ္ာ့ကို
ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့်ဖစးလာေစရနး ်ပငးဆငးေပ့ရပါမညး၈

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

190 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

</activity>
<activity android:name=".AutoComplete" android:label="AutoComplete">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".testButton" android:label="TestButton">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testCheckBox" android:label="TestCheckBox">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

ယခု Section တျငး checkbox.xml ဖိုငးတျငးအသဵု့်ပဳမညး႕ Code အ်ပညး႕အစဵုကိုေဖား်ပထာ့ပါသညး၈


Project အတျငး့တျငး checkbox.xml ဟုအမညးေပ့ထာ့သညး႕ XML ဖိုငးအသစးတစးဖိုငးကို ယခငးအခနး့
တျငးေဖား်ပထာ့သညး႕နညး့လမး့မ္ာ့ကိုအသဵု့်ပဳ၍ တညးေဆာကးေပ့ရပါမညး၈ ထို႕ေနာကး ေအာကးေဖား်ပ
ပါ Code မ္ာ့ကိုထညး႕သျငး့ေရ့သာ့ေပ့ရပါမညး၈

Checkbox.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<CheckBox android:id="@+id/testCheckBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the test CheckBox"/>
<Button android:id="@+id/layoutButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Layout"/>
<Button android:id="@+id/textColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Color"/>
</LinearLayout>

မ္ကးပျငးံစာေပ 191
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

testCheckBox.java
ယခု Section တျငး CheckBox Activity အတျကးလိုအပးေသာ ဖိုငးတစးဖိုငးကိုထပးမဵေဖား်ပပါမညး၈ .java
ဖိုငးအသစးတစးဖိုငးကို Project အတျငး့တျငးတညးေဆာကး၍ testCheckBox.java ဟုအမညးေပ့ပါ၈
ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့ကို testCheckBox.java ဖိုငးတျငးထညး႕သျငး့ေပ့ရပါမညး၈

package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Button;
import android.graphics.Color;

public class testCheckBox extends Activity {


@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.checkbox);

final CheckBox checkbox = (CheckBox)findViewById(R.id.testCheckBox);

final Button changeButton = (Button)findViewById(R.id.layoutButton);


changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(checkbox); }
});
final Button changeButton2 = (Button)
findViewById(R.id.textColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(checkbox);
}
});
}
public void changeOption(CheckBox checkbox){
if (checkbox.getHeight()==100){
checkbox.setHeight(30);
}
else{
checkbox.setHeight(100);
}
}
public void changeOption2(CheckBox checkbox){
checkbox.setTextColor(Color.RED);
}
}

AndroidViews.java
ယခု Activity ကိုတညးေဆာကး်ခငး့၏ ေနာကးဆဵု့အဆငးံမြာ AndroidViews.java ဖိုငးကို ်ပငးဆငးရနး
်ဖစးပါသညး၈ main AndroidViews ဟူေသာ Activity မြ testCheckBox Activity ကိုေခၚယူလိုေသာအခါ

192 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

AndroidViews.java တျငး Code မ္ာ့ကိုထညး႕သျငး့ေပ့ရပါမညး၈ ေအာကးတျငးေရ့သာ့ထာ့ေသာ Code


မ္ာ့ႏြငးံ လကးရိြ ရိြေနမညး႕ Project မြ AndroidViews.java ဖိုငးတျငးရိြေနမညး႕ Code မ္ာ့ကို ႏိႈငး့ယြဥး
ၾကညး႕ၿပီ့ လိုအပးေသာ Code မ္ာ့ကိုေတျ႕်မငးရလြ္ငး ေပါငး့ထညး႕ေပ့ရမညး်ဖစးပါသညး၈

package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
}
@Override
public boolean onOptionsItemSelected(Menu.Item item){
switch (item.getId()) {
case 0:
showAutoComplete();
return true;
case 1:
showButton();
return true;
case 2:
showCheckBox()
return true;
case 3:
return true;
case 4:
return true;
case 5:
return true;
}
return true;
}

မ္ကးပျငးံစာေပ 193
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

public void showButton() {


Intent showButton = new Intent(this, testButton.class);
startActivity(showButton);
}
public void showAutoComplete(){
Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);
}

public void showCheckBox() {


Intent checkbox = new Intent(this, testCheckBox.class);
startActivity(checkbox);
}
}

Application ကို Luanch ်ပဳလုပးၿပီ့ေနာကး Menu မြ CheckBox Option ကိုေရျ့ခ္ယးပါ၈ ေအာကးတျငး


ေဖား်ပထာ့သညး႕ပဵုအတိုငး့ CheckBox Activity လုပးေဆာငးသညးကိုေတျ႕်မငးရပါလိမံးမညး၈

ထို႕ေနာကး Change Layout ခလုတးႏြငးံ Test Color ခလုတးမ္ာ့ကို ႏိြပးၾကညး႕ပါ၈ ထိုအခါေတျ႕ရမညး႕


Output မ္ာ့ကိုေအာကးပါပဵုမ္ာ့တျငးေဖား်ပထာ့ပါသညး၈

194 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

EditText
ယခုအပိုငး့တျငး ယခငး်ပဳလုပးခဲံရသကဲံသို႕ပငး EditText ဟူေသာ View အတျကး Activity တစးခုဖနးတီ့ၾက
မညး်ဖစးပါသညး၈ Activity ဖနးတီ့ႏုိငးေစမညး႕နညး့လမး့မ္ာ့ကို ယခငးအပိင
ု း့မ္ာ့တျငးေလံလာခဲံရၿပီ့်ဖစ
ေသာေၾကာငးံ Code မ္ာ့ကိုသာေဖား်ပေပ့ေတာံမညး်ဖစးပါသညး၈ main Activity ဖိုငးသဵု့ဖုိငးရိြၿပီ့ ၁ငး့တို႕မြာ
AndroidManifest.xml၇ edittext.xml ဖိုငးႏြငးံ testEditText.java ဖိုငးတို႕်ဖစးပါသညး၈ ထိုဖိုငးအတျငး့တျငး
ပါွငးမညး႕ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

ယခုအပိုငး့တျငး AndroidView ၏ AndroidManifest.xml ဖိုငးတျငးပါွငးမညး႕ Code မ္ာ့ကိုေဖား်ပထာ့ပါ


သညး၈ ထို Code မ္ာ့ကို လကးရိြအသဵု့်ပဳေနေသာ AndroidManifest.xml ဖိုငးႏြငးံႏိႈငး့ယြဥး၍ လိုအပးေသာ
Code မ္ာ့ကိုထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AutoComplete" android:label="AutoComplete">
<intent-filter>

မ္ကးပျငးံစာေပ 195
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<action android:name="android.intent.action.MAIN" />


<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testButton" android:label="TestButton">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testCheckBox" android:label="TestCheckBox">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<activity android:name=".testEditText" android:label="TestEditText">


<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

ယခုအပိုငး့တျငး edittext.xml မြ Code အ်ပညး႕အစဵုကိုေဖား်ပေပ့ပါမညး၈ Project အတျငး့တျငး xml file


အသစးတစးခုတညးေဆာကး၍ edittext.xml ဟုအမညးေပ့ပါ၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့
သညး edittext.xml ဖိုငးတျငးထညး႕သျငး့ရမညး႕ Code မ္ာ့်ဖစးပါသညး၈

edittext.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText android:id="@+id/testEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/layoutButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Layout"/>
<Button android:id="@+id/textColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Color"/>
</LinearLayout>

196 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခုအပိုငး့တျငး EditText Activity ကို implement ်ပဳလုပးေစရနးလိုအပးမညး႕ ဖိုငးတစးခုကိုေဖား်ပေပ့မည


်ဖစးပါသညး၈ Project အတျငး့တျငး .java ဖိုငးအသစးတစးဖုိငးတညးေဆာကး၍ testEditText.java ဟု
အမညးေပ့ပါ၈ ထိုဖိုငးသညး Activity အတျကး အဓိကဖိုငးတစးဖိုငး်ဖစးေသာေၾကာငးံ လုပးေဆာငးခ္ကးမ္ာ့
လုပးေဆာငးႏိုငးေသာ Code မ္ာ့ပါွငးမညး်ဖစးပါသညး၈ ထိုဖိုငးအတျကး အသဵု့်ပဳရမညး႕ Code မ္ာ့ကို
ေအာကးတျငးေတျ႕်မငးႏိုငးပါသညး၈

testEditText.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Button;
import android.graphics.Color;

public class testEditText extends Activity {


@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.edittext);

final EditText edittext = (EditText)findViewById(R.id.testEditText);

final Button changeButton = (Button)findViewById(R.id.layoutButton);


changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(edittext); }
});
final Button changeButton2 = (Button)
findViewById(R.id.textColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(edittext);
}
});
}
public void changeOption(EditText edittext){
if (edittext.getHeight()==100){
edittext.setHeight(30);
}
else{
edittext.setHeight(100);
}
}
public void changeOption2(EditText edittext){
edittext.setTextColor(Color.RED);
}
}

မ္ကးပျငးံစာေပ 197
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးဆဵု့်ပဳလုပးရမညး႕အဆငးံသညး AndroidViews.java ဖိုငးကို်ပငးဆငးရနး်ဖစးပါသညး၈ အကယး၍ main


AndroidViews Activity မြ testEditText Activity ကိုေခၚယူလိုေသာအခါ လိုအပးေသာ Code မ္ာ့ကို
AndroidViews.java တျငးထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးတျငးေဖား်ပထာ့ေသာ
Code မ္ာ့ကို လကးရိြ AndroidViews.java ဖိုငးမြ Code မ္ာ့ႏြငးံႏိႈငး့ယြဥး၍ မရိြေသ့ေသာ Code မ္ာ့ကို
AndroidViews.java ဖိုငးတျငးေပါငး့ထညး႕ေပ့ရဦ့မညး်ဖစးပါသညး၈

AndroidViews.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
}
@Override
public boolean onOptionsItemSelected(Menu.Item item){
switch (item.getId()) {
case 0:
showAutoComplete();
return true;
case 1:
showButton();
return true;
case 2:
showCheckBox();
return true;
case 3:
showEditText();
return true;
198 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

case 4:
showRadioGroup();
return true;
case 5:
showSpinner();
return true;
}
return true;
}
public void showButton() {
Intent showButton = new Intent(this, testButton.class);
startActivity(showButton);
}
public void showAutoComplete(){
Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);
}
public void showCheckBox(){
Intent checkbox = new Intent(this, testCheckBox.class);
startActivity(checkbox);
}
public void showEditText() {
Intent edittext = new Intent(this, testEditText.class);
startActivity(edittext);
}
}

ထို႕ေနာကး Application ကိုေမာငး့ႏြငး၍ Menu မြ EditText option ကိုေရျ့ခ္ယးပါ၈ EditText Activity မြ


လုပးေဆာငးခ္ကးမ္ာ့ကိုေအာကးေဖား်ပပါပဵုမ္ာ့တျငးေတျ႕်မငးႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 199
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Change Layout ခလုတးႏြငးံ Change Test Color ခလုတးမ္ာ့ကိုလညး့ စမး့ႏိြပးၾကညး႕ပါ၈ ထျကးေပၚလာ


မညး႕ Result မ္ာ့ကိုေအာကးေဖား်ပပါ ပဵုမ္ာ့တျငး ေတျ႕်မငးႏိုငးပါသညး၈

RadioGroup
ယခုအပိုငး့တျငး RadioGroup View အတျကး Activity တစးခုကိုတညးေဆာကးၾကညး႕ၾကပါမညး၈ Activity
တညးေဆာကးရနးနညး့လမး့မြာ ယခငးအသဵု့်ပဳခဲံေသာ နညး့လမး့မ္ာ့အတိုငး့ပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ
အဓိက Activity ဖိုငးသဵု့ဖိုငး်ဖစးသညး႕ AndroidManifest.xml ဖိုငး၇ radiogroup.xml ဖိုငႏ
း ြငးံ testRadio
Group.java ဖိုငး၏ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

AndroidManifest.xml ဖိုငးအတျကးလိုအပးေသာ Code မ္ာ့ကိုေဖား်ပထာ့ပါသညး၈ ယခငးရိြၿပီ့သာ့


AndroidManifest.xml ဖိုငးအတျငး့မြ Code မ္ာ့ႏြငးံႏႈိငး့ယြဥး၍ လိုအပးေသာ Code မ္ာ့ကို ်ဖညး႕စျကးေပ့ရ
ပါမညး၈

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews"

android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

200 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<activity android:name=".AutoComplete" android:label="AutoComplete">


<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testButton" android:label="TestButton">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testCheckBox" android:label="TestCheckBox">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testEditText" android:label="TestEditText">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testRadioGroup" android:label="Test
RadioGroup">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

ေအာကးတျငး radiogroup.xml ဖိုငးအတျကး Code အ်ပညး႕အစဵုကိုေဖား်ပထာ့ပါသညး၈ ထဵု့စဵအတိုငး့ပင


Project အတျငး့တျငး radiogroup.xml ဟူေသာဖုိငးအမညးႏြငးံ XML ဖိုငးတစးခုတညးေဆာကးေပ့ရဦ့မည
်ဖစးပါသညး၈

radiogroup.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

>
<RadioGroup android:id="@+id/testRadioGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<RadioButton
android:text="Radio 1"
android:id="@+id/radio1"
/>

မ္ကးပျငးံစာေပ 201
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<RadioButton
android:text="Radio 2"
android:id="@+id/radio2" />
</RadioGroup>
<Button android:id="@+id/enableButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Set isEnabled"/>
<Button android:id="@+id/backgroundColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Background Color"/>
</LinearLayout>

ေအာကးတျငးလုိအပးေသာ Code မ္ာ့ကိုေဖား်ပထာ့ပါသညး၈ ထဵု့စဵအတိုငး့ပငး testRadioGroup.java ဟု


အမညးေပ့ထာ့ေသာ ဖိုငးတစးဖိုငးကို .java ဖိုငးအသစးအ်ဖစး တညးေဆာကးေပ့ရပါမညး၈ ထိုဖိုငးသညး
လုပးေဆာငးခ္ကးမ္ာ့ကိုလုပးေဆာငးေပ့သညး႕ဖိုငး်ဖစးေသာေၾကာငးံ အေရ့ႀကီ့ပါသညး၈

testRadioGroup.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioGroup;
import android.widget.Button;
import android.graphics.Color;

public class testRadioGroup extends Activity {

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.radiogroup);

final RadioGroup radiogroup = (RadioGroup)


findViewById(R.id.testRadioGroup);

final Button changeButton = (Button)findViewById(R.id.enableButton);


changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(radiogroup); }
});
final Button changeButton2 = (Button)
findViewById(R.id.backgroundColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(radiogroup);
}
});
}
public void changeOption(RadioGroup radiogroup){

202 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

if (radiogroup.isEnabled()){
radiogroup.setEnabled(false);
}
else{
radiogroup.setEnabled(true);
} }
public void changeOption2(RadioGroup radiogroup){
radiogroup.setBackgroundColor(Color.RED);
}
}

ယခု Activity တညးေဆာကး်ခငး့၏ေနာကးဆဵု့အဆငးံသညး AndroidViews.java ဖိုငးမြ Code မ္ာ့ကို ်ပငး


ဆငး်ခငး့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးတျငးေဖား်ပထာ့သညး႕ Code မ္ာ့ႏြငးံ လကးရိြ AndroidViews.
java ဖိုငးမြ Code မ္ာ့ကိုႏိႈငး့ယြဥးၾကညး႕ၿပီ့ လိုအပးေသာ Code မ္ာ့ကိုထညး႕သျငး့ေပ့ပါ၈

AndroidViews.java
package android_programmers_guide.AndroidViews;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;

public class AndroidViews extends Activity {


/** Called when the Activity is first created. */

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
}
@Override
public boolean onOptionsItemSelected(Menu.Item item){
switch (item.getId()) {
case 0:
showAutoComplete();
return true;
case 1:
showButton();

မ္ကးပျငးံစာေပ 203
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

return true;
case 2:
showCheckBox();
return true;
case 3:
showEditText();
return true;
case 4:
showRadioGroup();
return true;
case 5:
showSpinner();
return true;
}
return true;
}
public void showButton() {
Intent showButton = new Intent(this, testButton.class);
startActivity(showButton);
}
public void showAutoComplete(){
Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);

}
public void showCheckBox(){
Intent checkbox = new Intent(this, testCheckBox.class);
startActivity(checkbox);
}
public void showEditText() {

Intent edittext = new Intent(this, testEditText.class);


startActivity(edittext);
}
public void showRadioGroup(){
Intent radiogroup = new Intent(this, testRadioGroup.class);
startActivity(radiogroup);
}
public void showSpinner(){
}
}

Application ကို Launch ်ပဳလုပးၾကညး႕ပါ၈ ထို႕ေနာကး ထျကးလာေသာ Output မ္ာ့၏ပဵုကို ေအာကးတျငး


ေဖား်ပေပ့ထာ့ပါသညး၈

204 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကးပဵုပါအတိုငး့ အ်ခာ့ေသာ ခလုတးမ္ာ့ကိုႏိြပးစမး့ၾကညး႕သငးံပါသညး၈ ေအာကးေဖား်ပပါပဵုမ္ာ့


အတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 205
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Spinner
ယခုအပိုငး့တျငး Spinner View အတျကး Activity တစးခုကိုတညးေဆာကးၾကညး႕ၾကပါမညး၈ Spinner View
ဆိုသညးမြာအ်ခာ့ေသာ Programming Language မ္ာ့တျငးအသဵု့်ပဳေသာ ComboBox ်ဖငးံဆငးတူပါ
သညး၈ Activity လုပးေဆာငးနညး့မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ၿပီ့်ဖစးသ်ဖငးံ ေအာငး်မငးစျာလုပးေဆာင
ႏိုငးမညးဟုယူဆပါသညး၈ ထို႕ေၾကာငးံ လိုအပးေသာ ဖိုငးမ္ာ့်ဖစးေသာ AndroidManifest.xml ဖိုငး၇
spinner.xml ဖိုငးႏြငးံ testSpinner.java ဖိုငးမ္ာ့မြ လိုအပးေသာ Code မ္ာ့ကိုသာေဖား်ပေပ့ေတာံမညး
်ဖစးပါသညး၈

ယခုအပိုငး့တျငး အသဵု့်ပဳရမညး႕ AndroidManifest.xml ဖိုငးမြ Code အ်ပညး႕အစဵုကို ေဖား်ပေပ့ထာ့ပါ


သညး၈ အဆုိပါ Code မ္ာ့ကို လကးရိြ AndroidManifest.xml ဖိုငးမြ Code မ္ာ့ႏြငးံ ႏိႈငး့ယြဥး၍ လိုအပးေသာ
Code မ္ာ့ကိုထပးမဵေပါငး့ထညး႕ေပ့ရပါမညး၈

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidViews">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidViews"
android:label="@string/app_name">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AutoComplete" android:label="AutoComplete">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testButton" android:label="TestButton">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testCheckBox" android:label="TestCheckBox">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testEditText" android:label="TestEditText">

206 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testRadioGroup" android:label="Test
RadioGroup">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".testSpinner" android:label="Test Spinner">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

ယခုအပိုငး့တျငး spinner.xml ဖိုငးမြ Code အ်ပညး႕အစဵုကိုေဖား်ပထာ့ပါသညး၈ ထဵု့စဵအတုိငး့ပငး XML ဖိုငး


အသစးတစးဖိုငး်ပဳလုပး၍ spinner.xml ဟုအမညးေပ့ရပါမညး၈ ထိုသို႕ .xml ဖိုငး်ပဳလုပးမညး႕ နညး့လမး့
အေသ့စိတးကို ယခငးအပိုငး့မ္ာ့တျငး အႀကိမးေပါငး့မ္ာ့စျာ ေဖား်ပေပ့ထာ့ၿပီ့်ဖစးပါသညး၈ ထို႕ေနာကး ထို
်ပဳလုပးထာ့သညး႕ဖိုငးအသစးတျငး ေအာကးေဖား်ပပါ Code မ္ာ့ကိုေရ့သာ့ေပ့ရပါမညး၈

spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner android:id="@+id/testSpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/enableButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Set isEnabled"/>
<Button android:id="@+id/backgroundColorButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Background Color"/>
</LinearLayout>

မ္ကးပျငးံစာေပ 207
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ယခုအပိုငး့တျငး Spinner Activity ကို Implement ်ပဳလုပးရနးအတျကး .java ဖိုငးကို်ပဳလုပးရပါမညး၈ .java


ဖိုငးအသစးတစးခု်ပဳလုပးၿပီ့ေနာကး testSpinner.java ဟုအမညးေပ့ရပါမညး၈ ထိုဖိုငးသညး ယခု Activity
အတျကး အဓိကဖိုငး်ဖစးေၾကာငး့ သိထာ့ရပါမညး၈ .java ဖိုငးအသစးကို တညးေဆာကး်ခငး့ကို ေဖား်ပထာ့
ၿပီ့်ဖစးသညး႕အတျကး ခကးခဲမညးမဟုတးဟု ယူဆပါသညး၈ ထို႕ေၾကာငးံ ေအာကးပါ Code မ္ာ့ကို အဆုိပါ
testSpinner.java ဖိုငးတျငးထညး႕သျငး့ေပ့ရမညး်ဖစးပါသညး၈

testSpinner.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Button;
import android.graphics.Color;

public class testSpinner extends Activity {


@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.spinner);

final Spinner spinner = (Spinner) findViewById(R.id.testSpinner);


ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, Months);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

final Button changeButton = (Button)findViewById(R.id.enableButton);


changeButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption(spinner); }
});
final Button changeButton2 = (Button)
findViewById(R.id.backgroundColorButton);
changeButton2.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
changeOption2(spinner);
}
});
}
static final String[] Months = new String[]{
"January","February","March","April","May","June","July","August",
"September","October","November","December"
};
public void changeOption(Spinner spinner){
if (spinner.isEnabled()){
spinner.setEnabled(false);
}
else{

208 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

spinner.setEnabled(true);
}
}
public void changeOption2(Spinner spinner){
spinner.setBackgroundColor(Color.RED);
}
}

ေနာကးဆဵု့်ပဳလုပးရမညး႕အဆငးံမြာ AndroidViews.java ဖိုငးကို်ပငးဆငးရနး်ဖစးၿပီ့ ေအာကးပါ Code မ္ာ့ႏြငးံ


ယခငးရိြၿပီ့်ဖစးေသာ AndroidViews.java ဖိုငးမြ Code မ္ာ့ကိုႏိႈငး့ယြဥး၍လိုအပးေသာ Code မ္ာ့ကို ထညး႕
သျငး့ေပ့ရပါဦ့မညး၈

AndroidViews.java
package android_programmers_guide.AndroidViews;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.content.Intent;
public class AndroidViews extends Activity {
/** Called when the Activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

menu.add(0, 0, "AutoComplete");
menu.add(0, 1, "Button");
menu.add(0, 2, "CheckBox");
menu.add(0, 3, "EditText");
menu.add(0, 4, "RadioGroup");
menu.add(0, 5, "Spinner");
return true;
}
@Override
public boolean onOptionsItemSelected(Menu.Item item){
switch (item.getId()) {
case 0:
showAutoComplete();
return true;
case 1:
showButton();
return true;

မ္ကးပျငးံစာေပ 209
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

case 2:
showCheckBox();
return true;
case 3:
showEditText();
return true;
case 4:
showRadioGroup();
return true;

case 5:
showSpinner();
return true;
}
return true;
}
public void showButton() {
Intent showButton = new Intent(this, testButton.class);
startActivity(showButton);
}
public void showAutoComplete(){
Intent autocomplete = new Intent(this, AutoComplete.class);
startActivity(autocomplete);
}
public void showCheckBox(){
Intent checkbox = new Intent(this, testCheckBox.class);
startActivity(checkbox);
}
public void showEditText() {
Intent edittext = new Intent(this, testEditText.class);
startActivity(edittext);
}
public void showRadioGroup(){
Intent radiogroup = new Intent(this, testRadioGroup.class);
startActivity(radiogroup);
}
public void showSpinner(){
Intent spinner = new Intent(this, testSpinner.class);
startActivity(spinner);
}
}

ထို႕ေနာကး Application ကို Launch ်ပဳလုပး၍ Menu မြ Spinner Option ကိုေရျ့ခ္ယးၾကညး႕ပါ၈ ေအာကး
ေဖား်ပပါပဵုအတိုငး့ Spinner Activity ကိုေတျ႕ရိြရပါလိမးံမညး၈

210 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Set isEnabled ဟူေသာ ခလုတးႏြငးံ Change Background Color ခလုတးမ္ာ့ကိုစမး့ႏိြပးၾကညး႕ပါ၈


ထျကးေပၚလာေစမညး႕ပဵုမ္ာ့ကို ေအာကးပါပဵုမ္ာ့အတိုငး့ေတျ႕ရိြရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 211
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

(အိမးစာ) Modify More View Attributes

Activity မ္ာ့မြ Button လုပးေဆာငးခ္ကးမ္ာ့ကို ်ပငးဆငး်ခငး့်ဖငးံ View တစးခုစီ၏ ကျဲ်ပာ့ေသာ attribute


မ္ာ့ကို ေ်ပာငး့လဲၾကညး႕ပါ၈

 Eclipse ၏ list feature ကိုအသဵု့်ပဳၿပီ့ View တစးခုစီတျငးအသဵု့်ပဳႏိုငးေသာ attribute မ္ာ့ကို


ေလံလာရနး
 လကးရိြ ေလံလာခဲံရေသာ Project မြ Button ႏြစးခု၏ function မ္ာ့ကို ်ပငးဆငး်ခငး့်ဖငးံ View
အတျကး Button မြ interact လုပးေဆာငးႏိုငးေသာ လုပးေဆာငးခ္ကးမ္ာ့ကို ေလံလာရနး တို႕ကို
ကိုယးတိုငးေလံလာၾကညး႕သငးံပါသညး၈

ေနာကးလာမညး႕အခနး့တျငး Google API မ္ာ့၏အသဵု့်ပဳပဵုမ္ာ့ကိုေလံလာရပါမညး၈ GTalk ကဲံသို႕ေသာ


Application မ္ာ့ကိုလညး့ တညးေဆာကးေလံလာရပါမညး၈ ထို႕ေၾကာငးံ ေနာကးလာမညး႕အခနး့ကို ေသခ္ာ
စျာ ေလံလာ်ခငး့်ဖငးံ ကိုယးပိုငး application မ္ာ့တညးေဆာကးရာတျငး ေကာငး့မျနးေသာ အသိပညာ
ဗဟုသုြဓတို့ပျာ့ႏိုငးရနး ဟူေသာအခ္ကးကို ်ငငး့ဆနးႏိုငးမညးမဟုတးပါ၈

Try This

212 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 9
Using the Cell Phone’s GPS
Functionality

မ္ကးပျငးံစာေပ 213
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Using the Android location-based service APIs
- Obtaining coordinate data from the GPS hardware
- Changing your Activity’s look and feel with a RelativeLayout
- Using a MapView to plot your current location
- Using Google Maps to find your current location

ယခုအခနး့တျငး Android Location အေ်ခ်ပဳ API မ္ာ့ကိုေလံလာရမညး်ဖစးပါသညး၈ အကယး၍ Android


၏ အစျမး့သတၱိကိုအသဵု့်ပဳ၍ Global Positioning System (GPS) စနစးသဵု့ Application မ္ာ့ကိုေရ့သာ့
လိုပါက ယခုအခနး့ပါသငးခနး့စာမ္ာ့သညး အလျနးအသဵု့ွငးမညး်ဖစးပါသညး၈ သို႕ရာတျငး Phone ၏ Hard
ware သညး GPS စနစးကိုေထာကးပဵံရနးလိုအပးမညး်ဖစးပါသညး၈ မညးသို႕ဆိုေစ Android Location-Based
API မ္ာ့သညး ေရာကးရိြေနေသာ လကးရိြ Position မ္ာ့ကိုရြာေဖျ၍ Screen ေပၚတျငးတညးေနရာကို ေဖား်ပ
ေပ့ႏိုငးပါသညး၈ ယခုအခနး့၏ အဆဵု့သတးခါနီ့တျငး Cell Phone ေပၚတျငး လကးရိြတညးေနရာကို ေဖား်ပႏိုငး
ရနး Google Map မ္ာ့ကိုလညး့ အသဵု့်ပဳၾကညး႕ရပါမညး၈ ထို႕အ်ပငး Activity မ္ာ့ကို တညးေဆာကးရာတျင
ပိုမိုအဆငးံ်မငးံေသာ နညး့စနစးအသစးအခ္ိဳ႕ကိုလညး့ သငးၾကာ့ရမညး်ဖစးပါသညး၈ RelativeLayout
မ္ာ့ႏြငးံ Small Buttons မ္ာ့ကဲံသို႕ေသာ Resource မ္ာ့တညးေဆာကး်ခငး့်ဖငးံ ပိုမို၍ User-friendly
်ဖစးေစမညး်ဖစးၿပီ့ Android အတျကး Activity မ္ာ့ကိုပိုမိုအဆငးံ်မငးံစျာအသုဵု့်ပဳႏိုငးမညး်ဖစးပါသညး၈

ယခုအခနး့၏ ပထမဆဵု့အပိုငး့တျငး လကးရိြတညးေနရာကိုသိရိြႏိုငးေစမညး႕ Device ၏ GPS hardware


ကိုအသဵု့်ပဳ်ခငး့အေၾကာငး့မ္ာ့ကိုေလံလာရပါမညး၈ သို႕ရာတျငး ထိုအပိုငး့ကိုမေလံလာမီတျငး ယခုအခနး့
အတျကး Project အသစးတစးခုကိုတညးေဆာကးရဦ့မညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Eclipse အတျငး့ Project
အသစးတစးခုတညးေဆာကး၍ AndroidLBS ဟုအမညးေပ့ထာ့ရပါမညး၈

Using the Android Location-Based API


Android SDK တျငး မညးသညး႕ GPS hardware ႏြငးံမဆို Activity ႏြငးံပူ့တျဲလုပးေဆာငးေစႏိုငးေသာ API
တစးခုပါွငးပါသညး၈ ထို႕ေၾကာငးံ ယခုအခနး့တျငး အသဵု့်ပဳမညး႕ Device တျငး GPS Hardware ကို
ေထာကးပဵံထာ့သညးဟုယူဆပါမညး၈ ယခုအေန်ဖငးံ Application မ္ာ့ကို Software အေ်ခ်ပဳ Emulator
214 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

တျငးသာစမး့သပးေန်ခငး့်ဖစးေသာေၾကာငးံ အစစးအမြနး Device ႏြငးံကျဲ်ပာ့်ခာ့နာ့မႈရိြမညး်ဖစးပါသညး၈ ထို႕


ေၾကာငးံ GPS Hardware ကိုလညး့ Simulate ်ပဳလုပးထာ့်ခငး့ရိြမညးမဟုတးပါ၈ ထိုကဲံသို႕အ်ခငး့အရာတျင
Android သညး GPS hardware ကို simulate ်ပဳလုပးေပ့မညး႕ ဖိုငးတစးဖိုငးကို adb server တျငး
ေထာကးပဵံေပ့ထာ့ပါသညး၈ ထိုဖိုငးကို data/misc/location/<provider> တျငးထညး႕သျငး့ထာ့ပါသညး၈
ထိုေနရာတျငး <provider> သညး location information provider ကိုဆိုလို်ခငး့်ဖစးပါသညး၈ Android မြ
ေထာကးပဵံေပ့ေသာ Proivder ကို data/misc/location/gps ဟူ၍ ေတျ႕ရိြရပါလိမးံမညး၈

ကျဲ်ပာ့ေသာ Sensor လုပးေဆာငးမႈမ္ာ့ကို simulate ်ပဳလုပးရနးအတျကး မ္ာ့စျာေသာ Provider မ္ာ့ကို


ရရိြေစႏိုငးပါသညး၈ ထို႕ေၾကာငးံ test သို႕မဟုတး gps1 ဟုအမညးေပ့ထာ့ေသာ Provider တစးခုကို
ႏြစးသကးရာပဵုစဵ်ဖငးံ Create ်ပဳလုပးႏိုငးေစပါသညး၈

သကးဆိုငးရာ Provider ၏ Folder ထဲတျငး Android မြအသဵု့်ပဳေနေသာ နမူနာ Coordiante မ္ာ့်ဖငးံ


လုပးေဆာငးႏိုငးရနး ဖိုငးမ္ာ့စျာပါရိြႏိုငးပါသညး၈ Android Emulator ကိုအသဵု့်ပဳေသာအခါတျငး GPS style
coordinate မ္ာ့ကို သိမး့ဆညး့၇ ရယူရနးအတျကး ေအာကးေဖား်ပပါ ဖိုငးအမ္ိဳ့အစာ့မ္ာ့ကို အသဵု့်ပဳႏိုငး
ပါသညး၈ ဖိုငးအမ္ိဳ့အစာ့တစးခုစီတျငး Android Location-Based API သို႕ေထာကးပဵံႏိုငးရနးအတျကး ကျဲ်ပာ့
်ခာ့နာ့သညး႕ Format မ္ာ့စျာရိြပါသညး၈ ၁ငး့တို႕မြာ

 kml
 nmea
 track တို႕်ဖစးပါသညး၈

ထို႕ေၾကာငးံ အဆိုပါတစးဖိုငးခ္ငး့စီ၏ အလုပးလုပးေဆာငးပဵုမ္ာ့ႏြငးံကျဲ်ပာ့်ခာ့နာ့ခ္ကးမ္ာ့ကို ေလံလာၾကညး႕


သငးံပါသညး၈

Creating a kml File


.kml ဖိုငးဆိုသညးမြာ Keyhole Markup Language ဖိုငးတစးဖုိငး်ဖစးပါသညး၈ အဆိုပါဖိုငးမ္ာ့ကုိ Google
Earth မြ Devleop ်ပဳလုပးဖနးတီ့ခဲပ
ံ ါသညး၈ Android Location-Based API သညး အဆိုပါ .kml ဖိုငးကို

မ္ကးပျငးံစာေပ 215
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

GPS တစးခုအ်ဖစး simulate ်ပဳလုပးသညး႕အခါတျငး coordinate မ္ာ့အတျကး ချဲ်ခမး့စိတး်ဖာေစႏိုငးပါ


သညး၈

သတိ်ပဳရနး၈ အကယး၍ စာဖတးသူမ္ာ့တျငး Google Earth မရိြေသ့ပါက Google မြအခမဲံ Download ်ပဳ
လုပးရယူႏိုငးပါသညး၈ အကယး၍ Android Location Based API Activity မ္ာ့ကို Develop ်ပဳလုပးရနး
စဥး့စာ့ထာ့ပါက Google Earth ကို Install ်ပဳလုပးထာ့်ခငး့်ဖငးံ အခ္ိနးကုနးသကးသာေစႏိုငးပါသညး၈

Google Earth မြ .kml ဖိုငးတစးဖိုငးကိုတညးေဆာကးရနးအတျကး Google Earth ကိုဖျငးံၿပီ့ Location တစးခု


ကို ပဵုတျငး်ပထာ့သညး႕အတိုငး့ navigate လုပးယူပါ၈ ေအာကးေဖား်ပပါပဵုတျငး အေမရိကနး်ပညးေထာငးစုရ
Tampa, Florida ကုိ navigate ်ပဳလုပးထာ့ပဵု်ဖစးပါသညး၈

ထို႕ေနာကး File Menu မြ > Save As ထို႕မြ Choose KML ကိုေရျ့ခ္ယးပါ၈ ယခု ဥပမာတျငး Tampa, Flora
ေဒသကိုအေ်ခ်ပဳသညး႕ .kml ဖိုငးတစးဖိုငးကို တညးေဆာကးမညး်ဖစးပါသညး၈ ထိုအခါ ရရိြလာေသာ .kml

216 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ဖိုငးမြ Code မ္ာ့ကိုေအာကးတျငး်မငးေတျ႕ရမညး်ဖစးပါသညး၈ <coordinates> ဟူေသာ tag ကိုသတိထာ့ပါ


၁ငး့သညး Android Location Based API မြ ဖတးရြဳႏိုငးေစမညး႕ Location Coordinate လညး့်ဖစးပါသညး၈

<?xml version="1.0" encoding="UTF-8"?>


<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<name>Tampa, FL.kml</name>
<Styleid="default+icon=http://maps.google.com/mapfiles/kml/pal3/icon52.png">
<IconStyle>
<scale>1.1</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal3/icon52.png</href>
</Icon>
</IconStyle>
<LabelStyle>
<scale>1.1</scale>
</LabelStyle>
</Style>
<Styleid="default+icon=http://maps.google.com/mapfiles/kml/pal3/icon60.png">
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal3/icon60.png</href>
</Icon>
</IconStyle>
</Style>
<StyleMapid="default+nicon=http://maps.google.com/mapfiles/kml/pal3/
icon60.png+hicon=http://maps.google.com/mapfiles/kml/pal3/icon52.png">
<Pair>
<key>normal</key>
<styleUrl>#default+icon=http://maps.google.com/mapfiles/kml/pal3/
icon60.png</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#default+icon=http://maps.google.com/mapfiles/kml/pal3/
icon52.png</styleUrl>
</Pair>
</StyleMap>
<Placemark>
<name>Tampa, FL</name>
<open>1</open>
<address>Tampa, FL</address>
<LookAt>
<longitude>-82.451142</longitude>
<latitude>27.98146</latitude>
<altitude>0</altitude>
<range>38427.828125</range>
<tilt>0</tilt>
<heading>0</heading>
</LookAt>

<styleUrl>#default+nicon=http://maps.google.com/mapfiles/kml/pal3/
icon60.png+hicon=http://maps.google.com/mapfiles/kml/pal3/icon52.png</styleUrl>
<Point>
<coordinates>-82.451142,27.98146,0</coordinates>
</Point>

မ္ကးပျငးံစာေပ 217
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

</Placemark>
</Document>
</kml>

ကျဲ်ပာ့်ခာ့နာ့ေသာ Location မ္ာ့ကို simulate ်ပဳလုပးရနးအတျကးလညး့ Google Earth ကိုအသဵု့်ပဳ၍


ကိုယးပိုငး .kml ဖိုငးမ္ာ့ကိုတညးေဆာကးႏိုငးပါသညး၈ User ၏ Location အေပၚမူတညး၍ Activity ကို
တဵု႕်ပနးေစႏိုငးေသာ Activity တစးခုကိုတညးေဆာကးလိုေသာအခါတျငးအသဵု့ွငးေစႏိုငးပါသညး၈ ထို႕ေၾကာငးံ
.kml ဖိုငးမ္ာ့သညး GPS hardware ကို Simulating ်ပဳလုပးရနးအတျကး အလျနးအာ့သာခ္ကး်ဖစးေစေသာ
ဖိုငးမ္ာ့်ဖစးၾကပါသညး၈

What Is a track file?


gps Folder အတျငး့မြ Android မြေထာကးပဵံေပ့ႏိုငးေသာ ဖိုငးတစးခုမြာ .nmea (National Marine
Electronics Association) ဖိုငးပငး်ဖစးပါသညး၈ အဆိုပါ .nmea ဖိုငးကို မ္ာ့စျာေသာ GPS product မ္ာ့မြ
Output ထုတးေပ့ႏိုငးပါသညး၈ အဆိုပါ File မ္ာ့သညး Common Format အမ္ိဳ့အစာ့်ဖစးၿပီ့ Coordinate
မ္ာ့ႏြငးံ trips သို႕မဟုတး track မ္ာ့ပါွငးေသာ elevation မ္ာ့ပါွငးေလံရိြပါသညး၈ အဆိုပါ ဖိုငးမ္ာ့ကို
Windows သို႕မဟုတး Linux OS အတျငး့မြ ရယူ်ခငး့၇ ဖျငးံေပ့်ခငး့စသညး႕အခ္ကးမ္ာ့ကို ေအာကးလာမညး႕
အပိုငး့တျငးေဖား်ပေပ့ထာ့ပါသညး၈

Getting the nmea File in Windows


nmea ဖိုငးကို Android မြ ေထာကးပဵံေပ့ၿပီ့ trip အတိုမ္ာ့ကိုပါွငးေစပါသညး၈ထို႕ေၾကာငးံ nmea file ကို
ေလံလာၾကညး႕ၾကပါမညး၈ Server မြ Desktop ေပၚသို႕ file မ္ာ့ကိုကူ့ယူေစမညး်ဖစးသညး႕အတျကး adb
tool ၏ Parameter တစးခု်ဖစးေသာ pull ်ဖငးံတျဲဖကး၍ အသဵု့်ပဳရပါမညး၈ ေအာကးေဖား်ပပါ Command
ကိုေလံလာၾကညး႕ပါ၈

adb pull <remote file><local file>

ေအာကးေဖား်ပပါပဵုအရ adb pull ဟူေသာ Command ကိုအသဵု့်ပဳ၍ nmea ဖိုငးကိုရယူထာ့ပဵုကိုေတျ႕ရ


မညး်ဖစးပါသညး၈

218 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အကယး၍ အထကးပါ Command ကိုေအာငး်မငးစျာေဆာငးရျကးႏိုငးခဲံလြ္ငး ေအာကးေဖား်ပပါပဵုတျငး်ပထာ့


သညး႕အတိုငး့ Download ်ပဳလုပးထာ့ေသာဖိုငး၏ Size ကိုေဖား်ပေပ့ေနသညးကိုေတျ႕ရပါမညး၈

ထို႕ေနာကး C:\Android ဟူေသာ Folder ကိုဖျငးံလိုကးေသာအခါတျငး adb pull ဟူေသာ Tool မြ ရယူ
ေပ့ထာ့ေသာ nmea ဖိုငးကို်မငးေတျ႕ရေစမညး်ဖစးပါသညး၈ ေအာကးေဖား်ပပါပဵုတျငး ေဖား်ပေပ့ထာ့ပါသညး၈

အဆိုပါ ရရိြလာေသာ nmea ဖိုငးကို Notepad အတျငး့တျငးဖျငးံၾကညး႕ရပါမညး၈ ထိုသို႕ဖျငးံ၍ ထိုဖိုငးအတျငး့


မြ Content မ္ာ့ကိုစစးေဆ့ရာတျငး ေအာကးေဖား်ပပါပဵုအတိုငး့ Coordinate data မ္ာ့ကို row အသျငး်ဖငးံ
မ္ာ့စျာေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 219
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Getting the nmea File in Linux


အကယး၍ Android Development ်ပဳလုပးေသာအခါ Linux ကိုသာအသဵု့်ပဳ်ခငး့်ဖစးပါက adb server
ကိွ
ု ငးေရာကးေစႏိုငးရနး terminal တစးခုကိုစတငးေပ့ရပါမညး၈ Linux အတျငး့တျငး nmea ဖိုငးကို ရယူ်ခငး့၇
်ပငးဆငး်ခငး့ႏြငးံသကးဆိုငးေသာ လုပးေဆာငးခ္ကးအဆငးံမ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

(ေအာကးတင
ျ းေဖား်ပထာ့ေသာ ပဵုမ္ာ့သညး Fedora Linux ကိုအသဵု့်ပဳ၍ ရရိြထာ့ေသာပဵုမ္ာ့်ဖစးပါသညး)
220 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ပထမဆဵု့်ပဳလုပးရမညး႕အဆငးံမြာ Terminal session တစးခုကိုေခၚယူရနး်ဖစးေသာေၾကာငးံ Applications>


Systems Tools>Terminal သို႕ေရျ့ခ္ယးၿပီ့ Terminal အသစးတစးခုဖျငးံေပ့ရပါမညး၈

ထို႕ေနာကး adb pull ဟူေသာ Command ကိုအသဵု့်ပဳ၍ Android Folder အတျငး့သုိ႕ nmea ဖိုငးကို
ထညး႕သျငး့ေပ့ရပါမညး၈

adb pull data/misc/location/gps/nmea Android/

Linux ႏြငးံ Windows သညး Directory Structure မတူေသာေၾကာငးံ Command ပဵုစဵလညး့ အနညး့ငယး
ကျာ်ခာ့မႈရိြမညး်ဖစးပါသညး၈

ထို႕ေနာကးအထကးပါ Command ကို Terminal တျငး execute ်ပဳလုပးၿပီ့ေနာကးတျငး ေအာကးတျငးေဖား်ပ


ထာ့သညး႕ပဵုအတိုငး့ေတျ႕်မငးရပါလိမးံမညး၈

ထို႕ေနာကး ls ဟူေသာ Command ကိုအသဵု့်ပဳ၍ Android Folder အတျငး့မြ ဖိုငးမ္ာ့ကို List လုပးေခၚယူ
ၾကညး႕ရပါမညး၈ ထိုအခါ ေအာကးပါပဵုအတိုငး့ ်မငးေတျ႕ရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 221
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး အဆိုပါ nmea ဖိုငးကို Fedora GUI အတျငး့ဖျငးံၾကညး႕ၿပီ့ System Text Editor ကိုအသဵု့်ပဳ ၍
အဆိုပါ ဖိုငးကိုဖျငးံၾကညး႕ထာ့ပဵုကိုေအာကးတျငးေတျ႕်မငးႏိုငးပါသညး၈

အဆိုပါ ဖိုငးကို ယခငးအသဵု့်ပဳခဲံၿပီ့်ဖစးေသာ Linux Command ်ဖစးသညး႕ vi ဟူေသာ Command ကို


အသဵု့်ပဳ၍ ဖျငးံၾကညး႕်ခငး့ ဖတးရြဳ်ခငး့ႏြငးံ ်ပငးဆငး်ခငး့မ္ာ့ကို Command Line မြအသဵု့်ပဳႏိုငးပါသညး၈

222 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခုအခါတျငး အဆိုပါ nmea ဖိုငးကို စစးေဆ့ၿပီ့ GPS device တျငး နညး့လမး့အမ္ိဳ့မ္ိဳ့်ဖငးံ Simulate ်ပဳ
လုပး်ခငး့တို႕ပါ ေဖား်ပခဲံၿပီ့်ဖစးေသာေၾကာငးံ Android Location Based API ကိုအသဵု့်ပဳ၍ အလုပးလုပး
ေဆာငးႏိုငးေသာ Activity တစးခုကိုတညးေဆာကးႏိုငးၿပီ်ဖစးပါသညး၈

Reading the GPS with the Android Location-Based


API
ယခုအခနး့မြ က္နးရိြေသာသငးခနး့စာမ္ာ့သညး AndroidLBS ဟူေသာ Activity တညးေဆာကး်ခငး့ႏြငးံ ဆိုငး
ေသာအခ္ကးမ္ာ့သာလြ္ငး ်ဖစးပါသညး၈ အဆိုပါ Activity ကို Server ေပၚတျငး nmea ဖိုငးမြတစးဆငးံ အသဵု့
်ပဳသူ၏ တညးေနရာကိုရရိြေစႏိုငးေသာ လုပးေဆာငးခ္ကးကိုလုပးေဆာငးေပ့သညး႕ Activity လညး့်ဖစးပါ
သညး၈ ထို႕ေၾကာငးံ Activity ၏ လုပးေဆာငးခ္ကးမြာ အေတားအတနးရို့ရြငး့သညးဟုဆိုႏင
ို းမညး ်ဖစးပါသညး၈

ထို႕ေၾကာငးံ ရို့ရြငး့သညး႕ Activity တစးခုတညးေဆာကး၍ User ၏လကးရိြ GPS Location ကို ရယူၾကညး႕
ၾကမညး်ဖစးပါသညး၈ ထို႕အ်ပငး ေလာငးဂ္ီက္ဴ ႏြငးံ လဒးဂ္ီက္ဴ Coordinate အတျဲကိုလညး့ Location တစးခု
အ်ဖစး ေဖား်ပေပ့ေစႏိုငးမညး်ဖစးသညး၈ ထိုသို႕်ပဳလုပး်ခငး့်ဖငးံ Android Location-Based API ကိုေကာငး့
မျနးစျာအသဵု့်ပဳတတးသျာ့ေစမညး်ဖစးၿပီ့ ထို API ၏ function မ္ာ့ကိုသာ သိရိြနာ့လညးသျာ့ေစမညး ်ဖစး
ပါသညး၈

Creating the AndroidLBS Activity


ရို့ရြငး့ေသာ Activity တစးခုကိုတညးေဆာကးေသာအခါတျငး လိုအပးသညး႕ လုပးေဆာငးခ္ကးအဆငးံမ္ာ့ ကို
ေအာကးတျငးေဖား်ပထာ့ပါသညး၈

 Permissions Level ကိုသတးမြတးခ္ိနးညိြ်ခငး့


 Activity ၏ Layout ကိုတညးေဆာကး်ခငး့
 Activity ကိုေမာငး့ႏြငးႏိုငးေစရနး Code မ္ာ့ေရ့သာ့်ခငး့
 Activity ကိုေမာငး့ႏြငး်ခငး့တို႕်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 223
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Adjusting the Permissions Level

Android Location Based API ႏြငးံအလုပးလုပးေဆာငးရာတျငး လုပးေဆာငးရမညး႕ပထမဆဵု့အဆငးံမြာ


Permission level ကိုသတးမြတးေပ့ရနးပငး်ဖစးပါသညး၈ Android Location Based API ကိုယးတိုငးတျင
သီ့သနး႕ Permission ကိုမလိုအပးေသားလညး့ GPS အတျငး့မြ Location Information မ္ာ့ရရိြေစရနး
Android Location-Based API ကိုအသဵု့်ပဳရသညး႕အတျကး Permission ကိုသတးမြတးေပ့ရ်ခငး့ ်ဖစးပါ
သညး၈

Eclipse မြ Permission ကို သတးမြတးရနး နညး့လမး့ႏြစးခုရိြပါသညး၈ ပထမတစးခုမြာ Android Manifest


Permission Wizard ကိုအသဵု့်ပဳရ်ခငး့်ဖစးၿပီ့ အခနး့ (၄)တျငးေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈ Eclipse အတျငး့မြ
AndroidManifest.xml ကိုဖျငးံၿပီ့ Android Manifest Overview Windows ကို ထပးဖျငးံပါ၈ Permission
ဟူေသာ Link ကို Click ႏိြပးၿပီ့ အခနး့ (၄) တျငးေဖား်ပထာ့သညး႕နညး့လမး့အတိုငး့ပငး ACCESS_GPS ႏြငးံ
ACCESS_LOCATION ကို Permission အ်ဖစး သတးမြတးရပါမညး၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုတျင
ၾကညး႕ရြဳႏိုငးပါသညး၈

224 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Permission Value မ္ာ့ကိုသတးမြတးရနး ေနာကးနညး့လမး့တစးခုမြာ AndroidManifest.xml ဖိုငးကုိ


Manually ်ပငးဆငး်ခငး့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ ေအာကးပါ Code မ္ာ့ကို AndroidManifest.xml ဖိုငး
အတျငး့တျငး ထညး႕သျငး့ေပ့ထာ့ရပါမညး၈

<uses-permission android:name="android.permission.ACCESS_GPS">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_LOCATION">
</uses-permission>

အသဵု့်ပဳရမညး႕ပဵုစဵမြာ <uses-permission> ဟူေသာ tag အတျငး့တျငး permission name ကိုထညး႕


သျငး့ရနး်ဖစးပါသညး၈

ထို႕ေနာကး Permission မ္ာ့ထညး႕သျငး့ၿပီ့ေနာကးတျငး AndroidManifest.xml ဖိုငးမြ Code မ္ာ့ကို


ေအာကးေဖား်ပပါအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈ ်မငးေတျ႕ေနၿပီ့က္ ပဵုစဵအတိုငး့ပငး်ဖစးပါသညး၈ ထိုက
ေၾကာငးံ Activity တစးခုတျငး Intent Filter တစးခုႏြငးံ permission ႏြစးခုတို႕ကိုအသဵု့်ပဳရပါမညး၈

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


<manifest xmlns:android=http://schemas.android.com/apk/res/android
package="android_programmers_guide.AndroidLBS">
<application android:icon="@drawable/icon">
<activity android:name=".AndroidLBS"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_GPS">
</uses-permission><uses-permission
android:name="android.permission.ACCESS_LOCATION">
</uses-permission></manifest>

Creating your layout

Layout ကို Design စတငး်ပဳလုပးရနးအတျကး main.xml ဖိုငးကိုဖျငးံပါ၈ Button တစးခုႏြငးံ TextView


ေလ့ခုကို Layout တျငးေပါငး့ထညး႕ေပ့ရပါမညး၈ Button ကို GPS မြ Information ကိုေခၚယူရနးႏြငးံ Text
View မ္ာ့တျငးေဖား်ပေပ့ရနးအတျကး အသဵု့်ပဳရပါမညး၈ Button ကို Button Layout တစးခုတညးေဆာကး၍
Screen ၏အေပၚနာ့ေလာကးတျငးထာ့မညး်ဖစးကာ Where Am I ဟူေသာ စာသာ့ကိုေပၚေစလိုသညး႕
အတျကးေၾကာငးံ ေအာကးပါအတိုငး့တညးေဆာကးရမညး ်ဖစးသညး၈

မ္ကးပျငးံစာေပ 225
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<Button
android:id="@+id/gpsButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Where Am I"
/>

ထို႕ေနာကး TextView ေလ့ခုကိုတညးေဆာကးရပါမညး၈ အဆိုပါ TextView မ္ာ့ကို Layout အတျငး့တျငး


Arrange ်ပဳလုပး၍ TextView ႏြစးခုကို ေနာကး TextView ႏြစးခု၏ အေပၚဘကးနာ့တျငးထာ့ေပ့ရပါမညး၈
နြစးခုကို အ်ခာ့ႏြစးခု၏ Label အ်ဖစးအသဵု့ခ္ရမညး်ဖစးပါသညး၈ ထိုသို႕လုပးေဆာငးရနးအတျကး ႏြစးခုထကး
ပိုမိုေသာ LinearLayout ကို implement ်ပဳလုပးရနးလိုအပးမညး်ဖစးပါသညး၈

main.xml ဖိုငးအတျငး့တျငးပါွငးေသာ အာ့လဵု့ေသာ Element မ္ာ့သညး LinearLayout tag တစးခုအ


တျငး့တျငးတညးရိြၾကပါသညး၈ အဆိုပါ tag သညး တိက္ေသာ rule မ္ာ့်ဖငးံ element မ္ာ့ကို လႊမး့ၿခဵဳထာ့
ပါသညး၈ LinearLayout မ္ာ့တျငး Elements မ္ာ့ကို Vertical orientation အရ်ဖစးေစ၇ Horizontal
orientation အရ်ဖစးေစ တစးခုၿပီ့မြတစးခုတနး့စီေစပါသညး၈

LinearLayout ၏ Orientation ကို android:orientation ဟူေသာ attribute မြ ထိနး့ခ္ဳပးေပ့ပါသညး၈


အကယး၍ အဆိုပါ attribute ကိုသတးမြတးထာ့်ခငး့မရိြပါက ရိြရငး့စျဲအသဵု့်ပဳမညး႕ Layout မြာ horizontal
layot ပငး်ဖစးပါသညး၈ ေအာကးေဖား်ပပါပဵုတျငး Vertical LinearLayout တစးခု၏ အလုပးလုပးေဆာငးပဵုက
ေဖား်ပေပ့ထာ့ပါသညး၈ ပဵုပါအရ ၁ငး့တို႕သညး slot မ္ာ့သို႕မဟုတး စငး (အကနး႕)မ္ာ့်ဖစးသညးဟုမြတးယူပါ
Element မ္ာ့ကို အဆိုပါအကနး႕မ္ာ့ေပၚတျငးတနး့စီထညး႕သျငး့ၿပီ့ Screen တျငးေဖား်ပေပ့ႏိုငးေစပါသညး၈
သို႕ရာတျငး အကယး၍ Item အခ္ိဳ႕ကို တူညီေသာ အကနး႕တစးခုတျငးပငး တနး့စီေဖား်ပေစလိုပါက အဆိုပါ
အကနး႕တျငးပငး Horizontal LinearLayout ကိုအသဵု့်ပဳေနရာခ္ထာ့ရနးလိုအပးပါမညး၈ အဆိုပါအယူအဆ
ကိုေအာကးတျငးေဖား်ပထာ့ေသာ ဒုတိယပဵုတျငးေလံလာႏိုငးပါသညး၈

226 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Element မ္ာ့ကို တစးခုၿပီ့တစးခု ေဘ့တိုကးထညး႕သျငး့ႏိုငးရဵုသာမက အထကးေအာကးအ်ဖစးလညး့ တစးခု


ၿပီ့တစးခုထညး႕သျငး့ႏိုငးပါသညး၈ ထို႕ေၾကာငးံ Button ၏ေအာကးတျငး Horizontal LinearLayout တစးခုကို
ထညး႕သျငး့ၿပီ့ TextView ႏြစးခုကိုတနး့စီၾကညး႕ၾကပါမညး၈

<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/latLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude: "
/>

မ္ကးပျငးံစာေပ 227
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<TextView
android:id="@+id/latText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>

အဆိုပါ TextView ႏြစးခုကို Lable အ်ဖစးအသဵု့်ပဳၿပီ့ GPS မြေပ့ပို႕မညး႕ လဒးဂ္ီက္ဴတနးဖို့ကို ေဖား်ပေပ့ေစ


မညး်ဖစးသညး၈ ထို႕ေနာကး အ်ခာ့ေသာ Horizontal Layout မြ က္နးရိြေနေသာ TextViews ႏြစးခုကို
ေအာကးပါ Code မ္ာ့်ဖငးံ ထညး႕သျငး့ရပါမညး၈

<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/lngLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude: "
/>
<TextView
android:id="@+id/lngText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>

ယခုအခါတျငး Activity အတျကးေကာငး့မျနးေသာ Layout ကိုသတးမြတးထာ့ၿပီ့်ဖစးပါသညး၈ ထို႕ေနာကး


ၿပီ့ဆဵု့သျာ့ေသာ main.xml ဖိုငးမြ code မ္ာ့ကိုေအာကးပါအတိုငး့ေတျ႕ရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/gpsButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Where Am I"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"

android:layout_height="wrap_content"
>
<TextView
android:id="@+id/latLabel"

228 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude: "
/>
<TextView
android:id="@+id/latText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/lngLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude: "
/>
<TextView
android:id="@+id/lngText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>

Writing the Code to Run Your Activity

Layout ကိုတညးေဆာကးၿပီ့ေနာကး Activity ကိုေမာငး့ႏြငးရနးအတျကး Code ကိုစတငးေရ့သာ့ႏိုငးၿပီ ်ဖစး


ပါသညး၈ Button သညး User ၏ လကးရိြ Location ကို GPS မြေခၚယူရနးလိုအပးပါသညး၈ ထို႕အ်ပငး
အဆိုပါ Information ရရိြၿပီ့လြ္ငး TextView မ္ာ့သို႕လညး့ သကးဆိုငးရာ ေလာငးဂ္ီက္ဴႏြငးံ လဒးတီက္ဴက
ေပ့ပို႕ေပ့ရပါဦ့မညး၈

ထို႕ေၾကာငးံေရြ့ဦ့စျာ statement မ္ာ့ကို import ်ပဳလုပးေပ့ရပါဦ့မညး၈ Activity ကိုေကာငး့မျနးစျာလုပ


ေဆာငးႏိုငးရနးအတျကး View အတျကးအသဵု့်ပဳရမညး႕ package ေလ့ခုရိြပါသညး၈ ၁ငး့တို႕မြာေအာကးပါ
အတိုငး့ပငး ်ဖစးပါသညး၈

import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;

ထို႕အ်ပငး Android Location-Based API အတျကး တစးခုထပးမဵလိုအပးပါမညး၈

import android.location.LocationManager;

မ္ကးပျငးံစာေပ 229
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး Button အတျကး Code မ္ာ့ေရ့သာ့ရပါမညး၈ GPS အတျကး လကးရိြ Coordinate


Information ကိုရရိြေစ်ခငး့သညး ပနး့တိုငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Button ကို ဖနးတီ့တညးေဆာကးရန
လိုအပးၿပီ့ main.xml မြ၁ငး့၏ Layout ကို load ်ပဳလုပးေပ့ရပါမညး၈ ထို႕ေနာကး loadCoords() ဟူေသာ
function ကို onClick ဟူေသာ Event တျငး set up ်ပဳလုပးေပ့ရပါမညး၈

final Button gpsButton = (Button) findViewById(R.id.gpsButton);


gpsButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
LoadCoords();
}});

ထို႕ေနာကး Activity ကိုတညးေဆာကးရာတျငးလုပးေဆာငးရမညး႕ေနာကးဆဵု့အဆငးံမြာ LoadCoords ()


ဟူေသာ Function တျငး Code မ္ာ့ထညး႕်ဖညး႕ေပ့ရနး်ဖစးသညး၈ Coordinate မ္ာ့ကိုေဖား်ပေပ့မညး႕
TextView မ္ာ့ကိုလညး့ ေအာကးပါအတိုငး့တညးေဆာကးေပ့ရပါမညး၈

TextView latText = (TextView) findViewById(R.id.latText);


TextView lngText = (TextView) findViewById(R.id.lngText);

ထို႕ေနာကး LocationManager တစးခုတညးေဆာကးၿပီ့ Coordinate တနးဖို့မ္ာ့ကို ရယူရပါမညး၈ ၁ငး့


သညးအေရ့ႀကီ့ဆဵု့အပိုငး့်ဖစးၿပီ့ LocationManager မြ Context တစးခုကို ်ဖတးသနး့ေစရမညး်ဖစးသညး႕
အတျကး LOCATION_SERVICE ကိုအသဵု့်ပဳရပါမညး၈

LocationManager myManager =
(LocationManager)getSystemService(Context.LOCATION_SERVICE);

myManager မြ Coordinate မ္ာ့ကို pull ်ပဳလုပးရနးအတျကး getCurrentLocation() ဟူေသာ method


ကိုအသဵု့်ပဳရပါမညး၈ အဆိုပါ method တျငး API မြ ဆျဲယူထာ့သာ Coordinate မ္ာ့ကိုအသဵု့်ပဳ၍
location ကုိေဖား်ပေပ့ေစသညး႕ parameter တစးခု်ဖစးသညး႕ provider တစးခုကို လိုအပးပါမညး၈ ယခု
ကိစၥတျငး Android မြ ယခုအခနး့တျငးေလံလာခဲံၿပီ့်ဖစးေသာ nmea ဖိုငးပါွငးသညး႕ mock location gps
တစးခုကို ေထာကးပဵံေပ့ေသာေၾကာငးံ ေအာကးပါ Code ႏြစးခုကိုေရ့သာ့ရပါမညး၈

Double latPoint = myManager.getCurrentLocation("gps").getLatitude();


Double lngPoint = myManager.getCurrentLocation("gps").getLongitude();

ေနာကးဆဵု့တျငး Double Value အသစးမ္ာ့ကို အသဵု့်ပဳ၍ ၁ငး့တို႕ကို TextView မ္ာ့တျငး်ဖတးသနး့ေစရပါ


မညး၈

230 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

latText.setText(latPoint.toString());
lngText.setText(lngPoint.toString());

ထို႕ေနာကး ေနာကးဆဵု့အာ့လဵု့်ပငးဆငးၿပီ့်ဖစးေသာ .java ဖိုငးအတျငး့မြ Code မ္ာ့ကိုေအာကးပါအတိုငး့


ေတျ႕ရိြရမညး်ဖစးပါသညး၈

package android_programmers_guide.AndroidLBS;

import android.app.Activity;
import android.os.Bundle;
import android.location.LocationManager;
import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;

public class AndroidLBS extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
final Button gpsButton = (Button) findViewById(R.id.gpsButton);

gpsButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
LoadCoords();
}});
}

public void LoadCoords(){


TextView latText = (TextView) findViewById(R.id.latText);
TextView lngText = (TextView) findViewById(R.id.lngText);
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Double latPoint = myManager.getCurrentLocation("gps").getLatitude();
Double lngPoint = myManager.getCurrentLocation("gps").getLongitude();

latText.setText(latPoint.toString());
lngText.setText(lngPoint.toString());
}
}

Running the Activity

အထကးပါ Activity ကို Android Emulator တျငးေမာငး့ႏြငးၾကညး႕ပါ၈ Activity သညးေအာကးေဖား်ပပါ


ပဵုအတိုငး့ ပျငးံလာသညးကိုေတျ႕ရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 231
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထုိ႕ေနာကး Where Am I ဟူေသာ ခလုတးကိုႏိြပးၾကညး႕ပါ၈ ထိုအခါေအာကးေဖား်ပပါပဵုအတိုငး့ Coordinate


မ္ာ့ကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

232 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Passing Coordinates to Google Maps


ယခုအပိုငး့တျငး ယခငးအပိုငး့တျငးတညးေဆာကးခဲံၿပီ့်ဖစးေသာ Activity ကိုသာဆကးလကးေလံလာရပါမညး၈
အဓိက်ပငးဆငးမညး႕အပိုငး့သညး AndroidLBS Activity မြ Coordinate မ္ာ့ကို Google Map တျငး်ဖတး
သနး့ခိုငး့မညး်ဖစးပါသညး၈ Google Map မ္ာ့ကိုအသဵု့်ပဳ၍ User ၏ လကးရိြ တညးေနရာကိုေဖား်ပခိုငး့မည
်ဖစးပါသညး၈ ထို႕ေၾကာငးံ အေ်ပာငး့အလဲအ်ဖစး main.xml ဖိုငးတျငး MapView တစးခုထညး႕သျငး့ေပ့ရပါ
မညး၈ ယခုအသဵု့်ပဳေနသညး႕ Android SDK တျငး MapView ကို generic View အ်ဖစးသတးမြတးထာ့ပါ
သညး၈ ေနာကးဆဵု့ထုတး SDK မ္ာ့တျငး MapView ဟူ၍သာအသဵု့်ပဳႏိုငးမညး်ဖစးပါသညး၈

<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

ထို႕ေနာကး main.xml ဖိုငးမြ Code အ်ပညး႕အစဵုကိုေအာကးေဖား်ပပါအတိုငး့ေတျ႕ရိြရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/gpsButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Where Am I"
/>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/latLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude: "
/>
<TextView
android:id="@+id/latText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>

မ္ကးပျငးံစာေပ 233
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<TextView
android:id="@+id/lngLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude: "
/>
<TextView
android:id="@+id/lngText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>

<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

Activity အတျငး့တျငး MapView ကိုထညး႕သျငး့ထာ့ၿပီ့်ဖစးသညး႕အတျကး Class ကိုအေ်ပာငး့အလဲ်ပဳလုပ


ရနးလိုအပးမညး်ဖစးပါသညး၈ ေလာေလာဆယးတျငး main Class ကို်ဖနး႕ထုတးပါ၈ သို႕ရာတျငး Google
MapView ်ဖငးံေကာငး့မျနးစျာအလုပးလုပးေဆာငးႏိုငးရနး MapActivity ကို extend ်ပဳလုပးရပါမညး၈ ထို႕
ေၾကာငးံ MapActivity package ကို import ်ပဳလုပးထညး႕သျငး့ရနးလိုအပးၿပီ့ Activity ၏ package မ္ာ့ကို
ေအာကးေဖား်ပပါ package မ္ာ့်ဖငးံ အစာ့ထို့ import ်ပဳလုပးေပ့ရပါမညး၈

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import com.google.android.maps.MapController;

Point package ကို map coordinate မ္ာ့ပါွငးေသာ point value မ္ာ့အ်ဖစး အသဵု့်ပဳရပါလိမးံမညး၈
အဆိုပါ map coordinate မ္ာ့သညး လကးရိြတညးေနရာ point ကို map ၏ အလယးဗဟို Center သို႕
ေ်ပာငး့ေရႊ႕ေပ့ရနးအသဵု့်ပဳပါသညး၈ အဆိုပါ package ႏြစးခုသညး MapView ကိုအသဵု့်ပဳရနးအတျကး မရိြ
မ်ဖစး package မ္ာ့်ဖစးပါသညး၈

ထို႕ေနာကး map ကို establish ်ပဳလုပးရနးႏြငးံ Coordinate မ္ာ့ကို Pass ်ပဳလုပးႏင


ို းမညး႕ Code မ္ာ့ကို
ထညး႕သျငး့ရနးအဆငးံသငးံ်ဖစးေနၿပီ်ဖစးသညး၈ ထို႕ေၾကာငးံေရြ့သီ့စျာ MapView တစးခုကို setup ်ပဳလုပး၍
main.xml ႏြငးံ assign ်ပဳလုပးေပ့ရပါလိမးံမညး၈

MapView myMap = (MapView) findViewById(R.id.myMap);

234 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး map ကို establish ်ပဳလုပးရနးႏြငးံ Coordinate မ္ာ့ကို Pass ်ပဳလုပးႏိုငးမညး႕ Code မ္ာ့ကို
ထညး႕သျငး့ရနးအဆငးံသငးံ်ဖစးေနၿပီ်ဖစးသညး၈ ထို႕ေၾကာငးံေရြ့သီ့စျာ MapView တစးခုကို setup ်ပဳလုပး၍
main.xml ႏြငးံ assign ်ပဳလုပးေပ့ရပါလိမးံမညး၈ ထို႕ေနာကး Point တစးခုကို setup ်ပဳလုပးၿပီ့ အဆိုပါ
point တျငး GPS မြ ရယူထာ့ေသာ latPoint ႏြငးံ IngPoint တနးဖို့မ္ာ့ကို assign ်ပဳလုပးေပ့ရပါမညး၈

Point myLocation = new Point(latPoint.intValue(),lngPoint.intValue());

ထို႕ေနာကး map ကို establish ်ပဳလုပးရနးႏြငးံ Coordinate မ္ာ့ကို Pass ်ပဳလုပးႏိုငးမညး႕ Code မ္ာ့ကို
ထညး႕သျငး့ရနးအဆငးံသငးံ်ဖစးေနၿပီ်ဖစးသညး၈ ထို႕ေၾကာငးံေရြ့သီ့စျာ MapView တစးခုကို setup ်ပဳလုပး၍
main.xml ႏြငးံ assign ်ပဳလုပးေပ့ရပါလိမးံမညး၈ ထို႕ေနာကး Point တစးခုကို setup ်ပဳလုပးၿပီ့ အဆိုပါ
point တျငး GPS မြ ရယူထာ့ေသာ latPoint ႏြငးံ IngPoint တနးဖို့မ္ာ့ကို assign ်ပဳလုပးေပ့ရပါမညး၈

ထို႕ေနာကး Google Map မြ Location တစးခုအတျကး သတးမြတးထာ့ေသာ Point တစးခုကို Focus ်ပဳလုပး
ေစႏိုငးမညး႕ MapControllerကုိတညးေဆာကးႏိုငးၿပီ်ဖစးသညး၈ ထို႕ေၾကာငးံ getController() ဟူေသာ
method ကို အသဵု့်ပဳ၍ MapView မြ သတးမြတးထာ့ေသာ Map တျငး Controller တစးခုကို Establish
်ပဳလုပးရပါမညး၈

MapController myMapController = myMap.getController();

ထို႕ေနာကး Google Map မြ Location တစးခုအတျကး သတးမြတးထာ့ေသာ Point တစးခုကို Focus ်ပဳလုပး
ေစႏိုငးမညး႕ MapControllerကုိတညးေဆာကးႏိုငးၿပီ်ဖစးသညး၈ ထို႕ေၾကာငးံ getController() ဟူေသာ
method ကို အသဵု့်ပဳ၍ MapView မြ သတးမြတးထာ့ေသာ Map တျငး Controller တစးခုကို Establish
်ပဳလုပးရပါမညး၈

ေနာကးဆဵု့်ပဳလုပးရမညး႕အခ္ကးတစးခုမြာ Location ကုိ Map တျငးေရႊ႕ယူရနးအတျကး Controller ကိုအသဵု့


်ပဳရနး်ဖစးသညး၈ (Map ေပၚတျငး ရြငး့ရြငး့လငး့လငး့ေတျ႕်မငးရေစရနး Zoom ကို 9 ဟုထာ့ေပ့သငးံပါသညး)

myMapController.centerMapTo(myLocation, false);
myMapController.zoomTo(9);

ထို႕ေနာကး Google Maps ကို utilitze ်ပဳလုပးရနး လိုအပးေသာ Code မ္ာ့ကို ေရ့သာ့ၿပီ့စီ့ၿပီ်ဖစးသညး၈
ထို႕ေၾကာငးံ Class မြ Code အ်ပညး႕အစဵုကိုေအာကးပါအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 235
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

package android_programmers_guide.AndroidLBS;

import android.os.Bundle;
import android.location.LocationManager;
import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import com.google.android.maps.MapController;

public class AndroidLBS extends MapActivity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

final Button gpsButton = (Button) findViewById(R.id.gpsButton);


gpsButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
LoadProviders();
}});
}
public void LoadProviders(){
TextView latText = (TextView) findViewById(R.id.latText);
TextView lngText = (TextView) findViewById(R.id.lngText);
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);

Double latPoint =
myManager.getCurrentLocation("gps").getLatitude()*1E6;
Double lngPoint =
myManager.getCurrentLocation("gps").getLongitude()*1E6;

latText.setText(latPoint.toString());
lngText.setText(lngPoint.toString());

MapView myMap = (MapView) findViewById(R.id.myMap);


Point myLocation = new
Point(latPoint.intValue(),lngPoint.intValue());

MapController myMapController = myMap.getController();


myMapController.centerMapTo(myLocation, false);
myMapController.zoomTo(9);
}
}

ထို႕ေနာကး Emulator အတျငး့တျငး Activity ကို Run ၾကညး႕ပါ၈ ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတုိငး့


ပငး Activity သညး Blank map အ်ဖစးဖျငးံေပ့သညးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

236 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Where Am I ဟူေသာ Button ကို Click ႏိြပးႀကညး႕ပါ၈ ေပၚလာမညး႕ Output ကိုေအာကးတျငးေဖား်ပ ထာ့
သညး႕ပဵုအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

Adding Zoom Controls


ယခုအခနး့၏ ေနာကးဆဵု့ေလံက္ငးံခနး့တျငး AndroidLBS ဟူေသာ Activity တျငး Button ႏြစးခုကို ထပးမဵ
ထညး႕သျငး့ၾကညး႕ပါမညး၈ အဆိုပါ Button မ္ာ့ကို Google ၏ MapView ကို Zoom in ႏြငးံ Zoom Out
်ပဳလုပးရနးအတျကး ထိနး့ခ္ဳပး အသဵု့်ပဳၾကညး႕မညး်ဖစးပါသညး၈ main.xml ဖိုငးအတျက RelativeLayout

မ္ကးပျငးံစာေပ 237
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ဟုေခၚဆိုေသာ Layout အမ္ိဳ့အစာ့သစးတစးခုကို မိတးဆကးေပ့မညး်ဖစးၿပီ့ အေ်ပာငး့အလဲအနညး့ငယ


ကိုလညး့ ်ပဳလုပးေပ့ရပါမညး၈ စငးစစးအာ့်ဖငးံ LinearLayout မ္ာ့သညး View မ္ာ့ကို တစးခုၿပီ့မြ တစးခု
ေနရာခ္ထာ့ေစေသားလညး့ RelativeLayout မ္ာ့သညး တစးခုစီ၏ အထကးတျငး View မ္ာ့ကိုေနရာခ္
ထာ့ေပ့ႏိုငးပါသညး၈

ယခုေဖား်ပပါ Activity အတျကး Button အသစးႏြစးခုကို Google Map ေပၚတျငးတညးေဆာကးေပ့ရပါမညး၈


အဆိုပါ effect ကိုရရိြေစရနးအတျကး MapView ကို RelativeLayout အတျငး့တျငးထာ့ေပ့ရပါမညး၈
RelativeLayout မြ MapView ႏြငးံအတူ Button မ္ာ့ကို Map ေပၚတျငးထညး႕သျငး့ေပ့ေစႏိုငးမညး်ဖစးပါ
သညး၈

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>

ထို႕ေနာကး အပို Button ႏြစးခုကို ထညး႕သျငး့ေပ့ႏိုငးၿပီ်ဖစးပါသညး၈ အဆိုပါ Button မ္ာ့ကို MapView ၏


ဘယးအေပၚတျငးတစးခုႏြငးံ ဘယးေအာကး်ခမး့တျငးတစးခုထာ့ေပ့ရပါမညး၈ ထို႕ေၾကာငးံ Standard Button
Layout တျငးအေ်ပာငး့အလဲတစးခုကို ်ပဳလုပးေပ့ရနးလိုအပးမညး်ဖစးပါသညး၈ ပဵုမြနးအာ့်ဖငးံ RelativeLayout
သညး Button မ္ာ့ကို anchor view (MapView) ၏ ထိပးအစျနး့တျငး align ်ပဳလုပး၍ ထညး႕သျငး့ေပ့ပါ
သညး၈ ထို႕ေၾကာငးံ layout တျငး android:layout_alignBottom ဟူေသာ attribute ကိုအသဵု့်ပဳ၍
MapView ၏ id ကို assign ်ပဳလုပးေပ့ရပါမညး၈ ထိ႕ု ေနာကး ၁ငး့သညး Map ၏ ေအာကးဘကးတျင
Button ကို align ်ပဳလုပးေစမညး်ဖစးပါသညး၈

<Button android:id="@+id/buttonZoomIn"
style="?android:attr/buttonStyleSmall"
android:text="+"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonZoomOut"
style="?android:attr/buttonStyleSmall"
android:text="-"

238 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

သတိ်ပဳရနး၈ Button Layout အတျကး layout attribute မ္ာ့ကိုေသခ္ာစျာေလံလာပါ၈ attribute style


အသစးတစးခုကိုအသဵု့်ပဳ၍ Small button အေန်ဖငးံ်ဖစးလာေစရနး အသဵု့်ပဳထာ့ပါသညး၈

ထို႕ေနာကး main.xml ဖိုငးမြ Code မ္ာ့ကိုေအာကးပါအတိုငး့်မငးေတျ႕ရမညး်ဖစးပါသညး၈

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


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/gpsButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Where Am I"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/latLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude: "
/>
<TextView
android:id="@+id/latText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/lngLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude: "
/>
<TextView
android:id="@+id/lngText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

မ္ကးပျငးံစာေပ 239
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"

android:layout_height="wrap_content"/>
<Button android:id="@+id/buttonZoomIn"
style="?android:attr/buttonStyleSmall"
android:text="+"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonZoomOut"
style="?android:attr/buttonStyleSmall"
android:text="-"
android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>

ထို႕ေနာကး Code မ္ာ့ကိုလညး့ ေ်ပာငး့လဲမႈမ္ာ့်ပဳလုပးေပ့ရပါမညး၈ View အသစးမ္ာ့အတျကး Code မ္ာ့


ထညး႕မဵေပါငး့ထညး႕်ခငး့မြ သျယးဖီ၍ ထူ့်ခာ့ေသာ Code မ္ာ့်ဖငးံလုပးေဆာငးၾကညး႕ၾကပါမညး၈ Activity ကို
ပိုမိုေကာငး့မျနးေစရနးအတျကး MapView ႏြငးံ MapController မ္ာ့ကို Class ၏ main part မ္ာ့အ်ဖစးသို႕
ေ်ပာငး့လဲအသဵု့်ပဳရနးလိုအပးပါသညး၈ ၁ငး့သညး အ်ခာ့ေသာ function မ္ာ့မြ လိုအပးေသာအခါ အဆိုပါ
item မ္ာ့ကို pass ်ပဳလုပးရနးချငးံ်ပဳေစႏိုငးပါသညး၈ (zoom in ႏြငးံ zoom out ကဲံသို႕ေသာ feature မ္ာ့ကို
တညးေဆာကးရာတျငး အသဵု့်ပဳသကဲံသို႕)

final MapView myMap = (MapView) findViewById(R.id.myMap);


final MapController myMapController = myMap.getController();

ထို႕ေနာကး Button အသစးႏြစးခုအတျကး Code မ္ာ့ေရ့သာ့ေပ့ရပါမညး၈ ယခငးတညးေဆာကးထာ့ေသာ


Button မ္ာ့အတျကး Code မ္ာ့ေရ့သာ့ထာ့ၿပီ့်ဖစးေသာေၾကာငးံ အသစးတညးေဆာကးထာ့ေသာ Button
မ္ာ့အတျကး function မ္ာ့ေခၚယူရနး code မ္ာ့ေရ့သာ့ေပ့ရမညး်ဖစးပါသညး၈

final Button zoomIn = (Button) findViewById(R.id.buttonZoomIn);


zoomIn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomIn(myMap,myMapController);
}});
final Button zoomOut = (Button) findViewById(R.id.buttonZoomOut);
zoomOut.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomOut(myMap,myMapController);
}});
240 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေနာကးဆဵု့အရ zoom in ႏြငးံ zoom out ဟူေသာ feature အတျကး function မ္ာ့တညးေဆာကးရပါမညး၈
အ်မငးံဆဵု့အသဵု့်ပဳႏိုငးမညး႕ Zoom In Level မြာ 21 ်ဖစးၿပီ့အနိမးံဆဵု့ Zoom Out Level မြာ 1 ဟုသတး
မြတးပါမညး၈ ထို႕ေၾကာငးံ function အတျငး့တျငး adjust မ်ပဳလုပးမီတျငး လကးရိြ level ကိုစမး့သပးၾကညး႕ၾက
ပါမညး၈ ထိုသို႕စမး့သပးမႈ်ဖငးံ မညးသညး႕ ်ပသနာမြမေပၚေစရနး ေသခ္ာေအာငး်ပဳလုပးသငးံပါသညး၈

public void ZoomIn(MapView mv, MapController mc){


if(mv.getZoomLevel()!=21){
mc.zoomTo(mv.getZoomLevel()+ 1);
}
}
public void ZoomOut(MapView mv, MapController mc){
if(mv.getZoomLevel()!=1){
mc.zoomTo(mv.getZoomLevel()- 1);
}
}

Function မ္ာ့အတျငး့တျငး MapView ႏြငးံ MapController မ္ာ့ကို Pass လုပးေစေၾကာငး့ သတိ်ပဳပါ၈ ထိုမြ
Zoom Level ကိုသတးမြတးရနး ရို့ရြငး့ေသာ integer manipulation ကိုအသဵု့်ပဳပါသညး၈ မြတးသာ့သင
ေသာထူ့်ခာ့သညး႕အခ္ကးမ္ာ MapController သညး Zoom Value ကို ်ပဳ်ပငးေပ့ႏိုးငးမညး႕ MapView
သို႕ေရႊ႕လ္ာ့၍ ဆႏၵရိြသညး႕ Zoom Level ကိုခ္ိနးညိြသျာ့်ခငး့ပငး်ဖစးပါသညး၈ အဆိုပါ ဆကးသျယးခ္ကးက
Remote Control ႏြငးံ TV ကိုဥပမာထာ့၍ စဥး့စာ့ပါ၈ Remote Control သညး TV မြ သိမး့ဆညး့မြတးသာ့
ထာ့သညး႕ Channel 5 ကို Tune ်ပဳလုပးသျာ့ေစ်ခငး့်ဖစးၿပီ့ Remote Control မြ Channel 5 ကို်ပဳလုပး
သိမး့ဆညး့ေစ်ခငး့မဟုတးပါ၈

ၿပီ့ဆဵု့သျာ့ေသာ AndroidLBS.java ဖိုငးမြ Code မ္ာ့ကိုေအာကးပါ အတိုငး့်မငးေတျ႕ရမညး်ဖစးပါသညး၈

package android_programmers_guide.AndroidLBS;

import android.os.Bundle;
import android.location.LocationManager;
import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import com.google.android.maps.MapController;

public class AndroidLBS extends MapActivity {


/** Called when the activity is first created. */
@Override

မ္ကးပျငးံစာေပ 241
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

public void onCreate(Bundle icicle) {


super.onCreate(icicle);
setContentView(R.layout.main);
final MapView myMap = (MapView) findViewById(R.id.myMap);
final MapController myMapController = myMap.getController();
final Button zoomIn = (Button) findViewById(R.id.buttonZoomIn);
zoomIn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomIn(myMap,myMapController);
}});
final Button zoomOut = (Button) findViewById(R.id.buttonZoomOut);
zoomOut.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomOut(myMap,myMapController);
}});
final Button gpsButton = (Button) findViewById(R.id.gpsButton);
gpsButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
LoadProviders(myMap,myMapController);
}});
}
public void LoadProviders(MapView mv, MapController mc){
TextView latText = (TextView) findViewById(R.id.latText);
TextView lngText = (TextView) findViewById(R.id.lngText);
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
` Double latPoint =
myManager.getCurrentLocation("gps").getLatitude()*1E6;
Double lngPoint =
myManager.getCurrentLocation("gps").getLongitude()*1E6;
latText.setText(latPoint.toString());
lngText.setText(lngPoint.toString());
Point myLocation = new
Point(latPoint.intValue(),lngPoint.intValue());
mc.centerMapTo(myLocation, false);
mc.zoomTo(9);
}
public void ZoomIn(MapView mv, MapController mc){
if(mv.getZoomLevel()!=21){
mc.zoomTo(mv.getZoomLevel()+ 1);
}
}
public void ZoomOut(MapView mv, MapController mc){
if(mv.getZoomLevel()!=1){
mc.zoomTo(mv.getZoomLevel()- 1);
}
}
}

Function မ္ာ့အတျငး့တျငး MapView ႏြငးံ MapController မ္ာ့ကို Pass လုပးေစေၾကာငး့ သတိ်ပဳပါ၈ ထိုမြ
Zoom Level ကိုသတးမြတးရနး ရို့ရြငး့ေသာ integer manipulation ကိုအသဵု့်ပဳပါသညး၈ မြတးသာ့သင
ေသာထူ့်ခာ့သညး႕အခ္ကးမ္ာ MapController သညး Zoom Value ကို ်ပဳ်ပငးေပ့ႏိုးငးမညး႕ MapView
သို႕ေရႊ႕လ္ာ့၍ ဆႏၵရိြသညး႕ Zoom Level ကိုခ္ိနးညိြသျာ့်ခငး့ပငး်ဖစးပါသညး၈ အဆိုပါ ဆကးသျယးခ္ကးက
Remote Control ႏြငးံ TV ကိုဥပမာထာ့၍ စဥး့စာ့ပါ၈ Remote Control သညး TV မြ သိမး့ဆညး့မြတးသာ့
242 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထာ့သညး႕ Channel 5 ကို Tune ်ပဳလုပးသျာ့ေစ်ခငး့်ဖစးၿပီ့ Remote Control မြ Channel 5 ကို်ပဳလုပး


သိမး့ဆညး့ေစ်ခငး့မဟုတးပါ၈

ထို႕ေနာကး Android Emulator အတျငး့တျငး Activity ကိုေမာငး့ႏြငးၾကညး႕ပါ၈ Activity သညး reset


MapView တစးခုကို ပျငးံေပ့မညး်ဖစးၿပီ့ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ပငး ခလုတးမ္ာ့ကို ေတျ႕ရိြရ
မညး်ဖစးပါသညး၈

ထို႕ေနာကး Zoom In ႏြငးံ Zoom Out Button မ္ာ့ကိုစမး့သပးၾကညး႕ပါ၈ Zoom In ခလုတးကိုႏိြပးေသာ


အခါတျငး ေအာကးေဖား်ပပါပဵုအတိုငး့ပငး Zoom ဆျဲသျာ့သညးကိုေတျ႕ရိြရမညး်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 243
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

(အိမးစာ) Toggling Between MapView’s Standard and Satellite Views

AndroidLBS Activity ကို တစးႀကိမးထကးမနညး့်ပငးဆငးၾကညး႕ပါ၈ RelativeLayout အတျကး Button ႏြစး


ခုထပးမဵထညး႕သျငး့ၾကညး႕ပါ၈ အဆိုပါ Button မ္ာ့ကို MapView မြ Standard View ႏြငးံ Satellite View
မ္ာ့အၾကာ့ေ်ပာငး့လဲၾကညး႕ရြဳရနးအသဵု့်ပဳရပါမညး၈ စဥး့စာ့ေတျ့ေတာရမညး႕အခ္ကးမ္ာ့မြာ

 Align layout attribute မ္ာ့ကိုအသဵု့်ပဳ၍ MapView ၏ အစျနး့ႏြစးဖကးတျငး Toggle Button မ္ာ့


ထညး႕သျငး့ရနး
 MapView တျငး Toggle ်ပဳလုပးႏုိငးေစမညး႕နညး့လမး့မ္ာ့ကိုရြာေဖျရနး
 Function တစးခုတညးေဆာကး၍ MapView ကို Toggle ်ပဳလုပးခိုငး့ေစရနး တို႕်ဖစးပါသညး၈

အဆိုပါ လုပးေဆာငးခ္ကးမ္ာ့အတျကး အသဵု့်ပဳႏိုငးေစမညး႕ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈

244 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/gpsButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Where Am I"
/>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/latLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude: "
/>
<TextView
android:id="@+id/latText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/lngLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude: "
/>
<TextView
android:id="@+id/lngText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:id="@+id/buttonZoomIn"
style="?android:attr/buttonStyleSmall"

မ္ကးပျငးံစာေပ 245
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

android:text="+"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonMapView"
style="?android:attr/buttonStyleSmall"
android:text="Map"
android:layout_alignRight="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonSatView"
style="?android:attr/buttonStyleSmall"
android:text="Sat"
android:layout_alignRight="@+id/myMap"
android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonZoomOut"
style="?android:attr/buttonStyleSmall"
android:text="-"
android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>

AndroidLBS.java
package android_programmers_guide.AndroidLBS;

import android.os.Bundle;
import android.location.LocationManager;
import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import com.google.android.maps.MapController;

public class AndroidLBS extends MapActivity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

final MapView myMap = (MapView) findViewById(R.id.myMap);


final MapController myMapController = myMap.getController();
final Button zoomIn = (Button) findViewById(R.id.buttonZoomIn);
zoomIn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomIn(myMap,myMapController);
}});
final Button zoomOut = (Button) findViewById(R.id.buttonZoomOut);
zoomOut.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomOut(myMap,myMapController);

246 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

}});
final Button gpsButton = (Button) findViewById(R.id.gpsButton);
gpsButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
LoadProviders(myMap,myMapController);
}});
final Button viewMap = (Button) findViewById(R.id.buttonMapView);
viewMap.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ShowMap(myMap);
}});
final Button viewSat = (Button) findViewById(R.id.buttonSatView);
viewSat.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ShowSat(myMap);
}});
}
public void LoadProviders(MapView mv, MapController mc){
TextView latText = (TextView) findViewById(R.id.latText);
TextView lngText = (TextView) findViewById(R.id.lngText);
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Double latPoint =
myManager.getCurrentLocation("gps").getLatitude()*1E6;
Double lngPoint =
myManager.getCurrentLocation("gps").getLongitude()*1E6;
latText.setText(latPoint.toString());
lngText.setText(lngPoint.toString());
Point myLocation = new
Point(latPoint.intValue(),lngPoint.intValue());
mc.centerMapTo(myLocation, false);
mc.zoomTo(9);
}
public void ZoomIn(MapView mv, MapController mc){
if(mv.getZoomLevel()!=21){
mc.zoomTo(mv.getZoomLevel()+ 1);
}
}
public void ZoomOut(MapView mv, MapController mc){
if(mv.getZoomLevel()!=1){
mc.zoomTo(mv.getZoomLevel()- 1);
}

}
public void ShowMap(MapView mv){
if (mv.isSatellite()){
mv.toggleSatellite();
}
}
public void ShowSat(MapView mv){
if (!mv.isSatellite()){
mv.toggleSatellite();
}
}
}

Activity ကိုေမာငး့ႏြငးၾကညး႕ေသာအခါတျငး ေအာကးေဖား်ပပါပဵုအတိုငး့ပငး Statellite View သို႕ပါ Toogle


်ပဳလုပးႏိုငးေၾကာငး့ ေတျ႕ရိြရမညး်ဖစးပါသညး၈
မ္ကးပျငးံစာေပ 247
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးလာမညး႕အခနး့တျငး Google API ကိုထပးမဵေလံလာရမညး်ဖစးသညး၈ အခနး့ ှွ တျငး Google API


ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ Android ဖုနး့အခ္ငး့ခ္ငး့တျငး GTalk message မ္ာ့ေပ့ပို႕ႏုိငးေသာ Application ကို
အဆငးံအလိုကးလုပးေဆာငးပဵုမ္ာ့ကို ေလံလာၾကညး႕ရမညး်ဖစးပါသညး၈

248 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 10
Using the Google API with GTalk

မ္ကးပျငးံစာေပ 249
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Implementing a Google API package
- Configuring the XMPP development settings for Google access
- Implementing the View.OnClickLister() method

အခနး့ (၆) တျငးပငး Google API ၏အသဵု့်ပဳပဵုမ္ာ့ကို နိဒါနး့ပ္ိဳ့အသဵု့်ပဳခဲံၿပီ့်ဖစးပါသညး၈ Google API ႏြငးံ
Google Map မ္ာ့ကိုအသဵု့်ပဳေစမညး႕ Activity တစးခုကိုတညးေဆာကးခဲံၿပီ့်ဖစးပါသညး၈ API ၏ လျယးကူ
ၿပီ့၇ ်ပဳလျယး်ပငးလျယးရိြေသာအခ္ကးမ္ာ့ေၾကာငးံ Google Map မြအသဵု့်ပဳသူ၏ location ကိုလျယးကူလြ္င
်မနးစျာရရိြႏိုငး်ခငး့်ဖစးပါသညး၈ Code အနညး့ငယးေရ့သာ့ရဵု်ဖငးံ map ကိုမညးကဲံသုိ႕အသဵု့ခ္ႏိုငးသညး ဆို
ေသာအခ္ကးကိုပါေလံလာခဲံရပါသညး၈ Google API သညး Google Maps ၏ လုပးေဆာငးခ္ကးတစးခုထက
ပိုသညးဟူေသာအခ္ကးကို စဥး့စာ့ႏိုငးလိမးံမညးဟုထငးပါသညး၈ Google API အတျကး base package မြာ
com.google ပငး်ဖစးပါသညး၈ အေ်ခခဵအာ့်ဖငးံ Google API တျငး GTalk ၇ Google Calendar၇ Google
Docs၇ Google Spreadsheet ႏြငးံ အ်ခာ့ေသာ Google Service မ္ာ့ကဲံသို႕ေသာ လုပးေဆာငးခ္ကးမ္ာ့က
ဖနးတီ့ ေစႏိုငးေသာ package မ္ာ့ပါွငးပါသညး၈

ယခုအခနး့တျငး Android SDK ၏ GTalk package ကို အသဵု့်ပဳ၍ small Activity တစးခုကိုတညးေဆာက
ၾကညး႕ၾကပါမညး၈ ထို Activity ၿပီ့ဆဵု့ေသာအခါတျငး အသဵု့်ပဳမညး႕ဖုနး့မြ Gtalk message မ္ာ့ကို အ်ခာ့
ေသာ Gtalk အသဵု့်ပဳသူမ္ာ့ထဵသို႕ေပ့ပို႕ေစႏိုငးရဵုသာမက ထိုသူမ္ာ့မြ Message မ္ာ့ကိုလညး့ လကးခဵ
ေစႏိုငးမညး်ဖစးပါသညး၈

Android အတျကး Google API ၏ အေၾကာငး့ေ်ပာရလြ္ငး Gtalk ႏြငးံသကးဆိုငးေသာ package သညး


XMPP package ႏြငးံသကးဆိုငးပါသညး၈ (XMPP သညး Gtalk ႏြငးံ Jabber အပါအွငး chat platform
မ္ာ့စျာကိုအေ်ခခဵထာ့ေသာ Protocol တစးခု်ဖစးပါသညး၈)

စတငးႏိုငးရနးအတျကး Eclipse အတျငး့တျငး Project အသစးတစးခုတညးေဆာကးကာ GoogleAPI ဟု


အမညးေပ့ရပါမညး၈

250 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Configuring the Andorid Emulator for GTalk


ယခု Project တျငး Code မ္ာ့ေရ့သာ့်ခငး့မ်ပဳမီတျငး Android Emulator မြ XMPP setting မ္ာ့ကို
်ပငးဆငးေပ့ရနးလိုအပးမညး်ဖစးပါသညး၈ အကယး၍ Gtalk ကိုအသဵု့်ပဳဖူ့သူ်ဖစးပါက အသဵု့မ်ပဳမီတျငး
Google Account သို႕ ဦ့စျာ log in ွငးေရာကးရေၾကာငး့သတိထာ့မိပါလိမးံမညး၈ ထို႕ေၾကာငးံ အပိုအဆငးံ
တစးဆငးံအေန်ဖငးံ Device ကို (Android Emulator) ကို Google account သို႕ login ွငးေရာကး
ထာ့ၿပီ့ေၾကာငး့ ေသခ္ာေအာငး်ပဳလုပးရပါမညး၈ ထိုအခါမြ Message မ္ာ့ေပ့ပို႕၇ လကးခဵေစႏိုငးမညး်ဖစ
သညး၈ AndroidSDK tool ကို Navigate ်ပဳလုပး၍ Emulator ကို Launch ်ပဳလုပးရပါမညး၈ ထို႕အတူ
Eclispe development environment အတျငး့မြလညး့ ၁ငး့ကို Launch ်ပဳလုပးႏိုငးေသားလညး့ Code
မေရ့သာ့ရေသ့ေသာ Activity တစးခုကိုပါ Launch ်ပဳလုပးရနးလိုအပးမညး်ဖစးသညး၈ အခ္ိနးမကုနးေစရနး
အတျကး Emulator ကို manual အေန်ဖငးံပငး launch ်ပဳလုပးရပါမညး၈

Emulator ပျငးံလာၿပီ့ေသာအခါတျငး All Shortcut ကို Click ႏိြပးပါ၈ Dev Tools Item ကိုရြာ၍ launch ်ပဳ
လုပးပါ၈ ထိုအခါေအာကးေဖား်ပပါပဵုအတိင
ု း့ ေပၚလာသညးကိုေတျ႕ရပါမညး၈

မ္ကးပျငးံစာေပ 251
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

XMPP Settings ကိုရြာေဖျေတျ႕ရိြသညးအထိ Dev Tools Menu ကို Scroll ်ပဳလုပးရြာေဖျပါ၈ ထို႕ေနာကး
XMPP Settings တျငးေရျ့ခ္ယးေသာအခါတျငး ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအတိုငး့ေပၚလာသညးက
ေတျ႕ရမညး်ဖစးပါသညး၈

XMPP Settings ကိုဖျငးံလိုကးေသာအခါ ေတျ႕ရမညး႕ Activity သညး GTalk Settings ပငး်ဖစးပါသညး၈ ၁ငး့
သညး Google API ၏ က္နးရိြေနေသာ package မ္ာ့နြငးံ အလုပးလုပးေဆာငးႏိုငးရနးအတျကး လမး့ညႊနးခ္ကး
တစးခုလညး့်ဖစးပါသညး၈

ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတုိငး့ပငး Account: <None> ဟူ၍ ်မငးေတျ႕ရမညး်ဖစးပါသညး၈ ထို


အခ္ကးသညး Device အတျငး့တျငး login ွငးေရာကးထာ့ေသာ အခ္ကးအလကးမ္ာ့မရိြေသ့ေၾကာငး့
ေဖား်ပထာ့ခ္ကးပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Google Account ၏ Information မ္ာ့ကိုရရိြေစရနး Login
ွငးေရာကးရနးလိုအပးမညး်ဖစးပါသညး၈ Add Account ကို click ႏိြပးၿပီ့ login ်ပဳလုပးမညး႕ Google Account
ကိုရိုကးထညး႕ေပ့ရပါမညး၈

252 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Username ႏြငးံ Password ကိုထညး႕သျငး့ၿပီ့ေနာကး Sign In တျငး Click ႏိြပးပါ၈ Android Emulator တျငး
information မ္ာ့ကို Authenticate ်ပဳလုပးေနေၾကာငး့ ေအာကးေဖား်ပပါပဵုအတိုငး့ ေဖား်ပေနမညး်ဖစးပါ
သညး၈ Emulator မြ Information ကို authenticate ်ပဳလုပးေနစဥးအတျငး့တျငး Authenticating ဟူေသာ
message ကိုေဖား်ပေပ့ေနမညး်ဖစးသညး၈

မ္ကးပျငးံစာေပ 253
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Information ကို authenticate ်ပဳလုပးၿပီ့ေနာကးတျငး ေအာကးတျငး်ပထာ့သညး႕ပဵုအတိုငး့ေတျ႕်မငးရ


မညး်ဖစးပါသညး၈ Emulator တျငး Return ခလုတးမပါွငးေသာေၾကာငးံ Home Key ကိုႏိြပး၍ Main Screen
သို႕်ပနးထျကးရပါမညး၈

ယခုအခါတျငး Emulator ကို configure ်ပဳလုပးၿပီ့ Project ကိုလညး့ Setup ်ပဳလုပးၿပီ့်ဖစးေသာေၾကာင


Activity အတျကးလုိအပးေသာ Code မ္ာ့်ဖငးံ အလုပးလုပးေဆာငးႏိုငးၿပီ်ဖစးပါသညး၈

Implementing GTalk in Android


ယခုအပိုငး့တျငး GTalk ကိုအသဵု့်ပဳေစႏိုငးေသာ Activity တစးခုကို Google API ကိုအသဵု့်ပဳ၍ တညး
ေဆာကးၾကညး႕ပါမညး၈ အဆိုပါ Activity ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ Gtalk network မြ message မ္ာ့ကို ေပ့ပို႕
်ခငး့၇ လကးခဵ်ခငး့ စသညး႕တို႕ကို Screen ေပၚတျငး်ဖစးေစ၇ Notifcation bar ေပၚတျငး်ဖစးေစ၇ ်မငးေတျ႕ရ
ေစမညး်ဖစးပါသညး၈ ထို႕အ်ပငး တညးေဆာကးထာ့ေသာ Activity သညး အ်ခာ့ေသာ Gtalk အသဵု့်ပဳသူ
မ္ာ့ႏြငးံပါ ခ္ိတးဆကး ဆကးသျယးႏိုငးေစမညး်ဖစးပါသညး၈ ေနာကးလာမညး႕အပိုငး့တျငး Application အတျကး

254 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

layout တညးေဆာကး်ခငး့ကို ်ပဳလုပးရမညး်ဖစးပါသညး၈ ပထမအဆငးံအရ GoogleAPI.xml သို႕ layout


မ္ာ့ေပါငး့ထညး႕ေပ့ရမညး်ဖစးပါသညး၈

Creating the Activity’s Layout in the GoogleAPI.xml


အဆိုပါ Activity တျငး View မ္ာ့စျာပါွငးပါသညး၈ Message မ္ာ့ေပ့ပို႕်ခငး့၇ လကးခဵ်ခငး့ စသညးတို႕က
်ပဳလုပးေပ့မညး႕ ListView တစးခုကိုလိုအပးမညး်ဖစးပါသညး၈ ေပ့ပို႕မညး႕ Google Account ၏ Address
ကိုအသဵု့်ပဳရနးႏြငးံ Message ရိုကးထညး႕ရနးအတျကးလညး့ EditTextView ႏြစးခုကိုလုိအပးပါမညး၈
ထို႕ေနာကး Button တစးခုကို Send Function ေခၚယူရနးအတျကး အသဵု့်ပဳရပါမညး၈

ေရြ့ဦ့စျာ MessageList ဟူေသာ Id အမညးေပ့၍ ListView တစးခုကို setup ်ပဳလုပးေပ့ရပါမညး၈ အဆိုပါ


layout ်ဖစးေသာ android:scrollbars အတျကး attribute အသစးမ္ာ့ကိုလညး့ ေအာကးပါအတိုငး့ အသဵု့
်ပဳေပ့ရပါမညး၈ Vertical ်ပဳလုပးရနးအတျကး Setting ခ္ထာ့ေသာ attribute သညး Message list ကို
scroll ်ပဳလုပးေစႏိုငးမညး႕နညး့လမး့လညး့်ဖစးပါသညး၈

<ListView
android:id="@+id/messageList"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:scrollbars="vertical"
android:layout_weight="1"
android:drawSelectorOnTop="false" />

အဆိုပါ ListView ကို main layout tag တျငးေနရာခ္ထာ့ေပ့ရပါမညး၈ ListView Layout ေအာကးတျငး
ေအာကးတျငးေဖား်ပထာ့သညး႕အတိုငး့ EditText တစးခုအတျကး layout ကိုေနရာခ္ထာ့ေပ့ရပါမညး၈
အဆိုပါ EditText သညး ေပ့ပို႕မညး႕သူ၏ Address အ်ဖစးအသဵု့်ပဳ၍ message ေပ့ပို႕ေစႏိုငးမညး်ဖစး
ပါသညး၈

<EditText
android:id="@+id/messageTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:minWidth="250dp"
android:scrollHorizontally="true" />

မ္ကးပျငးံစာေပ 255
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို EditText View တျငးသာမနးထကးထူ့ကဲေသာလုပးေဆာငးခ္ကးမ္ာ့မပါွငးပါ၈ ထို႕ေၾကာငးံ ေနာကးဆဵု့


အေန်ဖငးံ Message Content မ္ာ့၇ EditText View ႏြငးံ Send Button စသညးတို႕ကိုအသဵု့်ပဳရန
Horizontal Layout အသစးတစးခုကို တညးေဆာကးရနး လိုအပးမညး်ဖစးပါသညး၈

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/messageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:minWidth="250dp"
android:scrollHorizontally="true" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Msg">
</Button>
</LinearLayout>

အဆိုပါ layout သညး View မ္ာ့ကိုပါွငးေစမညး်ဖစးသညး႕အတျကး ၁ငး့သညး တစးခုစီတျငး ပါွငးပတးသက


ေစမညး်ဖစးေသာေၾကာငးံ အဆိုပါ LinearLayout ကို main LinearLayout အတျငး့တျငး ထာ့ေပ့ရပါမညး၈
ထိုအခါ GoogleAPI.xml ဖိုငးအတျငး့တျငးရိြေသာ Code အ်ပညး႕အစဵုကိုေအာကးေဖား်ပပါအတိုငး့ပငး ေတျ႕
်မငးရမညး်ဖစးပါသညး၈

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


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/messageList"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:scrollbars="vertical"
android:layout_weight="1"
android:drawSelectorOnTop="false" />
<EditText
android:id="@+id/messageTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
256 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:minWidth="250dp"
android:scrollHorizontally="true" />
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/messageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:minWidth="250dp"
android:scrollHorizontally="true" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Msg">
</Button>
</LinearLayout>
</LinearLayout>

Adding Packages to GoogleAPI.java


Layout ဖိုငးကိုေအာငး်မငးစျာ လုပးေဆာငးၿပီ့ေနာကးတျငး GoogleAPI.java ဖိုငးတျငးထညး႕သျငး့ရနးလိုအပ
ေသာ Package အသစးအမ္ာ့အ်ပာ့ရိြမညး်ဖစးပါသညး၈ ပထဆဵု့ထညး႕သျငး့ရမညး႕ package မ္ာ့သညး
ထညး႕သျငး့တညးေဆာကးထာ့ေသာ Layout မြ View မ္ာ့အတျကး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ EditText၇
ListView၇ ListAdapter ႏြငးံ ခလုတးမ္ာ့အတျကး package မ္ာ့ကိုထညး႕သျငး့ေပ့ရပါမညး၈

import android.widget.EditText;
import android.widget.ListView;
import android.widget.ListAdapter;
import android.widget.Button;

ထို႕ေနာကး GTalk ႏြငးံသကးဆိုငးေသာ Google API ၏ package မ္ာ့ကိုလညး့ ထညး႕သျငး့ေပ့ရနးလိုပါ


မညး၈

import com.google.android.gtalkservice.IGTalkSession;
import com.google.android.gtalkservice.IGTalkService;
import com.google.android.gtalkservice.GTalkServiceConstants;
import com.google.android.gtalkservice.IChatSession;

မ္ကးပျငးံစာေပ 257
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အ်ခာ့ေသာ Package အခ္ိဳ႕မြာ ယခု Application တျငးပါွငးသညး႕ Intent၇ ServiceConnection၇ Color


ႏြငးံ Im တို႕အတျကး်ဖစးပါသညး၈ ထညး႕သျငး့ရမညး႕ package မ္ာ့မြာေအာကးပါအတိုငး့ပငး်ဖစးပါသညး၈

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.IBinder;
import android.provider.Im;
import android.graphics.Color;
import android.view.View;
import android.widget.SimpleCursorAdapter;

ေတျ႕်မငးရသညး႕အတိုငး့ပငး အဆိုပါ Activity အတျကး package အမ္ာ့အ်ပာ့ကိုအသဵု့်ပဳရေၾကာငး့ ေတျ႕


ရိြရမညး်ဖစးသညး၈ သို႕ရာတျငး Message ကိုေပ့ပို႕၇ လကးခဵႏိုငးမႈကိုေရ့သာ့ထာ့ေသာ Code မ္ာ့သညး
အနညး့ငယးနညး့ပါ့ေၾကာငး့ ေတျ႕ရိြရမညး်ဖစးသညး၈ ထို႕ေနာကး Codeအတျငး့တျငး ေမာငး့ႏြငးမညး႕
OnClickListener တစးခုကို implement ်ပဳလုပးေပ့ရနးလိုအပးမညး်ဖစးပါသညး၈

Implementing the View.OnClickListener


View.OnClickListen ကို implement ်ပဳလုပးရနးအတျကး GoogleAPI ကို modify ်ပဳလုပးရနးလိုအပးပါ
မညး၈ အဆိုပါ class သညး onClick() ဟူေသာ mthod ကို Activity ၏ main class မြ မညးသညး႕ button
ကို Click ႏိြပးသညး်ဖစးေစ ေခၚယူႏိုငးပါသညး၈ ပဵုမြနးအာ့်ဖငးံ onClick() ဟူေသာ method ကို implement
်ပဳလုပးႏိုငးေစမညး႕နညး့လမး့မြာ Activity တစးခုအတျငး့တျငး button မ္ာ့ မ္ာ့စျာရိြေသာအခါ ပိုမို
အက္ိဳ့သကးေရာကးမႈရိြၿပီ့ method တစးခုတညး့်ဖငးံ အာ့လဵု့ေသာ onClick call မ္ာ့ကိုလုပးေဆာငးေစႏိုင
ပါသညး၈ ထိုနညး့လမး့သညး အေ်ခအေနမ္ာ့စျာတို႕အတျကး အလျနးအသဵု့ွငးေသာ နညး့လမး့လညး့်ဖစ
သညး႕အတျကး အသဵု့်ပဳၾကညး႕ရနးလိုအပးမညး်ဖစးပါသညး၈

public class GoogleAPI extends Activity implements View.OnClickListener {


}

Activity အတျငး့တျငး General Variable မ္ာ့်ဖငးံ လုပးေဆာငး်ခငး့သညး ယခုအခ္ိနးအထိအသဵု့မ်ပဳရေသ့


ေသာ အယူအဆသစးတစးခုလညး့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ အဆိုပါ Activity အတျကး General Variable

258 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

မ္ာ့ကို သတးမြတးေပ့ရနး လိုအပးမညး်ဖစးၿပီ့ အဆိုပါ Variable မ္ာ့ကို နညး့လမး့အမ္ိဳ့မ္ိဳ့်ဖငးံ အသဵု့်ပဳႏုိငး


ပါသညး၈

EditText messageText;
ListView messageList;
IGTalkSession myIGTalkSession;
EditText messageTo;
Button sendButton;

onCreate() ဟူေသာ method အတျကး ကနဦ့ေၾက်ငာခ္ကးမ္ာ့ကို လုပးေဆာငးရပါမညး၈ View မ္ာ့


အတျကး Layout ကို assign ်ပဳလုပးၿပီ့ IGTalkSession ကို null ဟု assign ်ပဳလုပးေပ့သငးံပါသညး၈
Activity ကိုဆျဲေဆာငးမႈရိြေစရနးအနညး့ငယး်ပဳလုပးၾကညး႕်ခငး့အာ့်ဖငးံ ListView ၏ Background
အေရာငးကို အညိဳေရာငးအ်ဖစး ေ်ပာငး့လဲၾကညး႕ၾကပါမညး၈

myIGTalkSession = null;
messageText = (EditText) findViewById(R.id.messageText);
messageList = (ListView) findViewById(R.id.messageList);
messageTo = (EditText) findViewById(R.id.messageTo);
sendButton = (Button) findViewById(R.id.btnSend);
sendButton.setOnClickListener(this);
messageList.setBackgroundColor(Color.GRAY );

Class မြ View.OnClickListener ်ဖငးံ Implement ်ပဳလုပးထာ့သ်ဖငးံ Send Button ၏ OnClickListener


() method ကိုလညး့ အဆိုပါ View.OnClickListener တျငး သတးမြတးႏိုငးပါသညး၈

onCreate () အတျငး့တျငး ေနာကးဆဵု့်ပဳလုပးရမညး႕အလုပးမြာ Sevice ကို bind ်ပဳလုပးရနး်ဖစးပါသညး၈


အဆိုပါ Process သညး Dev Tools အတျငး့တျငး establish ်ပဳလုပးထာ့ခဲံေသာ Google Account မြ
ေထာကးပဵံေသာအသဵု့်ပဳမညး႕ Connection တစးခုကိုတညးေဆာကးၿပီ့ GTalk message မ္ာ့ကို pass
်ပဳလုပးေပ့ေစမညး်ဖစးသညး၈

this.bindService(new
Intent().setComponent(GTalkServiceConstants.GTALK_SERVICE_COMPONENT),
connection, 0);

အထကးတျငးေဖား်ပထာ့ေသာ bindService statement အတျငး့တျငး setComponent() ဟူေသာ


method သို႕်ဖတးသနး့ေစႏိုငးေသာ parameter တစးခုမြာ connection ပငး်ဖစးပါသညး၈ အဆိုပါ Variable
သညး onServiceConnected() ဟူေသာ method ႏြငးံ onServiceDisconnected() ဟူေသာ method
ကိုလုပးေဆာငးေပ့ႏိုငးေသာ ServiceConnection တစးခုအ်ဖစးပါွငးေစပါသညး၈ ေအာကးေဖား်ပပါ Code
မ္ကးပျငးံစာေပ 259
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

သညး အထကးတျငးေဖား်ပခဲံေသာ bindService ကို bound ်ပဳလုပးေစမညး႕ Connection ကိုတညးေဆာက


ေပ့ပါသညး၈

private ServiceConnection connection = new ServiceConnection() {


public void onServiceConnected(ComponentName name, IBinder service) {
try {
myIGTalkSession =
IGTalkService.Stub.asInterface(service).getDefaultSession();
} catch (DeadObjectException e) {
myIGTalkSession = null;
}
}
public void onServiceDisconnected(ComponentName name) {
myIGTalkSession = null;
}
};

onServiceConnected() ဟူေသာ method တျငး IGTalkService.Stub ကိုအသဵု့်ပဳ၍ session တစးခုကို


establish ်ပဳလုပးသတးမြတးေပ့ရပါမညး၈ အကယး၍ အဆိုပါ Process မေအာငး်မငးခဲံလြ္ငး ထို session ကို
null ဟူ၍ ထပးမဵသတးမြတးေပ့မညး်ဖစးပါသညး၈ ထိုအတိုငး့ပငး onServiceDisconnected() ဟူေသာ
method တျငး session ကို null ဟူ၍ ေနာကးတစးႀကိမးသတးမြတးေပ့ရမညး်ဖစးပါသညး၈

ထို႕ေနာကး Class ၏ onClick Event အတျကး Code မ္ာ့ကိုတညးေဆာကးၾကပါမညး၈ onClick event


တစးခုစီကိုလုပးေဆာငးရာတျငး လုပးေဆာငးခ္ကး action ေပါငး့မ္ာ့စျာရိြမညး်ဖစးပါသညး၈ အဆိုပါလုပးေဆာင
ခ္ကးမ္ာ့မြာ

 Message မ္ာ့အတျကး database ကိုစစးေဆ့်ခငး့


 Query ၏ Result မ္ာ့မြ ListAdapter တစးခုကိုတညးေဆာကး၍ ListView တျငးေဖား်ပေစ်ခငး့
 EditView အတျငး့တျငး address ကိုပို႕လႊတးေစမညး႕ ChatSession တစးခုတညးေဆာကး၍
Message မ္ာ့ေပ့ပို႕်ခငး့ တို႕်ဖစးပါသညး၈

Android Server တျငး မ္ာ့စျာေသာ Activity မ္ာ့ႏြငးံဆကးႏျယး၍ ႀကိဳကးႏြစးသကးရာ data မ္ာ့ထညး႕သျငး့


ေစႏိုငးေသာ SQLite database တစးခုပါွငးပါသညး၈ အဆိုပါ SQLite database ကိုအသဵု့်ပဳ်ခငး့ကို အခနး့
(ှှ) တျငးအေသ့စိပးေလံလာရပါလိမးံမညး၈

ေအာကးပါ Code မ္ာ့သညး ပို႕လႊတးသူ (ကၽျႏုးပးတို႕) ႏြငးံ messageTo recipient အၾကာ့ database
အတျငး့တျငးရိြေသာ message မ္ာ့ကို query ်ပဳလုပးေဖား်ပေစရနး အသဵု့်ပဳပါသညး၈
260 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Cursor cursor = managedQuery(Im.Messages.CONTENT_URI, null,


"contact=\'" + messageTo.getText().toString() + "\'", null, null);

ရရိြလာေသာ Query result မ္ာ့မြ ListAdapter တစးခုကိုတညးေဆာကးရနးႏြငးံ ListView သို႕ အဆိုပါ


Adapter ကို assign ်ပဳလုပးေစရနးအတျကး ေအာကးေဖား်ပပါ Code ကိုအသဵု့်ပဳရပါမညး၈ ထိုသို႕်ပဳလုပးပဵုကို
ယခငးေလံလာခဲံရေသာ Activity တျငးေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈

ListAdapter adapter = new SimpleCursorAdapter(this,


android.R.layout.simple_list_item_1, cursor,
new String[]{Im.MessagesColumns.BODY},
new int[]{android.R.id.text1});
this.messageList.setAdapter(adapter);

Message မ္ာ့ကိုေဖား်ပေစမညး႕ Code မ္ာ့ကိုေရ့သာ့ၿပီ့ေသာအခါတျငး ေနာကးဆဵု့အဆငးံအေန်ဖင


Message ကိုေပ့ပို႕ေစမညး႕ Code ကိုေရ့သာ့ရပါမညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code သညး
သတးမြတးထာ့ေသာ messageTo ဟူေသာ Address သို႕ IChatSession တစးခုကိုတညးေဆာကးေစပါ
မညး၈ ေပ့ပို႕လိုေသာ message စာသာ့မ္ာ့သညး အဆိုပါ sesseion ကို်ဖတးသနး့၍ recipient သို႕
ေရာကးရိြသျာ့ေစမညး်ဖစးသညး၈

try {
IChatSession chatSession;
chatSession =
myIGTalkSession.createChatSession(messageTo.getText().toString(););
chatSession.sendTextMessage(messageText.getText().toString());
} catch (DeadObjectException ex) {
myIGTalkSession = null;
}

အထကးပါ Code ကိုထညး႕သျငး့ၿပီ့ေနာကးတျငး GoogleAPI.java ဖိုငးမြ Code အ်ပညး႕အစဵုကိုေအာကးပါ


အတိုငး့ေတျ႕်မငးရမညး်ဖစးသညး၈

package android_programmers_guide.GoogleAPI;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;

import android.content.ServiceConnection;
import android.database.Cursor;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.IBinder;
import android.provider.Im;
import android.graphics.Color;
import android.view.View;

မ္ကးပျငးံစာေပ 261
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

import android.widget.EditText;
import android.widget.ListView;
import android.widget.ListAdapter;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;
import com.google.android.gtalkservice.IGTalkSession;
import com.google.android.gtalkservice.IGTalkService;
import com.google.android.gtalkservice.GTalkServiceConstants;
import com.google.android.gtalkservice.IChatSession;

public class GoogleAPI extends Activity implements View.OnClickListener {


EditText messageText;
ListView messageList;
IGTalkSession myIGTalkSession;
EditText messageTo;
Button mSend;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myIGTalkSession = null;
messageText = (EditText) findViewById(R.id.messageText);
messageList = (ListView) findViewById(R.id.messageList);
messageTo = (EditText) findViewById(R.id.messageTo);
mSend = (Button) findViewById(R.id.btnSend);
mSend.setOnClickListener(this);
messageList.setBackgroundColor(Color.GRAY );
this.bindService(new
Intent().setComponent(GTalkServiceConstants.GTALK_SERVICE_COMPONENT),
connection, 0);

}
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
try {
myIGTalkSession =
IGTalkService.Stub.asInterface(service).getDefaultSession();
} catch (DeadObjectException e) {
myIGTalkSession = null;
}
}
public void onServiceDisconnected(ComponentName name) {
myIGTalkSession = null;
}
};

public void onClick(View view) {


Cursor cursor = managedQuery(Im.Messages.CONTENT_URI, null,
"contact=\'" + messageTo.getText().toString() + "\'",
null, null);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, cursor,
new String[]{Im.MessagesColumns.BODY},
new int[]{android.R.id.text1});
this.messageList.setAdapter(adapter);

try {
IChatSession chatSession;
chatSession =
myIGTalkSession.createChatSession(messageTo.getText().toString());

262 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

chatSession.sendTextMessage(messageText.getText().toString());
} catch (DeadObjectException ex) {
myIGTalkSession = null;
}
}
}

Compling and Running GoogleAPI


ထို႕ေနာကး Emulator အတျငး့တျငး GoogleAPI activity ကို Compile ်ပဳလုပးေမာငး့ႏြငးၾကညး႕ရပါမညး၈
အကယး၍ Connection ခ္ိတးဆကးမႈ ေအာငး်မငးခဲံလြ္ငး ေအာကးတျငးေဖား်ပထာ့ေသာပဵုအတိုငး့ ေတျ႕်မငး
ရမညး်ဖစးပါသညး၈

အဆိုပါ Activity ကိုစမး့သပးရနးအတျကး ကိုယးပိုငး gmail account သို႕”Hello” ဟူ၍ Message တစးေစာငး
ေပ့ပို႕ ၾကညး႕ၾကပါမညး၈

မ္ကးပျငးံစာေပ 263
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေအာကးပါပဵုအရ Send Msg ဟူေသာ Button ကိုႏိြပး၍ Message ကိုေပ့ပို႕ေစေတာံမညး်ဖစးသညး၈

ထို႕ေနာကး ေပ့ပို႕လိုေသာ Message ေရာကးမေရာကးသိေစရနး ေပ့ပို႕ေသာ gmail account ကို Web


page မြေအာကးပါပဵုအတိုငး့ဖျငးံ၍ စစးေဆ့ၾကညး႕ပါ၈ ေပ့ပို႕ထာ့ေသာ message ကိုေအာကးပါအတိုငး့
ေတျ႕ရိြရမညး်ဖစးသညး၈

264 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ထို႕ေနာကး Greetings! ဟူေသာစာသာ့ကို်ပနးလညးေပ့ပို႕မညး်ဖစးပါသညး၈ အဆိုပါ ်ပနးလညးေပ့ပို႕ေသာ


message ်မငးေတျ႕ႏိုငးေစရနးအတျကး ေအာကးတျငးေဖား်ပထာ့ေသာ ပဵုႏြစးပဵုကိုၾကညး႕ပါ၈ Activity Screen
၏ အေပၚဘကးနာ့တျငးရိြေသာ Information Bar ကို ဂရု်ပဳပါ၈

မ္ကးပျငးံစာေပ 265
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေနာကးလာမညး႕အခနး့တျငး ေနာကးဆဵု့ Application ကိုတညးေဆာကးၾကညး႕ၾကပါမညး၈ အဆိုပါ


Application တျငး SQLite database ႏြငးံ Google Map တစးခုမြ data record မ္ာ့ကို plot ်ပဳလုပးရနး
Google Maps Overlay မ္ာ့ကို ထညး႕သျငး့သဵု့စျဲပါမညး၈ အဆိုပါ နညး့ပညာမ္ာ့သညး Mobile
Development ်ပဳလုပးရာတျငးအလျနးအသဵု့ွငးေစသညး႕ နညး့ပညာမ္ာ့်ဖစးသညး႕အတျကး အဆိုပါ Tool
မ္ာ့ကိက
ု ၽျမး့က္ငးစျာအသဵု့်ပဳတတးသငးံပါသညး၈

(အိမးစာ) Add a Settings Feature to Your GoogleAPI Activity

အထကးတျငးအသဵု့်ပဳခဲံေသာ GoogleAPI တျငး Settings ဟူေသာ feature တစးခုကိုထညး႕သျငး့ေပ့ရပါ


မညး၈ အခနး့ (၅) တျငးေဖား်ပထာ့ေသာ AndroidViews ဟူေသာ Activity ကိုနမူနာအ်ဖစးေလံလာပါ၈
Button တစးခုကိုထပးၿဖညး႕၍ Application ၏ Layout attribute မ္ာ့ကိုေ်ပာငး့လဲႏိုငးရနးလုပးေဆာငးေပ့ရ
ပါမညး၈ ေအာကးတျငး်ပဳလုပးရမညး႕လုပးေဆာငးခ္ကးမ္ာ့ကိုေရ့သာ့ႏိုငးရနးေဖား်ပေပ့ထာ့ပါသညး၈

Message List ၏ Font ကိုေ်ပာငး့လဲရနး၇ Message List အတျငး့မြ Font Color ကိုေ်ပာငး့လဲရနး၇
Message List ၏ BackGround Color ကိုေ်ပာငး့လဲရနး စသညးတို႕ကိုကိုယးတိုငးလကးေတျ႕ လုပးေဆာင
ၾကညး႕သငးံပါသညး၈
266 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 11
Application: Find a Friend

မ္ကးပျငးံစာေပ 267
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Key Skills & Concepts


- Create a SQLite database
- Create a custom Content Provider
- Retrieve items from a database and pass them to a Google Maps Overlay

ယခုအခနး့တျငးယခုစာအုပး၏အႀကီ့ဆဵု့ေသာ Application တစးခုကိုတညးေဆာကးၾကညး႕ပါမညး၈ Android


Application ေရ့သာ့ရာတျငး လိုအပးေသာအယူအဆမ္ာ့၇ ေရ့သာ့ပဵုေရ့သာ့နညး့မ္ာ့၇ စဥး့စာ့ပဵု၇
စဥး့စာ့နညး့မ္ာ့ကို အေတားအတနးေဖား်ပခဲံၿပီ့်ဖစးသညး႕အတျကး အသဵု့ခ္ Application တစးခုကိုေရ့ဆျဲ
ရနးအခ္ိနးေကာငး့ပငး်ဖစးသညးဟုယူဆပါသညး၈

ယခုအအခနး့တျငး Android Emulator ေပၚတျငး SQLite database မ္ာ့တညးေဆာကး်ခငး့ကိုေလံလာရ


ပါမညး၈ ်ပဳလုပးတညးေဆာကးထာ့ေသာ database မြ data မ္ာ့ဖတးရြဳ်ခငး့၇ ေရ့သာ့်ခငး့ႏြငးံဖ္ကးပစး်ခငး့
စသညး႕တုိ႕ကိုလညး့ ်ပသသျာ့မညး်ဖစးပါသညး၈ အဆိုပါလုပးေဆာငးခ္ကးတျငး Database ႏြငးံတျဲဖကးအသဵု့
်ပဳရေသာ Content Provider တစးခုကိုတညးေဆာကးအသဵု့်ပဳရ်ခငး့ စေသာလုပးေဆာငးခ္ကးမ္ာ့ကိုပါ
လုပးေဆာငးရေစမညး်ဖစးပါသညး၈ ထို႕အ်ပငး database တျငးသိမး့ဆညး့ထာ့ေသာ data မ္ာ့ကို Google
Maps Overlay သို႕ေရ့သာ့၇ ရယူ်ခငး့မ္ာ့ကိုလညး့ ေလံလာရပါမညး၈ ယခငးေလံလာခဲံၿပီ့်ဖစးသညး႕
Google Map မ္ာ့ကိုသဵု့စျဲခဲံရာတျငး Overlay ကိုအသဵု့်ပဳခဲံရ်ခငး့မရိြခဲံပါ၈ Google Maps Overlay မ္ာ့ကို
အသဵု့်ပဳ်ခငး့်ဖငးံ Map ေပၚတျငး Shape မ္ာ့ေရ့ဆျဲ်ခငး့၇ text မ္ာ့ေရ့သာ့်ခငး့စသညးတို႕ကို လုပးေဆာငး
ႏိုငးေစ်ခငး့ေၾကာငးံ အခ္ကးအလကးမ္ာ့်ဖငးံအေထာကးအကူ်ပဳေစႏိုငးေသာ Map မ္ာ့ရရိြေစပါသညး၈

ယခု Project တျငး အပိုငး့ႏြစးပိုငး့ပါွငးေသာ Application တစးခုကိုတညးေဆာကးရပါမညး၈ အဆိုပါ


Application ၏ ပထမပိုငး့သညး mobile database တစးခုအတျငး့တျငး friends ဟူေသာ စကာ့လဵု့ကို
ွငးေရာကးရနးချငးံ်ပဳေပ့ေစမညး်ဖစးပါသညး၈ (Friend တစးေယာကးတျငး နာမညးတစးခုႏြငးံ geographic ဆုိငး
ရာ coordinate location တစးခုပါွငးမညး်ဖစးပါသညး) ထို႕ေၾကာငးံ အသဵု့်ပဳသူသညး Friend မ္ာ့ကို
ထညး႕သျငး့်ခငး့၇ ်ပငးဆငး်ခငး့၇ ဖ္ကးပစး်ခငး့်ပဳလုပးႏိုငးေစမညး်ဖစးပါသညး၈

အဆိုပါ Application ၏ ဒုတိယအပိုငး့တျငး Menu Item မ္ာ့ပါွငးပါမညး၈ အသဵု့်ပဳသူမြ အဆိုပါ Menu


Item ကိုေရျ့ခ္ယးလိုကးေသာအခါတျငး Application တျငး Google Map ကိုေဖား်ပေပ့မညး်ဖစးပါသညး၈
268 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အခနး့ (၆) တျငးေဖား်ပထာ့ခဲံသညး႕ Google Map ႏြငယ


းံ ခုအသဵု့်ပဳမညး႕ Google Map တို႕၏ ကျာ်ခာ့
ေသာအခ္ကးမြာ ယခုအသဵု့်ပဳမညး႕ Google Map တျငး Google Tile ေပၚတျငး အမညးမ္ာ့ေရ့သာ့
ႏိုငးေသာ၇ အခ္ကးအလကးမ္ာ့ ေပ့ႏိုငးေသာ၇ item မ္ာ့ေရ့ဆျဲေစႏိုငးေသာ Google Maps Overlay ကို
ထညး႕သျငး့ထာ့်ခငး့်ဖစးပါသညး၈

စတငးရနးအတျကး Eclipse အတျငး့တျငး Anroid Project အသစးတစးခု်ပဳလုပး၍ FindAFriend ဟုအမညး


ေပ့ပါ၈ ေအာကးေဖား်ပပါပဵုတျငးေတျ႕်မငးႏိုငးပါသညး၈

Google သညး Notepad ဟုေခၚေသာ နမူနာApplication တစးခုကို Android SDK အတျငး့တျငး


ထညး႕သျငး့ေပ့ထာ့ၿပီ့ note မ္ာ့ကို သိမး့ဆညး့်ခငး့၇ ်ပငးဆငး်ခငး့၇ ဖ္ကးပစး်ခငး့မ္ာ့ကို database
တစးခုအတျငး့တျငးလုပးေဆာငးႏိုငးေစရနး ေရ့သာ့်ပထာ့ပါသညး၈ ထိုဖိုငးကိုနမူနာအ်ဖစးအသဵု့်ပဳ၍ Friends
database ၏ Interface ကိုတညးေဆာကးရနး အဆိုပါ ဖိုငးမြ နမူနာ Code မ္ာ့ကို ်ပငးဆငးေပ့ရပါမညး၈

မ္ကးပျငးံစာေပ 269
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

အဆိုပါ Notepad ၏အလုပးလုပးေဆာငးပဵုကို်မငးေတျ႕ေစလိုပါက Eclipse အတျငး့တျငးအဆိုပါ Project ကို


Load ်ပဳလုပးၾကညး႕ၿပီ့ Emulator အတျငး့တျငး Run ၾကညး႕ႏိုငးပါသညး၈ အဆိုပါ Code မ္ာ့ကို်ပငးဆငး်ခငး့
်ဖငးံစတငးရမညး်ဖစးၿပီ့ ေနာကးပိုငး့လာမညး႕အပိုငး့တျငး SQLite database တစးခုတညးေဆာကး်ခငး့က
ေဖား်ပေပ့သျာ့မညး်ဖစးပါသညး၈

Creating a SQLite Database


Android Device မ္ာ့တျငး Internal ပါွငးသညး႕ SQLite database တစးခုကိုအသဵု့်ပဳႏိုငးပါသညး၈ အဆိုပါ
database ကိုအသဵု့်ပဳ်ခငး့၏ရညးရျယးခ္ကးမြာ Actvity မ္ာ့တျငးအသဵု့်ပဳႏိုငးေစရနးအတျကး Information
မ္ာ့ကိုသိမး့ဆညး့ထာ့သညး႕ Location တစးခုကို အသဵု့်ပဳသူသို႕ ်ပသႏိုငးရနး်ဖစးပါသညး၈ အကယး၍
Microsoft SQL Server ႏြငးံ SQLite ကိုအသဵု့်ပဳဖူ့ခဲံလြ္ငး ယခုအသဵု့်ပဳမညး႕ Android SQLite database
ကိုအသဵု့်ပဳေသာအခါတျငး မ္ာ့စျာထူ့်ခာ့မညးမဟုတးပါ၈ ထိုသို႕အသဵု့်ပဳဖူ့သညး်ဖစးေစ၇ အသဵု့မ်ပဳဖူ့သညး
်ဖစးေစ ယခုအပိုငး့တျငး function ၿပညး႕ွသညး႕ SQLite database တစးခုကိုတညးေဆာကးရနးလိုအပးေသာ
လုပးေဆာငးခ္ကးမ္ာ့ကိုေဖား်ပေပ့မညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Android Emulator အတျငး့တျငး
database တစးခုကိုတညးေဆာကးရပါမညး၈ ထိုသို႕တညးေဆာကးရနးအတျကး Android SDK command-
line tools မ္ာ့ကိွ
ု ငးေရာကးရပါမညး၈ ထိုသို႕ွငးေရာကးရနးအတျကး shell ဟူေသာ Command ကိုအသဵု့်ပဳ
၍ Android Server အတျငး့သို႕ွငးေရာကးႏိုငးပါသညး၈

Path Statement ကို Setting ်ပဳလုပးရနးႏြငးံ Command-line Tool မ္ာ့ကိုအသဵု့်ပဳနညး့မ္ာ့ကိုမမြတးမိပါ


က အခနး့ (၀) ကို်ပနးလညးေလံလာပါ၈

Server အတျငး့တျငး Shell Command ်ဖငးွ


ံ ငးေရာကးၿပီ့ေနာကး database တညးေဆာကးမညး႕လမး့ေ
ၾကာငး့ကို navigate ်ပဳလုပွ
း ငးေရာကးေပ့ရပါမညး၈ Android အတျကးတညးေဆာကးထာ့ေသာ SQLite
database အာ့လဵု့ကို data/data/<package>/databases ဟူေသာ directory ထဲတျငးထညး႕သျငး့ထာ့
တတးၾကပါသညး၈ ထို႕ေၾကာငးံ လကးရိြ Location မြ အဆိုပါ database ရိြသညး႕ Location သို႕ေ်ပာငး့လဲရန
cd ဟူေသာ Command ကိုအသဵု့်ပဳရပါမညး၈ ထို႕ေနာကး ls ဟူေသာ Command ်ဖငးံ အဆိုပါ directory
အတျငး့တျငးရိြေသာ ဖိုငးမ္ာ့ကို list လုပးၾကညး႕ရြဳႏိုငးမညး်ဖစးပါသညး၈ အထကးပါ လမး့ေၾကာငး့မြ
<package> ဟူေသာ Directory သညးယခုတညးေဆာကးမညး႕ Application ၏အမညး်ဖစးသညး႕

270 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အတျကးယခုေနရာတျငးေအာကးတျငး်ပထာ့သညး႕ပဵုအတိုငး့android_programmers_guide.FindAFriend
ဟူေသာ Directory ကိုအသဵု့်ပဳရပါမညး၈

အကယး၍ အဆိုပါ android_programmers_guide.FindAFriend ဟူေသာ directory မရိြပါက Project


မတညးေဆာကးရေသ့၍်ဖစးႏိုငးၿပီ့ တညးေဆာကးၿပီ့ပါက Project အမညးကိုလိုကး၍ Directory ကိုရြာေဖျ
ရမညး်ဖစး၍ မြနးကနးေသာ Directory ကိွ
ု ငးေရာကးရပါမညး၈

ထိုကေနာကး android_programmers_guide.FindAFriend ဟူေသာ directory ကိွ


ု ငးေရာကးၿပီ့ေသာ
အခါတျငး ls ဟူေသာ Command ကိုေမာငး့ႏြငးပါ၈ ထို Command သညး သတးမြတွ
း ငးေရာကးထာ့ေသာ
Directory ထဲမြ ဖိုငးမ္ာ့၇ Directory မ္ာ့ကို ၾကညး႕ရြဳေစႏိုငးပါသညး၈ ထိုသို႕ၾကညး႕ေသာအခါတျင
မညးသညး႕ဖိုငး၇ မညးသညး႕ Directory ကိုမြ္ေတျ႕ရိြရလိမးံမညးမဟုတးပါ၈ SQLite database မ္ာ့သညး
databases ဟူေသာ directory ထဲတျငးတညးေဆာကးရေသာေၾကာငးံ Directory အသစးတစးခုကို တညး

မ္ကးပျငးံစာေပ 271
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေဆာကးေပ့ရပါမညး၈ mkdir ဟူေသာ command ကိုအသဵု့်ပဳ၍ directory တစးခုတညးေဆာကးႏိုငးပါ


သညး၈ ထို႕ေၾကာငးံ mkdir databases ဟူေသာ Command ကိုအသဵု့်ပဳ၍ databases ဟူေသာ
directory တစးခုကိုတညးေဆာကးေပ့ရပါမညး၈

သတိ်ပဳရနး၈ မ္ာ့ေသာအာ့်ဖငးံ Server သို႕ွငးေရာကးရနး shell ကိုအသဵု့်ပဳရာတျငး Root ်ဖငးွ


ံ ငးေရာကး
တတးၾကပါသညး၈ ထို႕ေၾကာငးံ ယခုတညးေဆာကးလိုကးေသာ directory ကိrု oot user တစးခုတညး့်ဖငးံ
သာွငးေရာကးေစႏိုငးမညး်ဖစးသညး၈ အကယး၍ Activity ကိုေမာငး့ႏြငးေသာအခါတျငး ်ပသနာတစးစဵုတစးရာ
သာေပၚေပါကးလာခဲံပါက အဆိုပါ Activity ကိုအ်ခာ့ေသာ user ်ဖငးံ (root မဟုတးေသာ user) ေမာငး့ႏြငး
ေသာေၾကာငးံ်ဖစးႏိုငးပါသညး၈ ထိုကဲံသို႕ေသာ ်ပသနာကိုေ်ဖရြငး့ရနး အတျကး chmod 777 databses ဟု
ရိုကးထညး႕ၿပီ့ ယခုေဖား်ပပါ databases directory ကို အာ့လဵု့အတျကး ွငးေရာကးႏိုးငးေစရနး ်ပဳလုပးေပ့
နိုငးပါသညး၈ သို႕ရာတျငး အနာဂတးတျငး Android မြ ်ပသနာ်ဖစးေစေသာ Item မ္ာ့အတျကး အာ့လဵု့ေသာ
အသဵု့်ပဳသူမြ ွငးေရာကးချငးံရေစရနးအတျကး အဆိုပါ chmod 777 ဟူေသာ Command ကို အသဵု့်ပဳရနး
မေမံေလြ္ာံသငးံပါ၈

ထို႕ေနာကး database ဟူေသာ directory တစးခုရရိြၿပီ့်ဖစးေသာေၾကာငးံ database တစးခုကိုတည


ေဆာကးေစႏိုငးၿပီ်ဖစးပါသညး၈ Cd ဟူေသာ Command ်ဖငးံတညးေဆာကးထာ့ေသာ databases ဟူေသာ
directory သို႕ွငးေရာကးပါ၈ database ဟူေသာ directory အတျငး့သို႕ေရာကးေသာအခါတျငး sqlite3
ဟူေသာ tool ကိုအသဵု့်ပဳ၍ database တစးခုကိုတညးေဆာကးႏိုငးၿပီ့ အဆိုပါ database ကို friends.db
ဟုအမညးေပ့ပါမညး၈ ေအာကးပါ Command ကိုၾကညး႕ရြဳပါ၈

# sqlite friends.db

Command ကိုေအာငး်မငးစျာလုပးေဆာငးႏိုငးပါက SQLite3 version message တစးခုကိုေတျ႕်မငးရမည


်ဖစးပါသညး၈ ယခုေနရာတျငး version 3.5.0 ကိုအသဵု့်ပဳၿပီ့ SQLite3 ၏ prompt မြာ sqlite> ဟူ၍်ဖစးပါ
သညး၈ အဆိုပါေဖား်ပခ္ကးသညး database တစးခုကိုေအာငး်မငးစျာတညးေဆာကးႏိုငးၿပီ့်ဖစးေသားလညး့
database မြာမညးသညး႕ data မြ္မရိြ (အချဵ) ဟူ၍ေဖား်ပ်ခငး့်ဖစးပါသညး၈ Database ထဲတျငး မညးသညး႕
table သို႕မဟုတး data မြ္မပါွငးပါ၈ ထို႕ေၾကာငးံေနာကးတစးဆငးံအရ ်ပဳလုပးမညး႕ Activity ၏ data မ္ာ့
ကိုသိမး့ဆညး့ရနးတျကး table တစးခုကိုတညးေဆာကးေပ့ရပါမညး၈ Table တစးခုတညးေဆာကး၍ friends
ဟုအမညးေပ့ၾကပါမညး၈ အဆိုပါ Table တျငး ID၇ Name၇ Location၇ Created ႏြငးံ Modified ဟူေသာ

272 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Field မ္ာ့ပါွငးမညး်ဖစးပါသညး၈ အဆိုပါ Field မ္ာ့သညး Project တညးေဆာကးရာတျငး လိုအပးသညး႕


အခ္ကးအလကးမ္ာ့ကို ေပ့စျမး့မညး်ဖစးပါသညး၈

Friends ဟူေသာ Table ကို database အတျငး့တျငးတညးေဆာကးရနးအတျကး ေအာကးပါ Command ကို


sqlite> ဟူေသာ Prompt တျငးရိုကးထညး႕ေပ့ရပါမညး၈

CREATE TABLE friends (_id INTEGER PRIMARY KEY, name TEXT, location TEXT,
created INTEGER, modified INTEGER);

အထကးပါ Command ကိုေအာငး်မငးစျာေမာငး့ႏြငးၿပီ့ေသာအခါတျငး sqlite> ဟူေသာ Prompt သို႕


ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့်ပနးလညးေရာကးရိြလာသညးကိုေတျ႕်မငးရမညး်ဖစးပါသညး၈

ထိုအခါ တညးေဆာကးၿပီ့ေသာ database သညးအသဵု့်ပဳရနးအဆငးံသငးံ်ဖစးေနေစၿပီ်ဖစးပါသညး၈ ထို႕


ေၾကာငးံ .exit ဟူေသာ Command ်ဖငးံ SQlite မြထျကးရပါမညး၈ ထိုအခါ shell session သို႕်ပနးလညး
ေရာကးရိြသျာ့မညး်ဖစးၿပီ့ Eclispe တို႕်ပနးလညးသျာ့ေရာကးပါ၈

Database တညးေဆာကး်ခငး့သညး Application ကို Setting ်ပဳလုပး်ခငး့၏ ပထမအဆငးံသာ်ဖစးပါသညး၈


ထို႕ေၾကာငးံ database ႏြငးံ သကးဆိုငးေသာ Table ကိုတညးေဆာကးၿပီ့ေသာအခါတျငး data မ္ာ့ကို
access ်ပဳလုပးေစမညး႕ method တစးခုကိုလိုအပးမညး်ဖစးပါသညး၈ ထိုကဲံသုိ႕ data access ်ပဳလုပးႏိုငး
မ္ကးပျငးံစာေပ 273
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ေသာ method ကို Android တျငး Content Provider ဟုေခၚပါသညး၈ ေနာကးလာမညး႕အပိုငး့တျင


Content Proivder တစးခုကို database အသစး်ဖငးံအသဵု့်ပဳရနး တညးေဆာကးရမညး်ဖစးၿပီ့ data မ္ာ့ကို
access ်ပဳလုပးထညး႕သျငး့ၾကရမညး်ဖစးပါသညး၈

Creating a Custom Content Provider


Android သညး Content Provider မ္ာ့ကို Data မ္ာ့ Access ်ပဳလုပးယူရနးအတျကးအသဵု့်ပဳပါသညး၈
အခနး့ (၆) တျငး GPS မြ Coordinate information မ္ာ့ကို ွငးေရာကးရနးႏြငံးရယူရနးအတျကး အသဵု့်ပဳခဲံ
ၿပီ့်ဖစးပါသညး၈ အဆိုပါ Content Provider မ္ာ့သညး Contact List မ္ာ့၇ IM မ္ာ့ႏြငးံ Recent Call မ္ာ့
အတျကးသာ်ဖစးပါသညး၈ သို႕ေသား ၁ငး့ Content Provider မ္ာ့သညး Friends database တျငးအသဵု့်ပဳ
ရမညး႕ Content Provider မ္ာ့ႏြငးံမတူပါ၈ Android သညးအလျနး်ပဳလျယး်ပငးလျယး အသဵု့်ပဳႏိုငးေသာ စနစး
်ဖစးေသာေၾကာငးံ ကိုယးပိုငး Custom Content Provider မ္ာ့ကို ကိုယးပိုငး Custom Data မ္ာ့ႏြငးံ ပူ့တျဲ
လုပးေဆာငးရနး ချငးံ်ပဳေပ့ထာ့ပါသညး၈ ယခုအပိုငး့တျငး Friends database ်ဖငးံပူ့တျဲအလုပးလုပးႏိုငးေစရန
Content Provider တစးခုကိုတညးေဆာကးရမညး်ဖစးပါသညး၈ ထိုသို႕တညးေဆာကး်ခငး့်ဖငးံ Friend data
မ္ာ့ကို access ်ပဳလုပးရယူႏိုငးၿပီ့ Screen ေပၚတျငးလညး့ေဖား်ပေပ့ေစႏိုငးမညး်ဖစးပါသညး၈ ေနာကးလာ
မညး႕အပိုငး့တျငး strings.xml ဖိုငးကို်ပငးဆငးရမညး်ဖစးပါသညး၈ အဆိုပါဖိုငးတျငး ယခု Activity တျငးအသဵု့်ပဳ
ရမညး႕ Global string content အခ္ိဳ႕ ပါွငးပါသညး၈

Editing the strings.xml


ေရြ့ဦ့စျာ Project အတျကးလိုအပးေသာ strings.xml ဖိုငးကို်ပငးဆငးေပ့ရပါမညး၈ အဆိုပါ strings.xml
ဖိုငးသညး Project တိုငး့တျငးပါွငးေသားလညး့ ယခုအခ္ိနးထိ ေလံလာသဵု့စျဲခဲံရ်ခငး့မရိြေသ့ပါ၈ အဆိုပါ ဖုိငး
သညး Activity မ္ာ့တျငး အသဵု့်ပဳေသာ static string မ္ာ့ကို ထိနး့သိမး့ထာ့ရိြေစပါသညး၈

ပဵုမြနးအာ့်ဖငးံ Activity တစးခုကိုမေရ့သာ့မီတျငး Activity အတျငး့တျငးအသဵု့်ပဳရမညး႕ string အာ့လဵု့ကို


သတးမြတးဆဵု့်ဖတးရနး်ဖစးႏိုငးမညးမဟုတးပါ၈ ထို႕ေၾကာငးံ Activity တညးေဆာကးၿပီ့ေသာအခါတျငးမြ လိုအပး
သညး႕ entry မ္ာ့ကို strings.xml ဖိုငးတျငးေပါငး့ထညး႕ေပ့ရေလံရိြပါသညး၈ သို႕ရာတျငး အဆငးံဆငးံလုပး
ကိုငးရေသာ နညး့စနစးကိုခ္ိဳ့ဖ္ကး၍ Strings.xml ဖိုငး၏ Content အ်ပညး႕အစဵုကိုေဖား်ပေပ့မညး်ဖစးပါ

274 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

သညး၈ ထို႕ေၾကာငးံ strings.xml ဖိုငးမြ Code မ္ာ့ကို ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့်ဖစးေအာငး


်ပငးဆငးေပ့ရပါမညး၈

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


<resources>
<string name="app_name">FindAFriend</string>
<string name="menu_delete">Delete</string>
<string name="menu_insert">Add Friend</string>
<string name="find_friends">Find Friends</string>
<string name="menu_revert">Revert</string>
<string name="menu_discard">Discard</string>
<string name="resolve_edit">Edit location</string>
<string name="resolve_title">Edit name</string>
<string name="title_create">Create Friend</string>
<string name="title_edit">Edit Friend</string>
<string name="title_notes_list">Friends</string>
<string name="title_note">Location</string>
<string name="title_edit_title">Friend Name:</string>
<string name="button_ok">OK</string>
<string name="error_title">Error</string>
<string name="error_message">Error loading note</string>
</resources>

အထကးပါအတိုငး့ strings.xml ဖိုငးကို်ပငးဆငးၿပီ့ေနာကး Code မ္ာ့ေရ့သာ့ရနးအတျကး .java ဖိုငးတစးဖိုငး


ကိုတညးေဆာကးေပ့ရပါမညး၈ ထိုဖိုငးကို FriendsProvider.java ဟုအမညးေပ့ပါမညး၈ ထို႕ေနာကး data
definition ်ပဳလုပးရနးအတျကး ေနာကးထပး .java ဖိုငးတစးဖိုငးတညးေဆာကးရဦ့မညး်ဖစးၿပီ့ Friend.java
ဟုအမညးေပ့ပါမညး၈ ထိုဖိုငးကိုတညးေဆာကးရ်ခငး့မြာ Friends ၏ data structure ကိd
ု efine
်ပဳလုပးရနးနြငးံ Content Provider ကိုမြနးကနးစျာွငးေရာကးေစႏိုငးရနးအတျကး်ဖစးပါသညး၈ (မြတးသာ့ရနးမြာ
Provider သညး Project အတျကး အလုပးလုပးေဆာငးေစမညး႕ Class တစးခုသာ်ဖစးေသာေၾကာငးံ .xml
layout ဖိုငးကို တညးေဆာကးရနးမလိုအပးပါ)

ထို႕ေၾကာငးံ Friends.java ဖိုငး်ဖငးံစတငးလုပးေဆာငးၾကညး႕ပါမညး၈ အဆိုပါ Class ကိုအတျကး package


ႏြစးခုကို import ်ပဳလုပးရနးလိုအပးပါသညး၈

import android.net.Uri;
import android.provider.BaseColumns;

BaseColumns ကို main Friends Class ၏ subclass တစးခုမြ implement ်ပဳလုပးပါလိမးံမညး၈ Subclass
ကို Friend ဟုအမညးေပ့ရပါမညး၈ အဘယးေၾကာငးံဆိုေသား ၁ငး့တျငး Frined dataset မြ friend တစးဦ့

မ္ကးပျငးံစာေပ 275
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ပါွငးေနေသာေၾကာငးံ်ဖစးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ code သညး class တစးခုကို setup


်ပဳလုပးရနးလိုအပးေသာ outline မ္ာ့်ဖစးပါသညး၈

public final class Friends {


public static final class Friend implements BaseColumns {
}
}

အဆိုပါ Class တျငး Friends database ၏ Column တစးခုစီခ္ငး့စီကိုလညး့ေကာငး့၇ Content URI ႏြငးံ
Record မ္ာ့အတျကး default sort order ကိုလညး့ေကာငး့သတးမြတးေပ့ႏိုငးသညး႕ static variable
အခ္ိဳ႕ပါွငးပါသညး၈ Content URI တစးခုကို Handle ်ပဳလုပးေစမညး႕ Content ကို identify ်ပဳလုပးရနး
အသဵု့်ပဳပါသညး၈ တနးဖို့မ္ာ့သညးတစးခုႏြငးံတစးခု ထပးတူမရိြေစသညး႕ တနးဖို့မ္ာ့်ဖစးပါသညး၈ define
်ပဳလုပးရနးလိုအပးသညး႕ string မ္ာ့မြာေအာကးပါအတိုငး့်ဖစးပါသညး၈

public static final Uri CONTENT_URI


=
Uri.parse("content://android_programmers_guide.FindAFriend.Friends/friend");
public static final String DEFAULT_SORT_ORDER = "modified DESC";
public static final String NAME = "name";
public static final String LOCATION = "location";
public static final String CREATED_DATE = "created";
public static final String MODIFIED_DATE = "modified";

အဆိုပါ Variable မ္ာ့သတးမြတး်ခငး့ႏြငးံအတူ Friedns Class ၏ Content မ္ာ့သညး အတူတကျေကာငး့


မျနးစျာ ပါလာမညး်ဖစးသညး၈ ်ပညး႕စဵုေသာ ဖိုငးကိုေအာကးတျငးၾကညး႕ရြဳနိုငးပါသညး၈
package android_programmers_guide.FindAFriend;

import android.net.Uri;
import android.provider.BaseColumns;

public final class Friends {


public static final class Friend implements BaseColumns {
public static final Uri CONTENT_URI
=
Uri.parse("content://android_programmers_guide.FindAFriend.Friends/friend");
public static final String DEFAULT_SORT_ORDER = "modified DESC";
public static final String NAME = "name";
public static final String LOCATION = "location";
public static final String CREATED_DATE = "created";

public static final String MODIFIED_DATE = "modified";


}
}

276 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေနာကးလာမညး႕အပိုငး့တျငး Content Provider တစးခုကိုတညးေဆာကး်ခငး့ လုပးေဆာငးခ္ကးမ္ာ့ကို ေလံ


လာရပါမညး၈

Creating Your Content Provider


Eclipse ကိုအသဵု့်ပဳ၍ FrinedsProvider.java ဖိုငးကိုဖျငးံပါ၈ အဆိုပါဖိုငးသညး Project အတျငး့ Content
Provider အ်ဖစးအသဵု့်ပဳမညး႕ဖိုငးလညး့်ဖစးပါသညး၈ Friends database မြ data မ္ာ့ကိုရယူေစႏိုငးရန
အတျကး Activity အတျငး့တျငး အဆိုပါတညးေဆာကးထာ့ေသာ custom Content Provider ကိုအသဵု့်ပဳ
ရပါမညး၈

ထဵု့စဵအတိုငး့ပငး package မ္ာ့ import ်ပဳလုပး်ခငး့မြစတငးရပါမညး၈ ထို႕ေၾကာငးံ Friends class နြငးံ


အ်ခာ့ေသာ လုိအပးသညး႕ class အခ္ိဳ႕ကို import ်ပဳလုပးေပ့ရနးလိုအပးပါသညး၈

import android_programmers_guide.FindAFriend.Friends;
import android.content.*;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import java.util.HashMap;

ေတျ႕်မငးရသညး႕အတိုငး့ပငး package မ္ာ့စျာကို import ်ပဳလုပးထာ့ေၾကာငး့ေတျ႕ရပါမညး၈ အမ္ာ့စုမြာ


SQL ်ဖငးံသကးဆိုငးပါသညး၈ အဆိုပါ package မ္ာ့အေၾကာငး့အနညး့ငယးေလံလာၾကညး႕ၾကပါမညး၈

ပထမဆဵု့အသဵု့်ပဳထာ့ေသာ package မြာ android.content ်ဖစးပါသညး၈ တညးေဆာကးထာ့ေသာ


Content Provider တစးခုအတျကး လိုအပးေသာ method မ္ာ့ကို အသဵု့်ပဳႏိုငးရနး FriendProvider class
သညး ContentProvider ကို extend ်ပဳလုပးရနးလိုအပးမညး်ဖစးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ
provider ကိုေတာကးေလြ္ာကးအသဵု့်ပဳရမညး႕ variable definition အမ္ာ့အ်ပာ့ပါွငးေသာ class
outline ကိုၾကညး႕ပါ၈

public class FriendsProvider extends ContentProvider {


private SQLiteDatabase mDB;
private static final String TAG = "FriendsProvider";

မ္ကးပျငးံစာေပ 277
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

private static final String DATABASE_NAME = "friends";


private static final int DATABASE_VERSION = 2;

private static HashMap<String, String> FRIENDS_PROJECTION_MAP;

private static final int FRIENDS = 1;


private static final int FRIENDS_ID = 2;
private static final UriMatcher URL_MATCHER;}

Content Provider တျငး onCreate()၇ query()၇ delete() ႏြငးံ update() ကဲံသို႕ေသာ ထိနး့ခ္ဳပးေစႏိုငး
မညး႕ method မ္ာ့စျာပါွငးပါသညး၈ အဘယးေၾကာငးံဆိုေသား အဆိုပါ method မ္ာ့ကို Content
Provider ကိုအသဵု့်ပဳ၍ Activity မြေခၚယူေစေသာအခါ Friends database ကိွ
ု ငးေရာကးႏိုငးေစရနး
အတျကး ၁ငး့တို႕ကို override ်ပဳလုပးထိနး့ခ္ဳပးရပါမညး၈

Override ်ပဳလုပးထိနး့ခ္ဳပးေစမညး႕ onCreate() ဟူေသာ method သညး SQLiteOpenHelper ကိုေခၚယူ


ေစမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ ContentProvider ၏ onCreate() ဟူေသာ method ကို မထိနး့ခ္ဳပးႏိုငမ
း ီ
တျငး SQLiteOpenHelper ကို တို့ခ္ဲ႕ extend ်ပဳလုပးရနးအတျကး Class တစးခုကိုတညးေဆာကးေပ့ရပါ
လိမးံမညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့သညး SQLiteOpenHelper ကို extend ်ပဳလုပးေစႏိုငး
သညး႕ Content Provider ၏ Subclass တျငးေရ့သာ့ရမညး႕ Code မ္ာ့်ဖစးပါသညး၈

private static class DatabaseHelper extends SQLiteOpenHelper {

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE friends (_id INTEGER PRIMARY KEY,"
+ "name TEXT," + "location TEXT," + "created INTEGER,"
+ "modified INTEGER" + ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + "to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS friends");

onCreate(db);
}
}

တညးေဆာကးထာ့ၿပီ့ေသာ DatabaseHelper Class တျငး Override ်ပဳလုပးထိနး့ခ္ဳပးႏိုငးေသာ method


ႏြစးခုပါွငးပါသညး၈ ၁ငး့တို႕မြာ onCreate() method ႏြငးံ onUpgrade() method တို႕်ဖစးပါသညး၈
onCreate() method ကို database ကို Code မ္ာ့ေရ့သာ့၍တညးေဆာကးေသာအခါ သို႕မဟုတး table
definition မရိြေသာအခါတျငးအသဵု့်ပဳရပါသညး၈
278 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခငးေဖား်ပခဲံသညး႕ adb shell မြ database structure ကိုတညးေဆာကးသကဲံသုိ႕ DatabaseHelper ၏


onCreate() method ်ဖငးံ မ်ပဳလုပးမတညးေဆာကးႏိုငးပါ၈

ီDatabaseHelper Class ကိုတညးေဆာကးၿပီ့ေသာအခါတျငး onCreate () method ်ဖငးံ Content


Provider ကို Override ်ပဳလုပးႏိုငးၿပီ်ဖစးပါသညး၈

@Override
public boolean onCreate() {
DatabaseHelper dbHelper = new DatabaseHelper();
mDB = dbHelper.openDatabase(getContext(), DATABASE_NAME, null,
DATABASE_VERSION);
return (mDB == null) ? false : true;
}

၁ငး့သညးအေတားအတနးရို့ရြငး့ေသာ method ်ဖစးပါသညး၈ အဆဵု့တျငး Database ကိုဖျငးံထာ့သညး မဖျငးံ


ထာ့သညးကိုစစးေဆ့ႏိုငးေသာ Boolean variable တစးခုကိုေတျ႕်မငးရေစမညး်ဖစးပါသညး၈ Sibling
(main) class ထဲတျငးတညးေဆာကး ထာ့ေသာ အဆိုပါ SQLiteOpenHelper ကို Friends database
ကိုဖျငးံရနးအတျကး အသဵု့်ပဳရပါသညး၈ သတိ်ပဳရမညး႕အခ္ကးမြာ DatabaseHelper Class သို႕ database
အမညးကို pass ်ပဳလုပးရမညး်ဖစးပါသညး၈ database object (mDB) သညး return ်ပနးေသာအခါတျငး
null မဟုတးခဲံပါက database ကိုေအာငး်မငးစျာဖျငးံထာ့ၿပီ့်ဖစးၿပီ့ အခ္ကးအလကးမ္ာ့ဖတးရြဳထညး႕သျငး့
ႏိုငးၿပီ်ဖစးပါသညး၈ ထို႕ေနာကး ContentProvider class ၏ query() method ကို override ်ပဳလုပးရပါ
မညး၈ Query() method ကို Activity မြ Content Provider ကို်ဖတးသနး့၍ database အတျငး့မြ record
မ္ာ့ရယူႏိုငးေစရနး ေခၚယူရပါသညး၈ Query() method ၏ override ်ပဳလုပးႏိုငးေစမညး႕ Code မ္ာ့ကို
ေအာကးတျငးေတျ႕်မငးႏိုငးပါသညး၈

@Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

switch (URL_MATCHER.match(url)) {
case FRIENDS:
qb.setTables("friends");
qb.setProjectionMap(FRIENDS_PROJECTION_MAP);
break;
case FRIENDS_ID:
qb.setTables("friends");
qb.appendWhere("_id=" + url.getPathSegments().get(1));
break;
default:

မ္ကးပျငးံစာေပ 279
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

throw new IllegalArgumentException("Unknown URL " + url);


}

String orderBy;
if (TextUtils.isEmpty(sort)) {
orderBy = Friends.Friend.DEFAULT_SORT_ORDER;
} else {
orderBy = sort;
}

Cursor c = qb.query(mDB, projection, selection, selectionArgs, null,


null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), url);
return c;
}

Query() method သညး database URL မြ ၁ငး့အတျငး့ Pass ်ပဳလုပးရနးအတျကး validity ကိုစစးေဆ့
ၾကညး႕မညး်ဖစးၿပီ့ query sort order ကိုလညး့ define ်ပဳလုပးေစမညး်ဖစးပါသညး၈ URL check ဆိုသညး
မြာ Friends databse တစးခုတညး့ကို ွငးေရာကးရနးႀကိဳ့စာ့်ခငး့ကိုေသခ္ာေအာငး်ပဳလုပးေစ်ခငး့ ်ဖစးပါ
သညး၈ အကယး၍ အ်ခာ့ေသာ activity တစးခုမြ သို႕မဟုတး အ်ခာ့ေသာ Content Provider တစးခုမြ
database သို႕ွငးေရာကးရနးႀကိဳ့ပမး့သညး႕အခါတျငး query() method ကိုခ္နးလြပးထာ့ခဲံမညး်ဖစးပါသညး၈

Method ၏အဆဵု့သို႕ဦ့တညးေစရနး SQLiteQueryBuilder တစးခုကိုအသဵု့်ပဳ၍ query တစးခုကိုလုပး


ေဆာငးေပ့ရပါမညး၈ ရရိြလာေသာ dataset ကို Cusor တစးခုသို႕ assign ်ပဳလုပးရနးအတျကး ေအာကးပါ
cdoe မ္ာ့ကိုအသဵု့်ပဳရပါမညး၈

Cursor c = qb.query(mDB, projection, selection, selectionArgs, null,


null, orderBy);

Cursor တစးခုဆိုသညးမြာ Device တစးခုမြချငးံ်ပဳေစေသာ records မ္ာ့ႏြငးံ Column မြ Information


မ္ာ့ကို Return ်ပဳလုပးေစ်ခငး့ပငး်ဖစးပါသညး၈ update() method၇ delete() method ႏြငးံ insert()
method တို႕ကို design ်ပဳလုပးရနး အနညး့ငယးလျယးကူပါသညး၈ အဆိုပါ method ၀ခုကို ေအာကးေဖား်ပ
ပါ Code မ္ာ့အတိုငး့ Override ်ပဳလုပးပဵုကိုေဖား်ပေပ့ထာ့ပါသညး၈

@Override
public Uri insert(Uri url, ContentValues initialValues) {
long rowID;
ContentValues values;
if (initialValues != null) {
values = new ContentValues(initialValues);
} else {
values = new ContentValues();
}

280 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

if (URL_MATCHER.match(url) != FRIENDS) {
throw new IllegalArgumentException("Unknown URL " + url);
}

Long now = Long.valueOf(System.currentTimeMillis());


Resources r = Resources.getSystem();

if (values.containsKey(Friends.Friend.CREATED_DATE ) == false) {
values.put(Friends.Friend.CREATED_DATE, now);
}

if (values.containsKey(Friends.Friend.MODIFIED_DATE) == false) {
values.put(Friends.Friend.MODIFIED_DATE, now);
}

if (values.containsKey(Friends.Friend.NAME) == false) {
values.put(Friends.Friend.NAME,
r.getString(android.R.string.untitled));
}

if (values.containsKey(Friends.Friend.LOCATION) == false) {
values.put(Friends.Friend.LOCATION , "");
}

rowID = mDB.insert("friends", "friend", values);


if (rowID > 0) {
Uri uri = ContentUris.withAppendedId(Friends.Friend.CONTENT_URI
, rowID);
getContext().getContentResolver().notifyChange(uri, null);
return uri;
}

throw new SQLException("Failed to insert row into " + url);


}

@Override
public int delete(Uri url, String where, String[] whereArgs) {
int count;
long rowId = 0;
switch (URL_MATCHER.match(url)) {
case FRIENDS:
count = mDB.delete("friends", where, whereArgs);
break;

case FRIENDS_ID:
String segment = url.getPathSegments().get(1);
rowId = Long.parseLong(segment);
count = mDB
.delete("friends", "_id="
+ segment
+ (!TextUtils.isEmpty(where) ? " AND (" + where
+ ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URL " + url);
}

getContext().getContentResolver().notifyChange(url, null);
return count;

မ္ကးပျငးံစာေပ 281
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

@Override
public int update(Uri url, ContentValues values, String where, String[]
whereArgs) {
int count;
switch (URL_MATCHER.match(url)) {
case FRIENDS:
count = mDB.update("friends", values, where, whereArgs);
break;

case FRIENDS_ID:
String segment = url.getPathSegments().get(1);
count = mDB
.update("friends", values, "_id=" + segment
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URL " + url);
}

getContext().getContentResolver().notifyChange(url, null);
return count;
}

အဆိုပါ method မ္ာ့အတျငး့မြ code မ္ာ့အေၾကာငး့ကို ကုိယးတိုငးေလံလာၾကညး႕ရပါမညး၈ Content


Provider ၏ ေနာကးဆဵု့ေသာအပိုငး့မြာ Friends data ၏ type မ္ာ့ကို return ်ပနးေစႏိုငးေသာ getType
() ဟူေသာ method ကိုအသဵု့်ပဳ်ခငး့ပငး်ဖစးပါသညး၈ ကိုယးပိုငး type တစးခုအ်ဖစး တညးေဆာကးေသာ
အခါတျငး ေအာကးတျငးေဖား်ပထာ့ေသာ code convention အတိုငး့ပငး ရိုကးထညး႕ထညး႕သျငး့ေပ့ရပါမညး

vnd.android.cursor.dir/vnd.<package>

ေအာကးတျငးေဖား်ပထာ့ေသာ getType() method ကိုေလံလာၾကညး႕ပါ၈

@Override
public String getType(Uri url) {
switch (URL_MATCHER.match(url)) {
case FRIENDS:
return
"vnd.android.cursor.dir/vnd.android_programmers_guide.friend";

case FRIENDS_ID:
return
"vnd.android.cursor.item/vnd.android_programmers_guide.friend";
default:
throw new IllegalArgumentException("Unknown URL " +
url);
}
}

282 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အထကးပါ new Custom Content Provider ၏ Code မ္ာ့ရိုကးထညး႕သျငး့ၿပီ့ေနာကးတျငး Friends


Provider မြ Code အ်ပညး႕အစဵုကိုေအာကးပါအတိုငး့ေတျ႕်မငးရမညး်ဖစးပါသညး၈

package android_programmers_guide.FindAFriend;
import android_programmers_guide.FindAFriend.Friends;
import android.content.*;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import java.util.HashMap;

public class FriendsProvider extends ContentProvider {


private SQLiteDatabase mDB;
private static final String TAG = "FriendsProvider";
private static final String DATABASE_NAME = "friends";
private static final int DATABASE_VERSION = 2;

private static HashMap<String, String> FRIENDS_PROJECTION_MAP;

private static final int FRIENDS = 1;


private static final int FRIENDS_ID = 2;

private static final UriMatcher URL_MATCHER;

private static class DatabaseHelper extends SQLiteOpenHelper {

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE friends (_id INTEGER PRIMARY KEY,"
+ "name TEXT," + "location TEXT," + "created INTEGER,"
+ "modified INTEGER" + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + "to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS friends");
onCreate(db);
}
}
@Override
public boolean onCreate() {
DatabaseHelper dbHelper = new DatabaseHelper();
mDB = dbHelper.openDatabase(getContext(), DATABASE_NAME, null,
DATABASE_VERSION);
return (mDB == null) ? false : true;
}

မ္ကးပျငးံစာေပ 283
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

@Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

switch (URL_MATCHER.match(url)) {
case FRIENDS:
qb.setTables("friends");
qb.setProjectionMap(FRIENDS_PROJECTION_MAP);
break;

case FRIENDS_ID:
qb.setTables("friends");
qb.appendWhere("_id=" + url.getPathSegments().get(1));
break;

default:
throw new IllegalArgumentException("Unknown URL " + url);
}

String orderBy;
if (TextUtils.isEmpty(sort)) {
orderBy = Friends.Friend.DEFAULT_SORT_ORDER;
} else {
orderBy = sort;
}

Cursor c = qb.query(mDB, projection, selection, selectionArgs, null,


null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), url);
return c;
}

@Override
public String getType(Uri url) {
switch (URL_MATCHER.match(url)) {
case FRIENDS:
return
"vnd.android.cursor.dir/vnd.android_programmers_guide.friend";

case FRIENDS_ID:
return
"vnd.android.cursor.item/vnd.android_programmers_guide.friend";

default:
throw new IllegalArgumentException("Unknown URL " + url);
}
}

@Override
public Uri insert(Uri url, ContentValues initialValues) {
long rowID;
ContentValues values;
if (initialValues != null) {
values = new ContentValues(initialValues);
} else {
values = new ContentValues();
}

if (URL_MATCHER.match(url) != FRIENDS) {

284 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

throw new IllegalArgumentException("Unknown URL " + url);


}

Long now = Long.valueOf(System.currentTimeMillis());


Resources r = Resources.getSystem();

if (values.containsKey(Friends.Friend.CREATED_DATE ) == false) {
values.put(Friends.Friend.CREATED_DATE, now);
}

if (values.containsKey(Friends.Friend.MODIFIED_DATE) == false) {
values.put(Friends.Friend.MODIFIED_DATE, now);
}

if (values.containsKey(Friends.Friend.NAME) == false) {
values.put(Friends.Friend.NAME,
r.getString(android.R.string.untitled));
}

if (values.containsKey(Friends.Friend.LOCATION) == false) {
values.put(Friends.Friend.LOCATION , "");
}

rowID = mDB.insert("friends", "friend", values);


if (rowID > 0) {
Uri uri = ContentUris.withAppendedId(Friends.Friend.CONTENT_URI
, rowID);
getContext().getContentResolver().notifyChange(uri, null);
return uri;
}

throw new SQLException("Failed to insert row into " + url);


}

@Override
public int delete(Uri url, String where, String[] whereArgs) {
int count;
long rowId = 0;
switch (URL_MATCHER.match(url)) {
case FRIENDS:
count = mDB.delete("friends", where, whereArgs);
break;

case FRIENDS_ID:
String segment = url.getPathSegments().get(1);
rowId = Long.parseLong(segment);
count = mDB
.delete("friends", "_id="
+ segment
+ (!TextUtils.isEmpty(where) ? " AND (" + where
+ ')' : ""), whereArgs);
break;

default:
throw new IllegalArgumentException("Unknown URL " + url);
}

getContext().getContentResolver().notifyChange(url, null);

return count;

မ္ကးပျငးံစာေပ 285
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

@Override
public int update(Uri url, ContentValues values, String where, String[]
whereArgs) {
int count;
switch (URL_MATCHER.match(url)) {

case FRIENDS:
count = mDB.update("friends", values, where, whereArgs);
break;

case FRIENDS_ID:
String segment = url.getPathSegments().get(1);
count = mDB
.update("friends", values, "_id=" + segment
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;

default:
throw new IllegalArgumentException("Unknown URL " + url);
}

getContext().getContentResolver().notifyChange(url, null);
return count;
}

static {
URL_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URL_MATCHER.addURI("android_programmers_guide.FindAFriend.Friends",
"friend", FRIENDS);
URL_MATCHER.addURI("android_programmers_guide.FindAFriend.Friends",
"friend/#", FRIENDS_ID);
FRIENDS_PROJECTION_MAP = new HashMap<String, String>();
FRIENDS_PROJECTION_MAP.put(Friends.Friend._ID, "_id");
FRIENDS_PROJECTION_MAP.put(Friends.Friend.NAME, "name");
FRIENDS_PROJECTION_MAP.put(Friends.Friend.LOCATION, "location");
FRIENDS_PROJECTION_MAP.put(Friends.Friend.CREATED_DATE, "created");
FRIENDS_PROJECTION_MAP.put(Friends.Friend.MODIFIED_DATE,
"modified");
}
}

ယခုအခါတျငး underlying data element မ္ာ့်ဖစးေသာ database, definition မ္ာ့ႏြငးံ content


provider မ္ာ့ကိုတညးေဆာကးၿပီ့်ဖစးေသာေၾကာငးံ Activity ႏြငးံသကးဆိုငးေသာ Code မ္ာ့၇ Layout မ္ာ့
ကိုတညးေဆာကးႏိုငးၿပီ်ဖစးပါသညး၈ မေမံသငးံေသာအခ္ကးမြာတညးေဆာကးမညး႕ Activity သညး database
မြ data မ္ာ့ကိုရယူ၍ List တစးခုအေန်ဖငးံေဖား်ပရဵုသာမက Google Maps Overlay ေပၚမြ database
Item မ္ာ့ကိုထာ့မညး႕ အ်ခာ့ေသာ Activity တစးခုကိုလညး့ အသဵု့်ပဳသူကိုချငးံ်ပဳေပ့ရပါမညး၈ ေနာကး
လာမညး႕အပိုငး့တျငး Activity မ္ာ့ႏြငးံ FindAFriend application ကိုၿပီ့ဆဵု့သညးအထိ တညးေဆာကး်ခငး့
ကိုေလံလာရေတာံမညး်ဖစးပါသညး၈

286 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Creatng the FindAFriend Activity


အကယး၍ Google မြထညး႕သျငး့ေပ့ထာ့ေသာ Notepad demo ကိုသာအခ္ိနးအနညး့ငယးေပ့၍ ေလံလာ
ခဲံပါက ယခုေဖား်ပပါ Activity ႏြငးံအလျနးနီ့စပးတူညီေၾကာငး့ေတျ႕ရလိမးံမညး်ဖစးသညး၈ ထို႕ေၾကာငးံ Friend
database ႏြငးံ Google Map မ္ာ့အတျကး NotePad Interface ကို Modify ်ပဳလုပး်ခငး့်ဖငးံပငး လုပး
ေဆာငးႏိုငးေစမညး်ဖစးပါသညး၈ အဆိုပါ FindFriend activity သညး အ်ခာ့ေသာ Activity အေသ့မ္ာ့
်ဖစးေသာ NameEditor၇ LocationEditor ႏြငးံ FriendsMap တို႕ႏြငးံအတူ အတူတကျပူ့ေပါငး့လုပးေဆာငး ရ
ပါမညး၈ လာမညး႕အပိုငး့မ္ာ့တျငး အာ့လဵု့ေသာ activity မ္ာ့ကို တညးေဆာကးရပါလိမးံမညး၈

ယခငးတညးေဆာကးၿပီ့ခဲံေသာ Activity Project မ္ာ့အတိုငး့ပငး AndroidManifest.xml ဖိုငးမြစတငးရပါ


မညး၈ အနညး့ငယးရႈပးေထျ့မႈရိြေသာ application ်ဖစးေသာေၾကာငးံ AndroidManifest.xml ဖိုငးတျငး
အေ်ပာငး့အလဲမ္ာ့စျာ်ပဳလုပးေပ့ရမညး်ဖစးပါသညး၈

Editing AndroidManifest.xml
ေအာကးတျငးေဖား်ပထာ့ေသာ Code မ္ာ့သညး FindAFriend project အတျကး အသဵု့်ပဳရမညး႕ Android
Manifest.xml ဖိုငး၏ Code မ္ာ့်ဖစးပါသညး၈ ထို Code တျငး Activity အသစးမ္ာ့အတျကး လိုအပးေသာ
Intent Filter အမ္ာ့အ်ပာ့ကို ေပါငး့ထညး႕ရပါမညး၈ ထို Intent Filter မ္ာ့သညး Friend ၏ Location ကို
်ပငးဆငးရနး၇ Friedn ၏ အမညးကို်ပငးဆငးရနးႏြငးံ Google Map တို႕ကို launch ်ပဳလုပးရနးတ႕ို အတျကး
်ဖစးပါသညး၈

ထို႕ေၾကာငးံ Intent Filter တစးခုစီ၏ action မ္ာ့ကိုအထူ့်ပဳ၍ေလံလာသငးံပါသညး၈ အဆိုပါ Intent Filter


မ္ာ့သညး Activity တစးခုစီကုိ pass ်ပဳလုပး၍ Intent ကို Handle ်ပဳလုပးႏိုငးမညး႕ action မ္ာ့ပါွငးပါ
သညး၈

ေနာကးဆဵု့အရ Map အတျငး့တျငး လကးရိြ Location ကိုထညး႕သျငး့ေစႏိုငးရနးအတျကး Access_Location


ႏြငးံ Access_GPS permission မ္ာ့ကိုေပါငး့ထညး႕ရနးမေမံေလြ္ာံသငးံပါ၈ AndroidManifest.xml ဖိုငးအ
တျငး့ တျငး ပါွငးသညး႕ Code အ်ပညး႕အစဵုမြာ ေအာကးပါအတိုငး့်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 287
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

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


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android_programmers_guide.FindAFriend">
<application android:icon="@drawable/icon">
<provider android:name="FriendsProvider"

android:authorities="android_programmers_guide.FindAFriend.Friends" />
<activity android:name=".FindAFriend"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<dataandroid:mimeType="vnd.android.cursor.dir/
vnd.android_programmers_guide.friend" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<dataandroid:mimeType="vnd.android.cursor.item/
vnd.android_programmers_guide.friend" />
</intent-filter>
</activity>
<activity android:name=".FriendsMap" android:label="FriendsMap">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name="LocationEditor"
android:label="@string/title_note">
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action
android:name="com.google.android.notepad.action.EDIT_LOCATION" />
<category android:name="android.intent.category.DEFAULT" />
<dataandroid:mimeType="vnd.android.cursor.item/
vnd.android_programmers_guide.friend" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
<dataandroid:mimeType="vnd.android.cursor.dir/
vnd.android_programmers_guide.friend" />
</intent-filter>

</activity>
<activity android:name="NameEditor"
android:label="@string/title_edit_title"
android:theme="@android:style/Theme.Dialog">
<intent-filter android:label="@string/resolve_title">
<action

288 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:name="com.google.android.notepad.action.EDIT_NAME"
/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<dataandroid:mimeType="vnd.android.cursor.item/
vnd.android_programmers_guide.friend" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_GPS">
</uses-permission><uses-permission
android:name="android.permission.ACCESS_LOCATION">
</uses-permission></manifest>

ေနာကးလာမညး႕အပိုငး့တျငး ယခု Project အတျကး ပထမဆဵု့ Activity ်ဖစးသညး႕ NameEditor ဟူေသာ


Activity ကိုတညးေဆာကးရမညး်ဖစးပါသညး၈ အမညးေပ့ထာ့သညး႕အတိုငး့ပငး အဆိုပါ Activity သညး
Friend တစးဦ့၏ အမညးကို်ပငးဆငးေစလိုေသာအခါတျငး Activity ကို Launch ်ပဳလုပးေပ့ရမညး်ဖစးပါ
သညး၈

Creating the NameEditor Activity


ယခုအပိုငး့တျငး FindAFriend Project အတျကး NameEditor ဟူေသာ Activity ကိုတညးေဆာကးၾကညး႕
ၾကပါမညး၈ အဆိုပါ Activity ကို main FindAFriend Activity ေပၚတျငး ရိြေသာ menu item မြ Launch
်ပဳလုပးေစႏိုငးပါသညး၈ NameEditor Activity ်ပဳလုပးရေသာရညးရျယးခ္ကးမြာ Friend record ၏ Name
Field ကို်ပငးဆငးႏိုငးေစရနးအတျကး်ဖစးပါသညး၈ Application အတျကး name_editor ဟုအမညးရေသာ
layout file တစးဖုိငးႏြငးံ NameEditor.java ဟုအမညးရသညး႕ ဖိုငးတစးဖိုငးကိုတညးေဆာကးပါ၈ ထို႕ေနာကး
ထိုဖိုငးႏြစးဖိုငးကို်ပငးဆငးေပ့ရပါမညး၈

ေရြ့ဦ့စျာ name_editor.xml ဖိုငးကို Activity အတျကး Layout ဖိုငးတစးဖိုငးတညးဆာကးရနးအလို႕ငြါ်ပငးဆင


ေပ့ရပါမညး၈ ထို Activity တျငး EditText တစးခုႏြငးံ Button တစးခုကိုထညး႕သျငး့ပါမညး၈ EditText သညး
name field မြ အမညးမ္ာ့ကို်ပငးဆငးရနး်ဖစးၿပီ့ Button သညး Result မ္ာ့ကိုေရ့သာ့ရနးႏြငးံ ်ပနးထျကးရနး
အတျကးအသဵု့်ပဳပါမညး၈ ယခုစာအုပးကို အစမြေလံလာခဲံ်ခငး့်ဖစးပါက XML file အတျငး့ View layout မ္ာ့
တညးေဆာကး်ခငး့ကို အႀကိမးေပါငး့မ္ာ့စျာေလံလာခဲံရၿပီ့်ဖစးပါသညး၈ ထို႕ေၾကာငးံ name_editor.xml ဖိုငး
အတျငး့မြ Code မ္ာ့ကိုသာေဖား်ပေတာံမညး်ဖစးၿပီ့ အဆိုပါ Code မ္ာ့ကိုေအာကးတျငးေတျ႕ရိြႏိုငးပါသညး၈

မ္ကးပျငးံစာေပ 289
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="6dip"
android:paddingRight="6dip"
android:paddingBottom="3dip">

<EditText android:id="@+id/name"
android:maxLines="1"
android:layout_marginTop="2dip"
android:layout_width="wrap_content"
android:ems="25"
android:layout_height="wrap_content"
android:autoText="true"
android:capitalize="sentences"
android:scrollHorizontally="true" />

<Button android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/button_ok" />

</LinearLayout>

ထို႕ေနာကး NameEditor.java ဖိုငးကို်ပငးဆငးၿပီ့ Code မ္ာ့ေရ့သာ့ၾကရပါမညး၈ ေရြ့ဦ့စျာ ထဵု့စဵအတိုငး့


ပငး package မ္ာ့ထညး႕သျငး့ရမညး်ဖစးပါသညး၈ အဆိုပါ ထညး႕သျငး့ရမညး႕ package မ္ာ့မြာ database
record မ္ာ့ႏြငးံအလုပးလုပးေဆာငးေသာအခါတျငး အကူအညီ်ဖစးေစမညး႕ Cursor package မ္ာ့်ဖစးၾက
ပါသညး၈

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

ထို႕အ်ပငး Activity ကို establish ်ပဳလုပးသငးံသညးအတျကး View.OnClickListener() ကို အသဵု့်ပဳရပါ


မညး၈ ထို View.OnClickListener() သညး Activity အတျငး့မြ OnClickListener() ဟူေသာ method
မ္ာ့ကို Override ်ပဳလုပးထိနး့ခ္ဳပးပါသညး၈ ေအာကးတျငးေဖား်ပထာ့ေသာ နမူနာ code မ္ာ့သညးအသဵု့်ပဳ
ရနးလိုအပးေသာ Variable definition အခ္ိဳ႕ ပါွငးေသာ NameEditor ဟူသညး႕ class ၏ outline ကို
ေဖား်ပပါသညး၈

290 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

public class NameEditor extends Activity implements View.OnClickListener {

public static final String EDIT_NAME_ACTION =


"android_programmers_guide.FindAFriend.action.EDIT_NAME";
private static final int NAME_INDEX = 1;

private static final String[] PROJECTION = new String[] {


Friends.Friend._ID,
Friends.Friend.NAME,
};

Cursor mCursor;
EditText mText;
}

ထို႕ေနာကး OnCreate() method ်ဖငးံအစ်ပဳေသာ method အခ္ိဳ႕ကို Override ်ပဳလုပးရနးလအ


ို ပးပါသညး၈
ထိုကဲံသို႕ေသာ method မ္ာ့အတျကး Override ်ပဳလုပး်ခငး့ကို ယခငးအခနး့မ္ာ့တျငးေဖား်ပထာ့ခဲံၿပီ့်ဖစ
ပါသညး၈ ပဵုမြနးအာ့်ဖငးံ Activity ကိုတညးေဆာကးၿပီ့ေသာအခါတျငး Code အာ့လဵု့ကို execute ်ပဳလုပးေစ
ရနး အဆိုပါ Override ်ပဳလုပး်ခငး့မြ လုပးေဆာငးေပ့ပါသညး၈

public void onCreate(Bundle icicle) {


super.onCreate(icicle);

setContentView(R.layout.name_editor);

Uri uri = getIntent().getData();

mCursor = managedQuery(uri, PROJECTION, null, null);

mText = (EditText) this.findViewById(R.id.name);


mText.setOnClickListener(this);

Button b = (Button) findViewById(R.id.ok);


b.setOnClickListener(this);
}

ယခငးေဖား်ပခဲံေသာ နမူနာ Code တျငး သကးဆိုငးရာ View မ္ာ့၏ Layout မ္ာ့နြငးံ Variable အခ္ိဳ႕ကို
assign ်ပဳလုပးခဲံပါသညး၈ သို႕ရာတျငး Cursor တစးခုတညးေဆာကးၿပီ့ေသားလညး့ ထို Cursor မြ မညးသညး႕
အခ္ကးအလကးကိုမြ္ ရရိြႏိုငး်ခငး့မရိြေသ့ေၾကာငးံေသာ ရရိြႏိုငးရနးအတျကး onResume() method ကို
အသဵု့်ပဳရပါမညး၈

ေနာကးထပးတစးဖနး Override ်ပဳလုပးရမညး႕ method ႏြစးခုမြာ onResume() ႏြငးံ onPause() တို႕်ဖစးပါ


သညး၈ အဆိုပါ method ႏြစးခုသညး database မြ အခ္ကးအလကးမ္ာ့ကိုဖတးရြဳ်ခငး့၇ ေရ့သာ့်ခငး့ စသညး
မ္ကးပျငးံစာေပ 291
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

တို႕ကို လုပးေဆာငးပါသညး၈ Android life cycle အတျငး့တျငး onResume() ကို Activity တစးခုပျငးံေန
ေသာအခါႏြငးံ အ်ခာ့ေသာ activity မ္ာ့အေပၚတျငး focus ်ဖစးေနေသာအခါတျငး ေခၚယူပါသညး၈
onPause() ကို Activity တစးခုသညး ပိတးၿပီ့ေသားလညး့ ေနာကး Activity တစးခုကို focus ်ပဳလုပးခိုငး့ေစ
လိုေသာအခါတျငး ေခၚယူရပါသညး၈ ထို႕ေၾကာငးံ onResume() method ကို override ်ပဳလုပး်ခငး့်ဖင
database ကို ဖတးရြဳရနးႏြငးံ name field ကိုရယူေစႏိုငးပါသညး၈

protected void onResume() {


super.onResume();
if (mCursor != null) {
mCursor.first();
String title = mCursor.getString(NAME_INDEX);
mText.setText(title);
}
}

ယခုေဖား်ပပါ နညး့လမး့အရ ၁ငး့၏ ပထမဆဵု့ record သို႕ Cursor ကိုေရႊ႕ေ်ပာငး့ေသာအခါတျငး ယခငး


assign ်ပဳလုပးထာ့ခဲံေသာ index ကိုအသဵု့်ပဳ၍ name field မြတစးဆငးံ ဖတးရြဳရယူၿပီ့ Name Field ၏
Content မ္ာ့သို႕ EditText ကိုသတးမြတးေပ့မညး်ဖစးပါသညး၈ ၁ငး့သညး အလိုအေလြ္ာကးပငး Current
Record ၏ Name Value မြ Field ကို populate ်ပဳလုပးေစပါမညး၈ ထို႕ေနာကး database အတျငး့သို႕
EditText ၏ Content မ္ာ့ကို်ပနးလညးေရ့သာ့ရနးအတျကး onPause() ဟူေသာ method ကို်ပငးဆငးေပ့
ရပါမညး၈

protected void onPause() {


super.onPause();

if (mCursor != null) {
String title = mText.getText().toString();
mCursor.updateString(NAME_INDEX, title);
mCursor.commitUpdates();
}
}

ေနာကးဆဵု့တျငး onClick handler မြ finish() method ကိုေခၚယူရပါမညး၈ အဆိုပါ method သညး


Activity ကိုရြငး့လငး့ေပ့ၿပီ့ ပိတးလိုကးေစမညး်ဖစးပါသညး၈ ်ပငးဆငးမႈအာ့လဵု့ၿပီ့စီ့သျာ့ၿပီ်ဖစးသညး႕ Name
Editor.java ဖိုငးမြ Code မ္ာ့ကို ေအာကးပါအတိုငး့ေတျ႕ရမညး်ဖစးသညး၈

292 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

package android_programmers_guide.FindAFriend;

import android_programmers_guide.FindAFriend.Friends;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class NameEditor extends Activity implements View.OnClickListener {

public static final String EDIT_NAME_ACTION =


"android_programmers_guide.FindAFriend.action.EDIT_NAME";

private static final int NAME_INDEX = 1;

private static final String[] PROJECTION = new String[] {


Friends.Friend._ID,
Friends.Friend.NAME,
};

Cursor mCursor;
EditText mText;

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);

setContentView(R.layout.name_editor);

Uri uri = getIntent().getData();

mCursor = managedQuery(uri, PROJECTION, null, null);

mText = (EditText) this.findViewById(R.id.name);


mText.setOnClickListener(this);

Button b = (Button) findViewById(R.id.ok);


b.setOnClickListener(this);
}

@Override
protected void onResume() {
super.onResume();

if (mCursor != null) {
mCursor.first();
String title = mCursor.getString(NAME_INDEX);
mText.setText(title);
}
}
@Override
protected void onPause() {
super.onPause();

if (mCursor != null) {
String title = mText.getText().toString();
mCursor.updateString(NAME_INDEX, title);
mCursor.commitUpdates();

မ္ကးပျငးံစာေပ 293
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

}
}

public void onClick(View v) {


finish();
}
}

ေဖား်ပပါအခ္ကးအရ Friends database အတျငး့တျငး name value မ္ာ့ကို edit ်ပဳလုပးႏိုငးပါသညး၈ သို႕
ရာတျငး database အတျငး့တျငး အေရ့ႀကီ့ေသာ Field ႏြစးခုရိြၿပီ့ ၁ငး့တို႕မြာ name ႏြငးံ location တို႕်ဖစး
ပါသညး၈ ေနာကးလာမညး႕အပိုငး့တျငး Location Field အတျကး Editor တစးခုကို တညးေဆာကးၾကညး႕ၾက
ပါမညး၈

Creating the LocationEditor Activity


ယခုအပိင
ု း့တျငး Friends database ၏ location field အတျကး editor တစးခုကိုတညးေဆာကးရမည
်ဖစးပါသညး၈ NameEditor Activity ႏြငးံႏိႈငး့ယြဥးလြ္ငးအနညး့ငယးကျာ်ခာ့မႈရိြေသာ Activity တစးခုကို ်ပဳ
လုပးရပါလိမးံမညး၈ ထို႕ေၾကာငးံ အသဵု့်ပဳရမညး႕ Code သညးကျဲ်ပာ့မညး်ဖစးၿပီ့ ပဵုမြနးသဵု့စျဲေနက္မဟုတးေသာ
process အတိုငး့်ပဳလုပးရမညး်ဖစးပါသညး၈ Google ၏ Notepad demo app တျငး အ်ဖဴေရာငး Screen
အ်ဖစးရိြေသာ notes editor ကိုသတိထာ့မိမညးထငးပါသညး၈ အဆိုပါ notes editor ကဲံသို႕ေသာ effect
မ္ိဳ့ရရိြေစရနး Custom View တစးခုကိုအသဵု့်ပရပါသညး၈ ထို႕ေၾကာငးံ LocationEditor အတျကး တူညီ
ေသာ custom view တစးခုကိုအသဵု့်ပဳၾကညး႕ၾကပါမညး၈

Location_editor.xml

ပထမအဆငးံ်ပဳလုပးရမညး႕အလုပးမ္ာ့မြာ location_editor.xml ဖိုငးႏြငးံ LocationEditor.java ဖိုငးကို


layout ႏြငးံ Code မ္ာ့ေရ့သာ့ရနး တညးေဆာကး်ခငး့ပငး်ဖစးပါသညး၈ layout file အတျငး့တျငး Custom
View Layout ကိုေခၚယူနိုငးေသာ call တစးခုကိုထညး႕သျငး့ရပါမညး၈ ေရ့သာ့ရမညး႕ Code အ်ပညး႕အစုဵ
မြာေအာကးပါအတိုငး့်ဖစးပါသညး၈

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


<view xmlns:android="http://schemas.android.com/apk/res/android"
class="android_programmers_guide.FindAFriend.LocationEditor$MyEditText"
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

294 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

android:background="#ffffff"
android:padding="10dip"
android:scrollbars="vertical"
android:fadingEdge="vertical" />

LocationEditor တျငး discard၇ delete ကဲံသို႕ေသာ အေ်ပာငး့အလဲမ္ာ့ကို်ပဳလုပးႏိုငးရနး Menu System


တစးခုပါွငးပါလိမးံမညး၈ ထိုအပိုငး့သညးအနညး့ငယးခကးခဲပါသညး၈ ထို႕ေၾကာငးံ အစမြ စတငးေလံလာ်ခငး့
သညးအေကာငး့ဆဵု့ပါလိမးံမညး၈ ထို႕ေၾကာငးံ LocationEditor.java ဖိုငး၏ package မ္ာ့ import ်ပဳလုပး
်ခငး့မြ စတငးေလံလာၾကညး႕ၾကပါမညး၈

LocationEditor.java

ယခုတညးေဆာကးေနေသာ Activity အတျကး import ်ပဳလုပးရမညး႕ package မ္ာ့ကိုေလံလာရပါမညး၈


အမ္ာ့စုမြ Screen ေပၚမြ Custom View ကိုေရ့ဆျဲတညးေဆာကး်ခငး့တို႕အတျကး်ဖစးပါသညး၈

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.Menu;
import android.widget.EditText;
import java.util.Map;

ထို႕ေနာကး Activity ၏ main class outline ကို setup ်ပဳလုပးရပါမညး၈ ၁ငး့အထဲတျငး LocationEditor
အတျကးအသဵု့်ပဳရနးအတျကး define ်ပဳလုပးရနးလိုအပးမညး႕ Variable အမ္ာ့အ်ပာ့ပါွငးပါသညး၈

public class LocationEditor extends Activity {

private static final String TAG = "Friends";

private static final int FRIEND_INDEX = 1;


private static final int NAME_INDEX = 2;
private static final int MODIFIED_INDEX = 3;

private static final String[] PROJECTION = new String[] {


Friends.Friend._ID, // 0
Friends.Friend.LOCATION, // 1

မ္ကးပျငးံစာေပ 295
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Friends.Friend.NAME, // 2
Friends.Friend.MODIFIED_DATE // 3
};

private static final String ORIGINAL_CONTENT = "origContent";

private static final int REVERT_ID = Menu.FIRST;


private static final int DISCARD_ID = Menu.FIRST + 1;
private static final int DELETE_ID = Menu.FIRST + 2;

private static final int STATE_EDIT = 0;


private static final int STATE_INSERT = 1;

private int mState;


private boolean mNoteOnly = false;
private Uri mURI;

private Cursor mCursor;


private EditText mText;
private String mOriginalContent;
}

ယခုအခနး့၏ ယခငးအပိုငး့တျငးေဆာငးရျကးခဲံၿပီ့်ဖစးေသာ Variable definition မ္ာ့ကို self explanatory


်ပဳလုပးသငးံပါသညး၈ ေနာကးေရ့သာ့ရမညး႕ Code သညး တညးေဆာကးရနးလိုအပးဦ့မညး႕ Subclass တစးခု
ပငး်ဖစးပါသညး၈ ထို Subclass သညး LocationEditor အတျကးအသဵု့်ပဳရေသာ EditText ကို Screen ေပၚ
တျငးေဖား်ပေပ့ေစပါလိမးံမညး၈ ထို႕ေၾကာငးံ onDraw class ကို override ်ပဳလုပးေသာအခါတျငး အေသအ
ခ္ာ ဂရု်ပဳေလံလာရပါမညး၈

public static class MyEditText extends EditText {


private Rect mRect;
private Paint mPaint;

public MyEditText(Context context, AttributeSet attrs, Map params) {


super(context, attrs, params);

mRect = new Rect();


mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0xFF0000FF);
}
@Override
protected void onDraw(Canvas canvas) {
int count = getLineCount();
Rect r = mRect;
Paint paint = mPaint;

for (int i = 0; i < count; i++) {


int baseline = getLineBounds(i, r);

296 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1,


paint);
}

super.onDraw(canvas);
}
}

ေနာကးတစးႀကိမးေလံလာရမညး႕ Code မ္ာ့သညး Screen ေပၚတျငးေဖား်ပရနးလိုအပးသညး႕ EditText အသ


စးတစးခုအတျကး တညးေဆာကးရမညး႕ Subclass ၏ Code မ္ာ့ပငး်ဖစးပါသညး၈ NameEditor ႏြငးံအတူပငး
onResume() ႏြငးံ onPause() method မ္ာ့ကို database ကိုအလုပးလုပးေဆာငးေစရနးအတျကး အသဵု့်ပဳ
ရပါလိမးံမညး၈ ထို႕ေၾကာငးံ ေအာကးတျငးေဖား်ပထာ့ေသာ Code ကိုေလံလာၾကညး႕ပါ၈

protected void onResume() {


super.onResume();

if (mCursor != null) {
mCursor.first();

if (mState == STATE_EDIT) {
setTitle(getText(R.string.title_edit));
} else if (mState == STATE_INSERT) {
setTitle(getText(R.string.title_create));
}

String note = mCursor.getString(FRIEND_INDEX);


mText.setTextKeepState(note);

if (mOriginalContent == null) {
mOriginalContent = note;
}

} else {
setTitle(getText(R.string.error_title));
mText.setText(getText(R.string.error_message));
}
}
protected void onPause() {
super.onPause();

if (mCursor != null) {
String text = mText.getText().toString();
int length = text.length();

if (isFinishing() && (length == 0) && !mNoteOnly) {


setResult(RESULT_CANCELED);
deleteFriend();
} else {
if (!mNoteOnly) {
mCursor.updateLong(MODIFIED_INDEX,
System.currentTimeMillis());

မ္ကးပျငးံစာေပ 297
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

if (mState == STATE_INSERT) {
String title = text.substring(0, Math.min(30,
length));
if (length > 30) {
int lastSpace = title.lastIndexOf(' ');
if (lastSpace > 0) {
title = title.substring(0, lastSpace);
}
}
mCursor.updateString(NAME_INDEX, title);

}
}

mCursor.updateString(FRIEND_INDEX, text);

managedCommitUpdates(mCursor);
}
}
}

NameEditor မြာကဲံသို႕ပငး onResume() method အတျငး့မြ database မြဖတးရြဳေစမညး်ဖစးၿပီ့ onPause


method ်ပဳလုပးေနခ္ိနးတျငး database သို႕်ပနးလညးေရ့သာ့မညး်ဖစးသညး၈ LocationEditor အတျငး့
NameEditor အ်ပငး ထညး႕်ဖညး႕သငးံသညး႕ feature တစးခုမြာ အေ်ပာငး့အလဲတစးခုပါလုပးေသာအခါ
တျငး modified date မ္ာ့ကိုသာေရ့သာ့ေစ်ခငး့ပငး်ဖစးပါသညး၈ ထို႕ေၾကာငးံေနာကးဆဵု့အေန်ဖင
အေ်ပာငး့အလဲမ္ာ့ကို ပယးဖ္ကးရနးႏြငးံ Friend မ္ာ့ကို delete လုပးရနးအတျကး method ႏြစးခုကိုလုိအပး
မညး်ဖစးပါသညး၈ အဆိုပါ method မ္ာ့ကို menu system မြေခၚယူေစမညး်ဖစးပါသညး၈

private final void cancelFriend() {


if (mCursor != null) {
if (mState == STATE_EDIT) {
mCursor.updateString(FRIEND_INDEX, mOriginalContent);
mCursor.commitUpdates();
mCursor.deactivate();
mCursor = null;
} else if (mState == STATE_INSERT) {
deleteFriend();
}
}
setResult(RESULT_CANCELED);
finish();
}

private final void deleteFriend() {


if (mCursor != null) {
mText.setText("");
mCursor.deleteRow();
mCursor.deactivate();

298 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

mCursor = null;
}
}

အခနး့ (၅) တျငးေလံလာခဲံရေသာ menu system မ္ာ့ကိုတညးေဆာကး်ခငး့ကိုအေ်ခ်ပဳ၍ အဆိုပါ


method မ္ာ့ႏြငးံ Subclass မ္ာ့ပူ့ေပါငး့၍ အတူတကျအလုပးလုပးေဆာငးၾကပဵုကို ေအာကးတျငးေဖား်ပထာ့
ေသာ LocationEditor.java ဖိုငး၏ Code မ္ာ့ကိုေလံလာ်ခငး့်ဖငးံ သိရိြႏိုငးေစမညး်ဖစးပါသညး၈

package android_programmers_guide.FindAFriend;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.Menu;
import android.widget.EditText;
import java.util.Map;

public class LocationEditor extends Activity {

private static final String TAG = "Friends";

private static final int FRIEND_INDEX = 1;


private static final int NAME_INDEX = 2;
private static final int MODIFIED_INDEX = 3;

private static final String[] PROJECTION = new String[] {


Friends.Friend._ID, // 0
Friends.Friend.LOCATION, // 1
Friends.Friend.NAME, // 2
Friends.Friend.MODIFIED_DATE // 3
};

private static final String ORIGINAL_CONTENT = "origContent";

private static final int REVERT_ID = Menu.FIRST;


private static final int DISCARD_ID = Menu.FIRST + 1;
private static final int DELETE_ID = Menu.FIRST + 2;

private static final int STATE_EDIT = 0;


private static final int STATE_INSERT = 1;

private int mState;


private boolean mNoteOnly = false;
private Uri mURI;
private Cursor mCursor;
private EditText mText;

မ္ကးပျငးံစာေပ 299
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

private String mOriginalContent;

public static class MyEditText extends EditText {


private Rect mRect;
private Paint mPaint;

public MyEditText(Context context, AttributeSet attrs, Map params) {


super(context, attrs, params);

mRect = new Rect();


mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0xFF0000FF);
}

@override
protected void onDraw(Canvas canvas) {

int count = getLineCount();


Rect r = mRect;
Paint paint = mPaint;

for (int i = 0; i < count; i++) {


int baseline = getLineBounds(i, r);

canvas.drawLine(r.left, baseline + 1, r.right, baseline


+ 1,paint);
}

super.onDraw(canvas);
}
}

@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
final Intent intent = getIntent();
final String type = intent.resolveType(this);

final String action = intent.getAction();


if (action.equals(Intent.EDIT_ACTION)) {
mState = STATE_EDIT;
mURI = intent.getData();

} else if (action.equals(Intent.INSERT_ACTION)) {
mState = STATE_INSERT;
mURI = getContentResolver().insert(intent.getData(), null);

if (mURI == null) {

finish();
return;
}
setResult(RESULT_OK, mURI.toString());
} else {
finish();
return;
}

300 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

setContentView(R.layout.location_editor);

mText = (EditText) findViewById(R.id.location);

mCursor = managedQuery(mURI, PROJECTION, null, null);

if (icicle != null) {
mOriginalContent = icicle.getString(ORIGINAL_CONTENT);
}
}

@Override
protected void onResume() {
super.onResume();

if (mCursor != null) {
mCursor.first();

if (mState == STATE_EDIT) {
setTitle(getText(R.string.title_edit));
} else if (mState == STATE_INSERT) {
setTitle(getText(R.string.title_create));
}

String note = mCursor.getString(FRIEND_INDEX);


mText.setTextKeepState(note);

if (mOriginalContent == null) {
mOriginalContent = note;

} else {
setTitle(getText(R.string.error_title));
mText.setText(getText(R.string.error_message));
}
}

@Override
protected void onFreeze(Bundle outState) {
outState.putString(ORIGINAL_CONTENT, mOriginalContent);
}

@Override
protected void onPause() {
super.onPause();

if (mCursor != null) {
String text = mText.getText().toString();
int length = text.length();

if (isFinishing() && (length == 0) && !mNoteOnly) {


setResult(RESULT_CANCELED);
deleteFriend();
} else {
if (!mNoteOnly) {
mCursor.updateLong(MODIFIED_INDEX,
System.currentTimeMillis());

မ္ကးပျငးံစာေပ 301
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

if (mState == STATE_INSERT) {
String title = text.substring(0,
Math.min(30,length));

if (length > 30) {


int lastSpace = title.lastIndexOf(' ');
if (lastSpace > 0) {
title = title.substring(0, lastSpace);
}
}
mCursor.updateString(NAME_INDEX, title);
}
}

mCursor.updateString(FRIEND_INDEX, text);

managedCommitUpdates(mCursor);
}
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

if (mState == STATE_EDIT) {
menu.add(0, REVERT_ID, R.string.menu_revert).setShortcut('0',
'r');
if (!mNoteOnly) {
menu.add(0, DELETE_ID,
R.string.menu_delete).setShortcut('1', 'd');
} else {
menu.add(0, DISCARD_ID,
R.string.menu_discard).setShortcut('0','d');
}
if (!mNoteOnly) {
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.ALTERNATIVE_CATEGORY);
menu.addIntentOptions(
Menu.ALTERNATIVE, 0,

new ComponentName(this, LocationEditor.class), null,


intent, 0, null);
}

return true;
}

@Override
public boolean onOptionsItemSelected(Menu.Item item) {
switch (item.getId()) {
case DELETE_ID:
deleteFriend();
finish();
break;
case DISCARD_ID:
cancelFriend();
break;
case REVERT_ID:

302 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

cancelFriend();
break;
}
return super.onOptionsItemSelected(item);
}

private final void cancelFriend() {


if (mCursor != null) {
if (mState == STATE_EDIT) {
mCursor.updateString(FRIEND_INDEX, mOriginalContent);
mCursor.commitUpdates();
mCursor.deactivate();
mCursor = null;
} else if (mState == STATE_INSERT) {
deleteFriend();
}
}
setResult(RESULT_CANCELED);
finish();
}

private final void deleteFriend() {


if (mCursor != null) {
mText.setText("");
mCursor.deleteRow();
mCursor.deactivate();
mCursor = null;
}
}
}

ေနာကးလာမညး႕အပိုငး့တျငး Google Maps Overlay ကိုေရ့ဆျဲရနး Activity တစးခုကိုတညးေဆာကးၾကပါ


မညး၈ FriendMap Activity တျငး Friends databse မြ Friend recordset မ္ာ့ကိုဖတးရြဳ်ခငး့၇ ေရ့သာ့်ခငး့
မ္ာ့်ပဳလုပးႏိုငးမညး်ဖစးပါသညး၈

Creating the FriendsMap Activity


FriendsMap Activity သညး main application မြ ေခၚယူႏိုငးေစမညး႕ေနာကးဆဵု့ Activity ်ဖစးပါသညး၈ ထို
Activity သညး Friends database မြ recordset မ္ာ့ကိုေခၚယူၿပီ့ Friend တစးဦ့စီအတျကး Google Map
ေပၚတျငး Circle တစးခုကိုေရ့ဆျဲႏိုငးမညး်ဖစးပါသညး၈ ထို Activity သညး Application အသဵု့်ပဳသူ (ပိုငးရြင)း
အတျကးကို Location အတျကး Circle တစးခုကိုပါ ေရ့ဆျဲႏိုငးမညး်ဖစးပါသညး၈

Project အတျငး့ friendsmap.xml ဖိုငးႏြငးံ FriendsMap.java ဖိုငးႏြစးဖိုငးကို ထညး႕သျငး့်ခငး့်ဖငးံ ယခု


အပိုငး့ကိုစတငးၾကပါမညး၈ friendsmap.xml ဖိုငးအတျကး Layout ေရ့သာ့်ခငး့ကို အခနး့ (၆) တျငးေလံ
လာခဲံၿပီ့်ဖစးသညး႕အတျကး အထူ့အေထျရြငး့်ပေနရနး မလိုအပးဟုယူဆပါသညး၈ Google Map အေပၚတျငး

မ္ကးပျငးံစာေပ 303
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

Button ေလ့ခုထာ့၍တညးေဆာကးရနးအတျကး RelativeLayout တစးခုကိုအသဵု့်ပဳၾကပါမညး၈ friends


map.xml ဖိုငးမြ လိုအပးေသာ Code အ်ပညး႕အစဵုကိုေအာကးတျငးေတျ႕်မငးရမညး်ဖစးပါသညး၈

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


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view class="com.google.android.maps.MapView"
android:id="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:id="@+id/buttonZoomIn"
style="?android:attr/buttonStyleSmall"
android:text="+"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonMapView"
style="?android:attr/buttonStyleSmall"
android:text="Map"
android:layout_alignRight="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonSatView"

style="?android:attr/buttonStyleSmall"
android:text="Sat"
android:layout_alignRight="@+id/myMap"
android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button android:id="@+id/buttonZoomOut"
style="?android:attr/buttonStyleSmall"
android:text="-"
android:layout_alignBottom="@+id/myMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

အခနး့ (၆) မြ FreindMap.java ဖိုငးကိုေလံလာခဲံၿပီ့်ဖစးေသာေၾကာငးံ ယခုေဖား်ပမညး႕လုပးေဆာငးခ္ကးမ္ာ့


ကိုရြငး့်ပေပ့မညးမဟုတးေတာံပါ၈ သိုရာတျငး ရြငး့်ပေပ့မညး႕ method တစးခုရိြပါသညး၈

ိdatabase ကိွ
ု ငးေရာကးရနး၇ record မ္ာ့ကိုဖတးရြဳရနးႏြငးံ Overlay ကိုေရ့ဆျရ
ဲ နးအတျကး LoadFriends()
ဟုေခၚသညး႕ method တစးခုကို်ပဳလုပးတညးေဆာကးပါမညး၈ ထို႕ေၾကာငးံေအာကးတျငးေဖား်ပထာ့သညး႕
LoadFriends() method မြ Code မ္ာ့ကိုၾကညး႕ရြဳေလံလာပါ၈ database ကိုဖျငးံ်ခငး့၇ Location Field ကို
match ႏြငးံ parse ်ပဳလုပး်ခငး့၇ location field အတျငး့ရိြ Latitude ႏြငးံ Longitude တို႕တျငး အမြတးတစးခု
တညးေဆာကး်ခငး့တို႕အ်ပငး Overlay တျငး Point တစးခုကိုေရ့ဆျဲ်ခငး့စသညး႕တို႕ကို သတိ်ပဳ၍ မြတးရြဳ

304 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေလံလာပါ၈ ေနာကးဆဵု့်ပဳလုပးရမညး႕ method မြာ GPS မြ တညးေနရာ coordinate မ္ာ့ရယူရနးႏြငးံ ME


ဟူေသာ label ႏြငးံ Overlay တျငး အဆိုပါ coordinate မ္ာ့ကိုေရ့ဆျဲ်ခငး့တို႕်ဖစးပါသညး၈

public void LoadFriends(MapView mv, MapController mc, Cursor c){


Point myLocation = null;
Double latPoint = null;
Double lngPoint = null;
c.first();
do{
if (c.getString(c.getColumnIndex("location")) != null) {
final String geoPattern = "(geo:[\\-]?[0-9]{1,3}\\.[0
9]{1,6}\\,[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\#)";
Pattern pattern = Pattern.compile(geoPattern);

CharSequence inputStr =
c.getString(c.getColumnIndex("location"));
Matcher matcher = Pattern.matcher(inputStr);

boolean matchFound = matcher.find();


if (matchFound) {
String groupStr = matcher.group(0);
latPoint =

Double.valueOf(groupStr.substring(groupStr.indexOf(":") + 1,
groupStr.indexOf(","))) ;
lngPoint =
Double.valueOf(groupStr.substring(groupStr.indexOf(",") + 1,
groupStr.indexOf("#"))) ;
Point friendLocation = new
Point(latPoint.intValue(),lngPoint.intValue());
drawFriendsOverlay.addNewFriend(c.getString(c.getColumnIndex("name")),
friendLocation);
}
}
}while(c.next());
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Double myLatPoint =
myManager.getCurrentLocation("gps").getLatitude()*1E6;
Double myLngPoint =
myManager.getCurrentLocation("gps").getLongitude()*1E6;
myLocation = new Point(myLatPoint.intValue(),myLngPoint.intValue());
drawFriendsOverlay.addNewFriend("Me", myLocation);

mc.centerMapTo(myLocation, false);
mc.zoomTo(9);
mv = null;
}

FriendsMap.java ဖိုငးမြ က္နးရိြေသာ Code မ္ာ့၏လုပးေဆာငးခ္ကးမ္ာ့မြ အခနး့ (ှွ) တျငးကနဦ့ေဖား်ပခ


ၿပီ့်ဖစးေသာ Zoom ႏြငးံ Toggle button မ္ာ့အတျကးလုပးေဆာငးခ္ကးမ္ာ့သာ်ဖစးပါသညး၈

မ္ကးပျငးံစာေပ 305
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

package android_programmers_guide.FindAFriend;

import android.os.Bundle;
import android.location.LocationManager;
import android.view.View;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.widget.Button;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import android.graphics.Canvas;
import android.graphics.RectF;
import android.graphics.Paint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import com.google.android.maps.MapController;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayController;

public class FriendsMap extends MapActivity {

private static final String[] PROJECTION = new String[] {


Friends.Friend.NAME, Friends.Friend.LOCATION};
public Cursor mCursor;

DrawFriendsOverlay drawFriendsOverlay = new DrawFriendsOverlay();

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.friendsmap);
Intent intent = getIntent();
if (intent.getData() == null) {
intent.setData(Friends.Friend.CONTENT_URI);
}
mCursor = managedQuery(getIntent().getData(), PROJECTION, null,null);

final MapView myMap = (MapView) findViewById(R.id.myMap);


final MapController myMapController = myMap.getController();
LoadFriends(myMap, myMapController, mCursor);
OverlayController myOverlayController =
myMap.createOverlayController();
myOverlayController.add(drawFriendsOverlay, true);
final Button zoomIn = (Button) findViewById(R.id.buttonZoomIn);
zoomIn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomIn(myMap,myMapController);
}});
final Button zoomOut = (Button) findViewById(R.id.buttonZoomOut);
zoomOut.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ZoomOut(myMap,myMapController);
}});
final Button viewMap = (Button) findViewById(R.id.buttonMapView);
viewMap.setOnClickListener(new Button.OnClickListener() {

306 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

public void onClick(View v){


ShowMap(myMap,myMapController);
}});
final Button viewSat = (Button) findViewById(R.id.buttonSatView);
viewSat.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v){
ShowSat(myMap,myMapController);
}});
}

public void LoadFriends(MapView mv, MapController mc, Cursor c){


Point myLocation = null;
Double latPoint = null;
Double lngPoint = null;
c.first();
do{

if (c.getString(c.getColumnIndex("location")) != null) {
final String geoPattern = "(geo:[\\-]?[0-9]{1,3}\\.[0
9]{1,6}\\,[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\#)";
Pattern pattern = Pattern.compile(geoPattern);
CharSequence inputStr =
c.getString(c.getColumnIndex("location"));
Matcher matcher = pattern.matcher(inputStr);

boolean matchFound = matcher.find();


if (matchFound) {
String groupStr = matcher.group(0);
latPoint =
Double.valueOf(groupStr.substring(groupStr.indexOf(":") + 1,
groupStr.indexOf(","))) ;
lngPoint =
Double.valueOf(groupStr.substring(groupStr.indexOf(",") + 1,
groupStr.indexOf("#"))) ;
point friendLocation = new
Point(latPoint.intValue(),lngPoint.intValue());

drawFriendsOverlay.addNewFriend(c.getString(c.getColumnIndex("name")),
friendLocation);
}
}
}while(c.next());
LocationManager myManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Double myLatPoint =
myManager.getCurrentLocation("gps").getLatitude()*1E6;
Double myLngPoint =
myManager.getCurrentLocation("gps").getLongitude()*1E6;
myLocation = new Point(myLatPoint.intValue(),myLngPoint.intValue());
drawFriendsOverlay.addNewFriend("Me", myLocation);

mc.centerMapTo(myLocation, false);
mc.zoomTo(9);
mv = null;
}

public void ZoomIn(MapView mv, MapController mc){


if(mv.getZoomLevel()!=21){
mc.zoomTo(mv.getZoomLevel()+ 1);
}

မ္ကးပျငးံစာေပ 307
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

}
public void ZoomOut(MapView mv, MapController mc){
if(mv.getZoomLevel()!=1){
mc.zoomTo(mv.getZoomLevel()- 1);
}
}
public void ShowMap(MapView mv, MapController mc){
if (mv.isSatellite()){
mv.toggleSatellite();
}

}
public void ShowSat(MapView mv, MapController mc){
if (!mv.isSatellite()){
mv.toggleSatellite();
}
}
protected class DrawFriendsOverlay extends Overlay{
public String[] friendName = new String[0];
public Point[] friendPoint = new Point[0];
final Paint paint = new Paint();

@Override
public void draw(Canvas canvas, PixelCalculator calculator, Boolean
shadow){
for(int x=0;x<friendPoint.length; x++){
int[] coords = new int[2];
calculator.getPointXY(friendPoint[x], coords);
RectF oval = new RectF(coords[0] - 7, coords[1] + 7,
coords[0] + 7, coords[1] - 7);
paint.setTextSize(14);
canvas.drawText(friendName[x],
coords[0] +9, coords[1], paint);
canvas.drawOval(oval, paint);
}
}
public void addNewFriend(String name,Point point ){
int x = friendPoint.length;

String[] friendNameB = new String[x + 1];


Point[] friendPointB = new Point[x + 1];

System.arraycopy(friendName, 0, friendNameB, 0, x );
System.arraycopy(friendPoint, 0, friendPointB, 0, x);

friendNameB[x] = name;
friendPointB[x]= point;

friendName = new String[x + 1];


friendPoint = new Point[x + 1];
System.arraycopy(friendNameB, 0, friendName, 0, x + 1 );
System.arraycopy(friendPointB, 0, friendPoint, 0, x + 1 );

}
}
}

308 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ယခု Project ကိုအဆဵု့သတးရနးအတျကး ေနာကးဆဵု့်ပဳလုပးရမညး႕အလုပးမြာ main activity ်ဖစးေသာ


FindAFriend ကိုတညးေဆာကးရနး်ဖစးပါသညး၈ အဆိုပါ activity သညး တညးေဆာကးထာ့ေသာ အ်ခာ့
activity မ္ာ့ေခၚယူမညး႕ shell တစးခုလညး့်ဖစးပါသညး၈

Creating the FindAFriend Activity


ယခုအပိုငး့ကိုစတငးရနး findafriend.xml ဖိုငးႏြငးံ FindAFriend.java ဖိုငးႏြစးဖိုငးကိုတညးေဆာကးရပါလိမ
မညး၈ အဆိုပါဖိုငးမ္ာ့သညး ယခုလကးရိြအပိုငး့တျငးလုပးေဆာငးရမညး႕ Layout ဖိုငးႏြငးံ Code ဖိုငးမ္ာ့်ဖစး
ၾကပါသညး၈ Layout ဖိုငးသညးအလျနးရို့ရြငး့ၿပီ့ TextView တစးခုသာပါွငးပါသညး၈ အဆိုပါ TextView
သညး Friend မ္ာ့၏စာရငး့တျငး result မ္ာ့ကိုေရ့သာ့ရနး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ friendfriend.xml ဖိုငး
အတျငး့တျငးရိြမညး႕ Code အ်ပညး႕အစဵုမြာ ေအာကးပါအတိုငး့်ဖစးသညး၈

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


<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:gravity="center_vertical"
android:paddingLeft="27dip"
/>

ၤထို႕အတူ FindAFriend.java ဖိုငးတျငးပါရိြေသာ Code မ္ာ့ကိုေအာကးတျငးေဖား်ပထာ့ပါသညး၈ ယခုဖိုငး


အတျငး့မြ Code မ္ာ့ကို ယခုအခနး့တျငးပငး ေဖား်ပခဲံၿပီ့်ဖစးပါသညး၈ ေရြ့ဦ့စျာ database ကိုဖတးရြဳ၍
result မ္ာ့ကို ListView တစးခုသို႕ေရ့သာ့မညး်ဖစးသညး၈ အသဵု့်ပဳသူကeို ntry ်ပငးဆငးရနး သို႕မဟုတး
ဖ္ကးပစးရနးအတျကး menu option မ္ာ့ကိုေဖား်ပေပ့မညး်ဖစးပါသညး၈ ထိုသို႕မဟုတး FriendsMap
Activity ကို Launch ်ပဳလုပးေစမညး်ဖစးသညး၈

package android_programmers_guide.FindAFriend;

import android_programmers_guide.FindAFriend.Friends;
import android.app.ListActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ContentUris;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

မ္ကးပျငးံစာေပ 309
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

import android.view.View.MeasureSpec;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class FindAFriend extends ListActivity {


public static final int DELETE_ID = Menu.FIRST;
public static final int INSERT_ID = Menu.FIRST + 1;
public static final int FIND_FRIENDS = Menu.FIRST + 2;

private static final String[] PROJECTION = new String[] {


Friends.Friend._ID, Friends.Friend.NAME};

private Cursor mCursor;

@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

setDefaultKeyMode(SHORTCUT_DEFAULT_KEYS);

Intent intent = getIntent();


if (intent.getData() == null) {
intent.setData(Friends.Friend.CONTENT_URI);
}

setupList();

mCursor = managedQuery(getIntent().getData(), PROJECTION, null,null);

ListAdapter adapter = new SimpleCursorAdapter(this,


R.layout.findafriend_item, mCursor,
new String[] {Friends.Friend.NAME}, new int[]
{android.R.id.text1});
setListAdapter(adapter);
}

private void setupList() {


View view = getViewInflate().inflate(
android.R.layout.simple_list_item_1, null, null);

TextView v = (TextView) view.findViewById(android.R.id.text1);


v.setText("X");
getListView().setBackgroundColor(Color.GRAY);
v.measure(MeasureSpec.makeMeasureSpec(View.MeasureSpec.EXACTLY,100),
MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED,0));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, INSERT_ID, R.string.menu_insert).setShortcut('3', 'a');
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.ALTERNATIVE_CATEGORY);

menu.addIntentOptions(
Menu.ALTERNATIVE, 0, new ComponentName(this, FindAFriend.class),

310 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

null, intent, 0, null);


return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
final boolean haveItems = mCursor.count() > 0;

if (haveItems) {
Uri uri = ContentUris.withAppendedId(getIntent().getData(),
getSelectedItemId());
Intent[] specifics = new Intent[1];
specifics[0] = new Intent(Intent.EDIT_ACTION, uri);
Menu.Item[] items = new Menu.Item[1];

Intent intent = new Intent(null, uri);


intent.addCategory(Intent.SELECTED_ALTERNATIVE_CATEGORY);
menu.addIntentOptions(Menu.SELECTED_ALTERNATIVE, 0, null,
specifics, intent, 0, items);
menu.add(Menu.SELECTED_ALTERNATIVE, DELETE_ID,
R.string.menu_delete)
.setShortcut('2', 'd');
menu.add(Menu.SELECTED_ALTERNATIVE, FIND_FRIENDS,
R.string.find_friends).setShortcut('4', 'f');
if (items[0] != null) {
items[0].setShortcut('1', 'e');
}
} else {
menu.removeGroup(Menu.SELECTED_ALTERNATIVE);
}
menu.setItemShown(DELETE_ID, haveItems);
return true;
}
@Override
public boolean onOptionsItemSelected(Menu.Item item) {
switch (item.getId()) {
case DELETE_ID:
deleteItem();
return true;
case INSERT_ID:
insertItem();
return true;
case FIND_FRIENDS:
Intent findfriends = new Intent(this, FriendsMap.class);
startActivity(findfriends);
return true;
}
return super.onOptionsItemSelected(item);

}
@Override
protected void onListItemClick(ListView l, View v, int position, longid) {
Uri url = ContentUris.withAppendedId(getIntent().getData(), id);

String action = getIntent().getAction();


if (Intent.PICK_ACTION.equals(action)

မ္ကးပျငးံစာေပ 311
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

|| Intent.GET_CONTENT_ACTION.equals(action)) {
setResult(RESULT_OK, url.toString());
} else {

startActivity(new Intent(Intent.EDIT_ACTION, url));


}
}

private final void deleteItem() {


mCursor.moveTo(getSelectedItemPosition());
mCursor.deleteRow();
}
private final void insertItem() {
startActivity(new Intent(Intent.INSERT_ACTION,
getIntent().getData()));
}
}

ယခုစာအုပး၏ အႀကီ့ဆဵု့၇ အရြညးလ္ာ့ဆဵု့်ဖစးေသာ Activity ကိုတညးေဆာကးေနစဥးအတျငး့တျငး နာ့လညး


လျယးကူစျာေရ့သာ့ႏိုငးေစရနး Programming အသိပညာပမာဏမ္ာ့စျာလိုအပးလြသညးကို သတိ်ပဳမိပါ
လိမးံမညး၈ ေနာကးလာမညး႕အပိုငး့တျငး Activity ကိုေမာငး့နြငးၾကညး႕ၾကမညး်ဖစးၿပီ့ လုပးေဆာငးမညး႕ result
ကိုေလံလာၾကညး႕ၾကပါမညး၈

Running the FindAFriend Activity


FindAFriend Activity ကို Android Emulator အတျငး့တျငးေမာငး့ႏြငးၾကညး႔ပါ၈ ေအာကးပဵုတျငး်ပထာ့
သညး႕အတိုငး့ပငး မညးသညး႕အရာမြ္မရိြေသာ List တစးခုကိုသာေတျ႕်မငးရမညး်ဖစးပါသညး၈ ပထမဆဵု့
Friend တစးဦ့ကိုထညး႕သျငး့ရနးအတျကး Menu Button ကို Click ႏိြပးၿပီ့ Add Friend Option ကိုဆကး
လကးေရျ့ခ္ယးေပ့ရပါမညး၈

312 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

အဆိုပါ Option သညး တညးေဆာကးခဲံၿပီ့်ဖစးသညး႕ Custom View ကို launch ်ပဳလုပးေပ့မညး်ဖစးသညး၈


ေအာကးတျငး ေဖား်ပထာ့သညး႕ပဵုအတိုငး့ Friend တစးဦ့၏အမညးကို ရိုကထ
း ညး႕ၿပီ့ေသာအခါတျငး
Emulator မြ Back arrow ကို်ပနးႏိြပး်ခငး့်ဖငးံ main activity သို႕်ပနးထျကးပါ၈

မ္ကးပျငးံစာေပ 313
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ထို႕ေနာကး ListView အတျငး့တျငး Friend တစးဦ့၏ အမညးကိုရရိြမညး်ဖစးပါသညး၈ ယခုအခါတျငး ေအာကး


တျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ပငး အ်ခာ့ေသာလုပးေဆာငးခ္ကးမ္ာ့ကိုလုပးေဆာငးႏိုငးသညး႕ Option မ္ာ့
ကိုေတျ႕ရိြရမညး်ဖစးပါသညး၈

Edit Location option ကိုေရျ့ခ္ယးပါ၈ ၁ငး့သညး Custom control ကိုေခၚေဆာငးမညး်ဖစးပါသညး၈


ေအာကးေဖား်ပပါပဵုအတိုငး့ Coordinate-based location တစးခုကိုရိုကးထညး႕ပါ၈

314 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

ေနာကးဆဵု့တျငး main activity သို႕်ပနးလညးေရာကးရိြသျာ့မညး်ဖစးၿပီ့ Find Friend Option ကိုေရျ့ခ္ယးပါ၈


ထို႕ေနာကး ေအာကးတျငးေဖား်ပထာ့သညး႕ပဵုအတိုငး့ အသဵု့်ပဳေနသူ (သငး)၏လကးရိြ location ႏြငးံ Friend
၏ Location မ္ာ့ကို ေဖား်ပေပ့ေနသညးကိုေတျ႕ရိြရမညး်ဖစးပါသညး၈

(အိမးစာ) Real-Time Location Updating


FindAFriend Application ကို ME အမြတးသာ့်ဖငးံ ေရႊ႕လ္ာ့သညး႕ေနရာကိုလိုကးပါမညး႕ လမး့ေၾကာငး့ကို
်ပသမညး႕ Application တစးခုကို်ပငးဆငးစမး့သပးေရ့သာ့ၾကညး႕ပါ၈ အဆိုပါလုပးေဆာငးခ္ကးကို update()
ဟူေသာ method ကိုအသဵု့်ပဳ်ခငး့်ဖငးံ လျယးကူစျာလုပးေဆာငးႏိုငးမညး်ဖစးပါသညး၈

ေနာကးဆဵု့အခနး့်ဖစးေသာ အခနး့ (ှဿ) တျငး adb command မ္ာ့ႏြငးံ Android Emulator Option
မ္ာ့ကဲံသို႕ေသာ Android SDK ၏ option အခ္ိဳ႕၏ Reference မ္ာ့ကို အသဵု့်ပဳႏိုငးရနးအလို႕ငြါေဖား်ပ
ေပ့ထာ့ပါသညး၈

မ္ကးပျငးံစာေပ 315
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

316 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Chapter 12
Android SDK Tool Reference

မ္ကးပျငးံစာေပ 317
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

ယခုအခနး့တျငး ဤစာအုပးတျငးေဖား်ပ အသဵု့်ပဳခဲံသညး႕ Android SDK Tool အခ္ိဳ႕အတျကး အဖို့တနး


Reference မ္ာ့ကိုေဖား်ပေပ့မညး်ဖစးပါသညး၈ ထို႕ေၾကာငးံ Android Emulator ႏြငးံ Android Debugging
Bridge တို႕ကိုအသဵု့်ပဳႏိုငးရနး Command-line option အခ္ိဳ႕ကိုေဖား်ပေပ့ထာ့ပါသညး၈

Android Emulator Commands


ေအာကးတျငးေဖား်ပထာ့ေသာ ဇယာ့တျငး အသဵု့မ္ာ့ေသာ Android Emulator Command မ္ာ့ကို
ေဖား်ပေပ့ပါမညး၈ ထို႕အ်ပငး ရြငး့လငး့ခ္ကးအတိုေကာကးမ္ာ့်ဖငးံလညး့ Command တစးခုစီအတျကး
ရြငး့လငး့ေပ့ထာ့ပါသညး၈

Emulator Command Function


emulator –console Enables the console shell on the current
terminal
emulator –data <filename> Uses a different file as the working use-
data disk image
emulator –debug-kernel Sends kernel output to the console
emulator –flash-keys Flashes keypresses on the device skin
emulator –help Prints a list of all Emulator commands
emulator –http-proxy <proxy> Makes all TCP connections through a
specified HTTP/HTTPS proxy
emulator –image <file> Uses <file> as the system image
emulator –kernel <file> Uses <file> as the emulated kernel
emulator –logcat <logtags> Enables logcat output with given tags
emulator –mic <device or file> Uses device or WAV file for audio input
emulator –netdelay <delay> Sets network latency emulation to
<delay>. (The <delay> parameter
simulates the delay experienced on
specific types of networks) The <delay>s
you can use are as follows:
318 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

 Gprs
 Edge
 Umts
 None
 <num>
 <min>:<max>
emulator –netfast Shortcut for –netspeed full –netdelay
none
emulator –netspeed <speed> Sets network speed emulator to <speed>.
(The <speed> parameter simulates the
data speed experienced on specific types
of networks) The <speed>s you can use
are as follows:
 Gsm
 Hscsd
 Gprs
 Edge
 Umts
 Hsdpa
 Ful
 <num>
 <up>:<down>
emulator –noaudio Disables Android audio support
emulator –nojni Disables JNI checks in the Dalvik virtual
machine
emulator –noskin Specifies not to use any Emulator skin
emulator –onion <image> Uses overlay image over screen
emulator –onion-alpha <percent> Specifies onion skin translucency value
(as percent)

မ္ကးပျငးံစာေပ 319
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

emulator –qemu Passes arguments to QEMU


emulator –qemu –h Displays QEMU help
emulator –radio <device> Redirects the radio modem interface to a
host character device
emulator –ramdisk <file> Uses <file>as the ramdisk image
emulator –raw-keys Disables Unicode Keyboard reverse
mapping
emulator –sdcard <file> Uses <file> as the SD Memory Card
image
emulator –skin <skinID> Starts the Emulator with the specified
skin:
 HVGA-L 480x320, landscape
 HVGA-P 320x480, portrait (default)
 QVGA-L 320x240, landscape
 QVGA-P 240x320, portrait
emulator –system <dir> Searches system, ramdisk, and user-data
disk images in <dir>
emulator –trace <name> Enables code profiling (press F9 to start),
written to a specified file
emulator –useaudio Enables Android audio support
emulator –verbose Enables verbose output
emulator –verbose-keys Enables verbose keypress messages
emulator –verbose-proxy Enables verbose proxy debug messages
Emulator –wipe-data Deletes all data on the user-data disk
image (see emulator –data <filename>)
before starting

320 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

Android Debug Bridge Commands


ေအာကးတျငးေဖား်ပထာ့ေသာ Command မ္ာ့သညး GSM Command မ္ာ့်ဖစးသညး၈ ၁ငး့တို႕ကို
Emulator ၏ Terminal console ်ဖငးံခ္ိတးဆကး၍ အသဵု့်ပဳႏိုငးပါသညး၈ အကယး၍ Port terminal
console ကိုမသိပါက Debug port ထကးတစးခုေလြ္ာံနညး့သညးဟုမြတးယူပါ၈ adb devices ဟူေသာ
Command ကိုအသဵု့်ပဳ၍ ခ္ိတးဆကးထာ့ေသာ (အသဵု့်ပဳႏိုငးေသာ) Device မ္ာ့ႏြငးံ ၁ငး့ Device မ္ာ့ႏြငးံ
ဆကးႏျယးသညး႕ Port နဵပါတးမ္ာ့ကို သိရိြေစႏိုငးပါသညး၈

adb Command Function


adb help Prints a list of supported adb commands
adb install <path-to-apk> Pushes an Android application (specified
as a full path to an .apk file) to the data
file of an Emulator/device
adb jdwp Prints a list of aviable JDWP processes on
a given device
adb kill-server Terminated the adb server process
adb logcat [<option>] [<filter specs>] Prints log data to the screen
adb ppp <tty> [parm]… Runs PPP over USB:
 <tty> The tty for PPP stream; for
example, dev:/dev/omap_csmi_ttyl
 [parm]… Zero or more PPP/PPPD
options, such as defaultroute, local,
notty, etc
Note that you should not automatically
start a PDP connection.
adb pull <remote><local> Copies a specified file from an Emulator/
device instance to your development
computer
adb push <local><remote> Copies a specified file from your develop-
ment computer to an Emulator/device
မ္ကးပျငးံစာေပ 321
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရးဆြဖ
ဲ န္တီးလိုသူမ်ားလက္စြဲ

instance
adb shell Starts a remote shell in the target
Emulator/ device instance
adb start-server Checks whether the adb server process is
running and, if not, starts it
adb status Reports the current GSM voice/data state
adb unregistered Indicates no network is available
adb version Prints the adb version number
adb voice <state> Changes the state of the GPRS voice
connection to <state>
adb wait-for-bootloader Blocks execution, until the bootloader is
online – that is, until the instance state is
bootloader
adb wait-for-device Blocks execution until the device is online
– that is, until the instance state is device

322 မ္ကးပျငးံစာေပ
ရဲမင္းေအာင္(Ray-Electronic) ANDROID APPLICATION ေရ့ဆျဲဖနးတီ့လိုသူမ္ာ့လကးစျဲ

နိဂဵု့
ယခုစာအုပးတျငး Programming ဘာသာရပးမ္ာ့ကိုေလံလာရာတျငးအသကး်ဖစးေသာ အေ်ခခဵအုတး်မစး်ဖစး
ေသာ အေ်ခခဵသေဘာတရာ့မ္ာ့ႏြငးံတကျ အ်ခာ့ေသာသိသငးံသိထိုကးေသာ၇ တတးသငးံတတးထိုကးေသာ
ဗဟုသုဓမ္ာ့၇ လုပးေဆာငးခ္ကးမ္ာ့ကို ဥပမာမ္ာ့ႏြငးံတကျ ေဖား်ပထာ့ခဲံၿပီ့်ဖစးပါသညး၈ အကယး၍ ယခုစာ
အုပးသညး Programmer တစးဦ့်ဖစးလာေစရနး ၿပီ့်ပညး႕စဵုမႈ ရိြ၇ မရိြ ေမ့်မနး့လာခဲံလြ္ငးမူ လဵု့ွဥႆဵု်ပညး႕စဵု
မႈမရိြေၾကာငး့ ေ်ဖဆိုရမညးသာ ်ဖစးပါသညး၈ Programmer တစးဦ့အ်ဖစး အသကးေမျ့ွမး့ေက္ာငး့်ပဳရနး
ရညးရျယးထာ့သူမ္ာ့ကို အုတးတစးခ္ပး၇ သဲတစးပျငးံမြ္ အေထာကးအကူ်ဖစးလာေစရနး ရညးရျယး၍ ယခုစာအုပး
ကိုေရ့သာ့ခဲံၿခငး့သာ်ဖစးပါသညး၈

အေပ္ားတမး့ေလံလာသူမ္ာ့အတျကးလညး့ မခကးခဲေသာ Android Application မ္ာ့ေရ့သာ့ႏိုငးရနး


အတျကး ယခုစာအုပးကိုေလံလာႏိုငးပါသညး၈ သို႕ရာတျငး အေပ္ားတမး့အဆငးံအတျကး ယခုစာအုပးတျငးပင
ရပးတနး႕ထာ့သငးံၿပီ့ အသကးေမျ့ွမး့ေက္ာငး့သမာ့မ္ာ့အတျကး အသဵု့ခ္ Android Application မ္ာ့ေရ့
သာ့နညး့ စာအုပးႏြငးံ Android Game မ္ာ့ေရ့သာ့နညး့ စေသာစာအုပးမ္ာ့ကို မၾကာမီ ွယးယူဖတးရြဳႏိုင
မညး်ဖစးပါသညး၈

မညးသို႕ပငးဆိုေစ နညး့ပညာအတျကး ယခုစာအုပးသညး သဲတစးပျငးံမြ္ ်ဖစးခဲံလြ္ငးပငး ေရ့သာ့ရက္ိဳ့နပး၍


အေမာေ်ပေစမညး်ဖစးသညး၈

ေမတၱာ်ဖငးံ

ရဲမငး့ေအာငး

BE (Electronics)

မ္ကးပျငးံစာေပ 323

Potrebbero piacerti anche