AND ROI D FAST T RACK
Tentang Penulis
Agus Haryanto, MKOM http://agusharyanto.net @agus_inovator
[email protected] 08551000444 / 089673371119
Juara 2 Indosat M2 Android Application Contest Juara Harapan Kompetisi Android T-Market (Telesindo) Juara 1 BBDEVID Challenge Blackberry Application (Webworks) Juara 1 AngelHack Blackberry Indonesia
ANDROID FAST TRACK A G U S H A R YA N T O
CONTENTS Preface...........................................................................................................vii Pengenalan Android.......................................................................................9 Kenalan dengan Android............................................................................9 Instalasi Android.......................................................................................10 Project Android pertama...........................................................................11 Pengenalan User Interface...........................................................................19 Mengenal Layout.....................................................................................19 Mengenal View........................................................................................36 Android Database SQLITE...........................................................................49 SQLITE....................................................................................................49 Kamus Tiga Bahasa (CRUD)...................................................................50 Android Google Map.....................................................................................87 Menampilkan Data GPS..........................................................................87 Menampilkan Map pada Android.............................................................95 Menampilkan Direction pada Map..........................................................111 Android PHP MySQL..................................................................................125 CRUD Android PHP Mysql.....................................................................125 Penutup......................................................................................................151 Semangat...............................................................................................151 Seminar Workshop Android...................................................................151 Referensi................................................................................................152
v | Android Fast Track
PREFACE Android begitu fenomenal diusianya masih muda sudah mampu mendominasi pasar smartphone dunia. Bagi pengembang aplikasi itu adalah pasar yang besar untuk aplikasinya. Untuk membuat aplikasi android tidaklah sesulit yang dibayangkan. Syarat utamanya kita harus menguasai dasar java dan konsep object orientedya (OOP). Pada buku Android Fast Track ini akan membahas bagian-bagian penting dalam pembuatan aplikasi Android meliputi Pengenalan dasar pembuatan aplikasi android, pengenalan cara menggunakan database sqlite android, pengenalan cara menggunakan Map API 2 untuk mengembangkan aplikasi android yang menggunakan peta. Pengenalan cara membuat aplikasi android yang datanya tersimpan di server Buku ini tentunya masih jauh dari sempurna. apabila
ada
masukkan
langsung
saja
Untuk itu email
ke
[email protected]. Untuk melihat tutorial android lainnya dapat
berkunjung
ke
situs
http://agusharyanto.net
Untuk kampus atau sekolah yang berminat mengadakan seminar atau workshop android atau lainnya bisa hubungi saya di email
[email protected] atau di 0855-1000-444.
,twitter @agus_inovator
Khusus untuk luar kota biaya trans-
portasi dan akomodasi ditanggung penyelenggara acara.
vii
1 PENGENALAN ANDROID
KENALAN
DENGAN
ANDROID
Sebelum melangkah lebih jauh, alangkah baiknya jika kita mengenal apa itu android. Android adalah Sistem Operasi yang dikembangkan dan dipopulerkan oleh Google. Andy Rubin dapat kita sebut sebagai otak utama dibalik OS android ini. Pada awalnya perkembangan OS Android ini kurang begitu bagus, Hal ini membuat Google turun tangan dengan turut melahirkan ponsel Google Android pertama yang legendaris yang dikenal dengan nama Nexus One. Di Nexus One ini Google menunjukkan kemampuan android yang sebenarnya dan hasilnya luar biasa, tanggapan pasar begitu bagus. Hal inilah yang mendorong minat perusahaan-perusahaan Smarthone bersemangat untuk membuat Smartphone dengan OS Android. Dan hasilnya dapat dilihat saat ini android menguasai pasar Smartphone Dunia dengan dipimpin oleh Samsung dengan seri Galaxynya. Berikut saya tampilkan data analisis dari Gartner.
ANDROID FAST TRACK
Ada Sistem Operasi berarti ada aplikasi yang dapat kita buat di dalamnya. Pada Android Fast Track ini kami mencoba mengenalkan cara membuta aplikasi pada android, disini metode yang diterapkan akan lebih banyak praktek.
I N S TA L A S I A N D R O I D Sebelum memulai membuat aplikasi android tentunya kita harus mempersiapkan softwarenya terlebih dahulu. Step Instalaasi : 1.
Download Java 1.7 dari oracle.com http://www.oracle.com/technetwork/java/javase/downloads/j dk7-downloads-1880260.html lalu install.
2. Download Ecliplse Bundle (Eclipse + ADT + Android SDK Platform) dari developer.andorid.com http://developer.android.com/sdk/index.html#win-bundle 3. Unzip file yang didownload ke direktori yang kita inginkan misalanya “c:\development” 4. Instalasi Selesai. Untuk menjalankannnya, masuk ke direktori eclipse dari file yang diunzip lalu jalankan eclipse 5.
Untuk mendownload Platform android lainnya, jalankan SDKManager
Untuk Spesifikasi Hardwarenya agar terasa nyaman waktu develop aplikasi sebaikanya gunakan komputer dengan processor core i3 keatas dan memori 4GB 10 |
ANDROID FAST TRACK
AGUS HARYANTO
PROJECT ANDROID
P E R TA M A
Dalam hidup selalu ada yang pertama, demikian juga dengan belajar. Kali ini kita akan membuat project Android Pertama kita. 1.
Pada eclipse dibagian toolbar klik New
2. Pada jendela yang tanpil, klik folder Android, lalu pilih Android Application Project lalu klik Next 3. Isilah isian pada jendela New Android Application
Field
Keterangan
Application Name
Nama Aplikasi. Yang akan terlihat pada Icon Launcher Aplikasi.
Project Name
Nama Project. Nama Project ini boleh beda dengan nama Aplikasi.
Package Name
Nama package aplikasi kita, biasanya diawali dengan domain_organisasi lalu nama aplikasi.
11 | Pengenalan Android
ANDROID FAST TRACK
Misalnya net.agusharyanto.myfirstapp Minimum Required SDK
Minimum SDK yang diperbolehkan untuk menjalankan aplikasi.
Target SDK
Target SDK yang akan menjalakan Aplikasi.
Compile With
Aplikasi akan di compile dengan SDK versi ini.
Theme
Theme yang akan dipakai untuk develop aplikasi. Klik Next 4. Mucul Jendela untuk mengkonfigurasi project, biarkan saja dengan nilai default. Klik Next 5.
Muncul Jendela untuk mengatur Icon dari Aplikasi disini kita harus menyiapkan Icon dengan ukuran 32x32, 48x48, 72x72, 128x128. Jika belum siap klik Next saja.
6. Pada jendela Activity pilih Empty Activity lalu klik Next. Jika ingin pakai Fragment pilih Blank Activity. Karena baru belajar kita pilih yang tanpa Fragment yaitu Empty Activity 7.
Pada jendela Empty Activity, kita bisa menentukan nama Activity dan layoutnya, untuk awal kita gunakan suja nilai yang sudah ada (default) lalu klik Finish
Setelah selesai, maka kita sudah berhasil membuat project android dan bisa langsung merun aplikasinya. Tetapi sebelumnya kita harus memperhatikan beberapa file dan direktori yang ada pada project kita.
12 |
ANDROID FAST TRACK
AGUS HARYANTO
AndroidManifest.xml Pada file ini konfigurasi projectkita ditentukan, meliputi •
Default Activity yang akan dijalankan pada saat aplikasi dijalankan
13 | Pengenalan Android
ANDROID FAST TRACK
•
Daftar Activity dan Service yang akan digunakan dalam aplikasi.
•
Datftar Permission
•
Minimal SDK yang dapat menjalankan Aplikasi.
•
Icon Aplikasi.
src/ Direktori src/ adalah direktori dimana file-file class java aplikasi kita disimpan res/ Direktory res adalah direktori dimana file-file resource yang berkaitan dengan aplikasi disimpan ada beberapa direktori penting dibawah res/ ini •
layout/ direktori layout adalah tempat untuk menyimpan xml file layout user interface aplikasi.
•
values/ direktori values adalah tempat untuk meyimpan file xml resource yang berkaitan dengan xml layout seperti String Definition dan Color Definition
•
drawable-***/ adalah direktori untuk menyimpna file-file gambar, suara dan lainnya yang digunakan dalam aplikasi.
Setelah kita mengerti, mari kita run projectnya, caranya adalah pada dari menu eclipse pilih Run ----> Run As ----> Android Application Jika belum ada Emulator AVDnya kita bisa menambahkan melalui menu Window ---> AVD Manager Terlihat kita sudah berhasil menjalankan project kita.
14 |
ANDROID FAST TRACK
AGUS HARYANTO
Dari mana tulisan “Hello world!” Yang pertama kita lihat adalah file AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="net.agusharyanto.myfirstapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> 15 | Pengenalan Android
ANDROID FAST TRACK
Perhatikan disini activity yang dieksekusi pertama kali adalah MainActivity Mari kita buka file MainActivity.java package net.agusharyanto.myfirstapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { 16 |
ANDROID FAST TRACK
AGUS HARYANTO
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Perhatikan activity_main.xml
Disini menggunakan relative layout yang didalamnya ada TextView dari sinilah android:text="@string/hello_world" HelloWorld muncul, buka file string.xml
<string name="app_name">MyFirstApp <string name="action_settings">Settings 17 | Pengenalan Android
ANDROID FAST TRACK
<string name="hello_world">Hello world!
Tugas Jawablah Pertanyaan-pertanyaan dibwah ini. 1.
Apa itu Android ?
2. Apayang membuat anda tertarik belajar membuat aplikasi android ? 3. Apa keuntungan yang didapat jika kita mempunyai kemampuan untuk membuat aplikasi android ? 4. Anda lebih suka bahasa java atau HTML 5 ? 5.
Anda suka dengan programming ?
18 |
2 PENGENALAN USER I N T E R FA C E Sebelumnya kita sudah belajar membuat aplikasi sederhana pada Android. Sekarang kita melangkah ke aplikasi yang lebih menarik, yaitu aplikasi yang sudah menggunakan beberapa object view groups dan view.
M E N G E N A L L AY O U T Pada Android layout memegang peranan penting terutama pada user interface. Dalam layout biasany didalamnya terdiri dari satu atau lebih objek view sehingga dapatlah disebut Layout adalah View Group. Ada beberapa layout yang berlaku di android. Linear Layout Linear Layout sesuai dengan namanya digunakan untuk menyusun view sacara linear vertical atau horizontal. Agar Lebih memahaminya mari kita buat satu project yang menggunakan linear layout
ANDROID FAST TRACK
1. Buat project baru, isi kan parameter-parameternya seperti dibawah ini
20 |
ANDROID FAST TRACK
AGUS HARYANTO
Field
Isi
Application Name
BelajarLinearLayout
Project Name
BelajarLinearLayout
Package Name
net.agusharyanto.belajarlayout
Minimum SDK
Api 8: Android 2.2 (Froyo)
Required
Target SDK
Api 19: Android 4.4 (KitKat)
Compile With
Holo Light With Dark Action Bar
Activity Name
BelajarLinearLayoutActivity
Layout Name
main
2. Buka File activity_main.xml kemudian ketikan kode berikut
ANDROID FAST TRACK
android:layout_height="fill_parent" android:layout_weight="1"/> <EditText android:id="@+id/EditText1" android:text="Baris Dua" android:textSize="15pt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:id="@+id/Button1" android:text="Baris Tiga" android:textSize="15pt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/>
22 |
ANDROID FAST TRACK
AGUS HARYANTO
android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/> Coba perhatikan kita ada tiga tag LinearLayout. 1. LinearLayout yang paling luar android:orientation diset vertical, yang berarti setiap view atau layout yang berada didalamnya akan disusn secara vertical. 2. LinearLayout yang kedua berada didalam LinearLayout yang diluar, android:orientation diset horizontal , yang berarti setiap view atau layout yang berada didalamnya akan disusun secara horizontal 3. Linear Layout yang ketiga juga berada didalam LinearLayout yang diluar, android:orientation diset vertical yang berarti setiap view atau layout yang berada didalamnya akan disusun secara vertical LinearLayout yang paling luar bisa disebut parent dari LinearLayout yang kedua dan ketiga. Disini kita juga mulai dikenalkan dengan beberapa tag baru yang masuk kedalam golongan view Tag
Fungsi
TextView
Untuk menampilkan Text dalam bentuk label
EditText
Untuk Menampilkan Inputan Text
Button
Digunakan untuk menampilkan button atau tombol.
Diatas juga terlihat properti-properti (Kalau kita biasa dengan HTML ini bisa disebut Atribut dan CSSnya) yang melekat pada masing-masing view. Property (Atribut)
23 | Pengenalan User Interface
fungsi
ANDROID FAST TRACK
android:id
Menetapkan id dari suatu view
android:text
Menetapkan isi text yang akan ditampilkan
Property (CSS)
fungsi
android:textSize
Menetapkan besar ukuran huruf
android:layout_width
Menetapkan lebar dari suatu view
android:layout_height
Menetapkan tinggi dari suatu view
android:layout_weight
Menunjukkan berapa banyak ruang ekstra dalam LinearLayout akan dialokasikan ke tampilan yang terkait dengan LayoutParams.
android:gravity
Menentukan tempat object/view pada suatu layout
Agar lebih memahami fungsi dari property-property diatas cobalah baca javadoc android pada situs developer.andorid.com dan coba rubah nilainya. 3. Buka File MainActivity.java package net.agusharyanto.belajarandroidlayout; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
24 |
ANDROID FAST TRACK
4.
AGUS HARYANTO
Sekarang Mari kita jalankan projectnya
TableLayout Yang namanya table pasti ada baris dan kolom, demikian juga dengan TableLayout ini, view yang ada dalam layout ini akan disusun berdasarkan baris dan kolomnya.dimana ada TableLayout maka didalamnya akan ada TableRow TableRow adalah child dari TableLayout. Setiap Satu TableRow merupakan 1 baris dalam table. Pusing yang dengan teori, yah sudah kita langsung praktek saja.
25 | Pengenalan User Interface
ANDROID FAST TRACK
Masih dengan project yang tadi buat pada directory res/layout buat layout baru dengan nama tablelayout.xml
26 |
ANDROID FAST TRACK
27 | Pengenalan User Interface
AGUS HARYANTO
ANDROID FAST TRACK
Sacara ototmatis akan membuat file tablelayout.xml difolder layout, Edit file tersebut lalu ketikkan kode berikut
28 |
ANDROID FAST TRACK
AGUS HARYANTO
Pada file tablelayout.xml diatas terdapat 1 TableLayout yang didalamnya 3 TableRow, disetiap TableRow masing-masing mempunya 2 TextView, dari struktur code diatas maka akan terlihat sebuah table yang mempunyai 3 baris dan 2 kolom. buka file MainActivity.java rubah layout yang digunakan un tuk activity ini menjadi yang semula activity_main menjadi tablelayout package net.agusharyanto.belajarandroidlayout; import android.app.Activity; import android.os.Bundle; 29 | Pengenalan User Interface
ANDROID FAST TRACK
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tablelayout); } }
Sekarang mari kita run projectnya
Nah Betulkan hasilnya dalam bentuk table dangan 3 baris dan 2 kolom. RelativeLayout 30 |
ANDROID FAST TRACK
AGUS HARYANTO
RelativeLayout sesuai dengan namanya, disini kita dapat menentukan posisi dari suatu view berdasarkan sudut pandang parent atau siblingnya. Agar lebih mudah dimengerti mari kita mulai lagi codingnya 1. Masih dengan project yang tadi buat pada directory res/layout buat layout baru dengan nama relativelayout.xml caranya sama seperti buat tablelayout diatas hanya pada jendela New Android XML File pada root elementnya pilih RelativeLayout
Pada file relativelayout.xml ketikan kode berikut
31 | Pengenalan User Interface
ANDROID FAST TRACK
<EditText android:id="@+id/entry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/editbox_backgro und" android:layout_below="@id/label" /> <Button android:id="@+id/kirim" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/entry" android:layout_alignParentRight="true" android:layout_marginLeft="10px" android:text="Kirim" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/kirim" android:layout_alignTop="@id/kirim" android:text="Cancel" /> 2. Buka file MainActivity.java package net.agusharyanto.belajarandroidlayout; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.relativelayout); } }
32 |
ANDROID FAST TRACK
3.
AGUS HARYANTO
Sekarang mari kita run projectnya
AbsoluteLayout Absolute Layout dapat digunakan untuk meletakkan view sesuai dengan posisi yang kita inginkan. •
Masih dengan project yang tadi buat pada directory res/layout buat layout baru dengan nama absolutelayout.xml
<Button android:layout_width="188px" android:layout_height="wrap_content" android:text="Button" android:layout_x="126px" android:layout_y="361px" />
33 | Pengenalan User Interface
ANDROID FAST TRACK
<Button android:layout_width="113px" android:layout_height="wrap_content" android:text="Button" android:layout_x="12px" android:layout_y="361px" />
•
Buka file MainActivity.java
package net.agusharyanto.belajarandroidlayout; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.absolutelayout); } }
•
Sekarang mari kita run projectnya
34 |
ANDROID FAST TRACK
AGUS HARYANTO
MENGENAL VIEW Sebelumnya kita telah belajar tentang layout pada android disitu melihat ada TextView, Button dan lain-lain. Nah TextView, Button dan kawan-kawannya itu kalau diandroid disebut sebagai View, View ini adalah komponen-komponen yang membentuk user interface pada aplikasi android. Kita bisa mengelompokkan view ini dalam beberapa group. •
Basic Views, biasanya ini yang umum atau sering digunakan seperti TextView, EditText dan Button
•
Picker Views, biasanya berupa pilihan untuk menginputkan Date dan Time seperti DatePicker dan TimePicker.
•
List Views, biasanya menampilkan daftar pilihan yang panjang seperti ListView dan Spinner View
•
Display Views – view yang digunakan untuk menampilkan gambar seperti Gallery dan ImageSwitcher views.
35 | Pengenalan User Interface
ANDROID FAST TRACK
•
Menus – views yang menampilkan tambahan menu ataupun context menu
•
Additional Views seperti AnalogClock dan DigitalClock
Basic View Pada Seksi ini, kita akan membahas basic view pada android, untuk meudahkan saya akan menjelaskanya dalam bentuk table
TextView
EditText
Button
ImageButton
CheckBox
ToggleButton
RadioButton
RadioGroup Widget
Fungsi
TextView
sama seperti label pada SWING, yaitu untuk menampilkan tulisan dilayar.
EditText
sama seperti TextBox pada SWING, yaitu untuk user menginputkan data
Button
Sama seperti Button pada SWING yaiu sebagai Trigger untuk menjalankan suatu Fungsi
ImageButton
Sama fungsinya seperti Button, Bedanya Button ini didalamnya ada gambarnya
CheckBox
Digunakan apabila ada pertanyaan pilihan yang jawabannya bisa lebih dari satu
Radio Button
Biasanya digunakan untuk pilihan yang jawabannya 1
Radio Group
Kumpulan dari Radio Button 36 |
ANDROID FAST TRACK
AGUS HARYANTO
Sekarang mari kita coba gunakan view-view diatas kedalam aplikasi. 1.
Buat New Android Projectnya
37 | Pengenalan User Interface
ANDROID FAST TRACK
2. edit file activity_main.xml
<Button android:id="@+id/btnSave" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Save" /> <Button android:id="@+id/btnOpen" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Open" /> <EditText android:id="@+id/txtName" android:layout_width="fill_parent" android:layout_height="wrap_content" />
ANDROID FAST TRACK
AGUS HARYANTO
>
39 | Pengenalan User Interface
ANDROID FAST TRACK
Perhatikan atribut id yang mewakili identitas dari setiap view. Untuk mendeklarasikan id pada sebuah view harus diawali dengan “@+id/” diikuti dengan nama yang ingin kita berikan 3.
Sekarang mari kita jalankan projectnya
Coba kita sentuh beberapa view, hasilnya ada yang seperti ini
40 |
ANDROID FAST TRACK
AGUS HARYANTO
Tetapi tentunya kita tidak ingin hanya ditampilan saja yang berubah. Tentunya kita ingin program juga dapat menangkap apa yang terjadi pada user Interface.
Untuk itu mari kita buka otak dari project kita, yaitu file MainActivity.java package net.agusharyanto.basicview; import android.app.Activity; import android.os.Bundle; import android.view.View;
41 | Pengenalan User Interface
ANDROID FAST TRACK
import android.widget.Button; import android.widget.CheckBox; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; import android.widget.ToggleButton; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //---Button view--Button btnOpen = (Button) findViewById(R.id.btnOpen); btnOpen.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(getBaseContext(), "You have clicked the Open button", Toast.LENGTH_SHORT).show(); } }); Button btnSave = (Button) findViewById(R.id.btnSave); btnSave.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { DisplayToast("You have clicked the Save button"); } }); //---CheckBox--CheckBox checkBox = (CheckBox) findViewById(R.id.chkAutosave); checkBox.setOnClickListener(new View.OnClickListener() {
42 |
ANDROID FAST TRACK
AGUS HARYANTO
checked");
public void onClick(View v) { if (((CheckBox)v).isChecked()) DisplayToast("CheckBox is else
DisplayToast("CheckBox is
unchecked");
}
}); //---RadioButton--RadioGroup radioGroup = (RadioGroup) findViewById(R.id.rdbGp1); radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { //---displays the ID of the RadioButton that is checked--DisplayToast(Integer.toString(checkedId)); } }); //---ToggleButton--ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggle1); toggleButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (((ToggleButton)v).isChecked()) DisplayToast("Toggle button is On"); else DisplayToast("Toggle button is Off"); } }); } private void DisplayToast(String msg) { Toast.makeText(getBaseContext(), msg,
43 | Pengenalan User Interface
ANDROID FAST TRACK
}
Toast.LENGTH_SHORT).show();
}
Oke mari kita perhatikan code by codenya Button btnOpen = (Button) findViewById(R.id.btnOpen); btnOpen.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(getBaseContext(), "You have clicked the Open button", Toast.LENGTH_SHORT).show(); } }); Agar sebuah view bisa kita manipulasi (merubah isi, atau menangkap event) perlu didaftarkan di code activity. Contoh diatas kita mendaftarkan View (Button) dengan id btnOpen kedalam sebuah variable btnOpen. setelah itu kita bisa menambahkan listener pada button tersebut, kalau pada code diatas yang kita daftarkan adalah setOnClickListener. Efek yang terjadi adalah apabila btnOpen diklik maka akan mengeksekusi perintah yang ada pada method onClick. Pada kode diatas akan menampilkan popup informasi dalam bentuk Toast Untuk Button lainnya dan view lainnya silahkan dicoba sendiri. Dan perhatikan pada method setOnclick dari masing-masing view.
44 |
ANDROID FAST TRACK
AGUS HARYANTO
Tugas Kerjakan tugas-tugas dibawah ini 1.
Buatlah aplikasi kalkulator sederhana yang fungsinya menghitung dua bilangan seperti dibawah ini
45 | Pengenalan User Interface
ANDROID FAST TRACK
46 |
ANDROID FAST TRACK
47 | Pengenalan User Interface
AGUS HARYANTO
3 A N D R O I D D ATA B A S E SQLITE Sebelumnya kita sudah belajar membuat aplikasi sederhana pada Android, nah sekarang mari kita buat aplikasi yang lebih keren, aplikasi yang menggunakan database SQLite.
S QL I T E Seperti telah dijelaskan diatas database pada android menggunakan SQLite. Dengan SQLite untuk insert, update dan query data dapat dilakukan dengan syntak SQL. Untuk itu sebelum melangkah pembuatan aplikasi Android yang memanfatkan firtur SQlite databasenya, kita harus menguasai cara menggunakan SQLite. Sama seperti database lainnya syntak SQLnya terbagi 2 kategori yaitu syntak untuk Data Definition Language (DDL) dan Data Manipulation Language (DML). Bagi yang pernah belajar database pasti tidak asing dengan kedua istilah tersebut. Sekarang ada pertanyaan nih apa beda DDL dan DML ?
ANDROID FAST TRACK
Biar mudah dipahami, kalau database itu kita ibaratkan sebuah rumah, maka DDL itu adalah syntax untuk membuat rumah, menambah kamar, merubah bangunan rumah, makanya yang termasuk syntak-syantak DDL adalah create table, alter table, drop table. sedangkan DML adalah syntax untuk mengetahui isi rumah, siapa saja penghuninya, berapa jumlahnya, ada berapa yang pria dan yang wanita, adakah anak-anak dirumah itu. Makanya yang termasuk syntak-syntak DML adalah insert, update, delete, select Untuk mengetahui lebih lanjut tentang sqlite bisa kunjungi SQLite Home Page
KAMUS TIGA BAHASA (CRUD) Sekarang mari kita buat project yang menggunakan database sqlite di android. Dulu sebelum pakai android dihandphone yang dulu pasati pernah install kamus inggris Indonesia, yang kita gunakan untuk mencari terjemahan suatu kata dalam bahasa indonesia ke bahasa inggris dan jerman. Sebetulnya diandroid juga sudah ada yang buat. Tetapi tentunya akan lebih puas jika kita buat sendiri. Goal dari Aplikasi ini adalah untuk memahami CRUD dbsqlite pada Android. Berikut langkah-langkahnya 1.
Buat project baru android dengan nama Kamus
50 |
ANDROID FAST TRACK
AGUS HARYANTO
2. Buat Class baru dengan nama DatabaseHelper.java package net.agusharyanto.kamus; import import import import
android.content.ContentValues; android.content.Context; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "dbkamus"; public static final String INGGRIS= "inggris"; public static final String INDONESIA = "indonesia"; public static final String JERMAN = "JERMAN"; //Constructor DataKamus untuk initiate database 51 | Android Database SQLITE
ANDROID FAST TRACK
public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, 1); } //method createTable untuk membuat table kamus public void createTable(SQLiteDatabase db){ db.execSQL("DROP TABLE IF EXISTS kamus"); db.execSQL("CREATE TABLE if not exists kamus (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "inggris TEXT, indonesia TEXT, jerman TEXT);"); } //method generateData untuk mengisikan data ke kamus.
public void generateData(SQLiteDatabase db){ ContentValues cv=new ContentValues(); cv.put(INGGRIS, "run"); cv.put(INDONESIA, "lari"); cv.put(JERMAN, "laufen"); db.insert("kamus", INGGRIS, cv); cv.put(INGGRIS, "walk"); cv.put(INDONESIA, "jalan"); cv.put(JERMAN, "gehen"); db.insert("kamus", INDONESIA, cv); cv.put(INGGRIS, "read"); cv.put(INDONESIA, "membaca"); cv.put(JERMAN, "lesen"); db.insert("kamus", JERMAN, cv); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub createTable(db); generateData(db); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //Toast.makeText(getBaseContext(), "Oncreate", Toast.LENGTH_SHORT).show(); createTable(db);
52 |
ANDROID FAST TRACK
}
AGUS HARYANTO
generateData(db);
} Pada class inilah database dibuat dengan nama dbkamus, disini table juga dibuat dengan nama kamus dan diisikan dengan beberapa data. 3. Edit file activity_main.xml pada direktori res/layout lalu ketikan kode berikut
<EditText android:id="@+id/txtInggris" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" > <requestFocus> <Button android:id="@+id/btnTerjemah" android:layout_width="fill_parent" 53 | Android Database SQLITE
ANDROID FAST TRACK
android:layout_height="wrap_content" android:onClick="getTerjemahan" android:text="Terjemahkan" > <EditText android:id="@+id/txtIndonesia" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false" android:text="" > <EditText android:id="@+id/txtJerman" android:layout_width="fill_parent" android:layout_height="wrap_content" > Disini untuk user interface menggunakan linear layout yang didalamnya ada tiga edit text dan satu button 4. Edit file MainActivity.java yang ada apada direktori src/ lalu ketikan kode berikut package net.agusharyanto.kamus; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;
54 |
ANDROID FAST TRACK
import import import import
AGUS HARYANTO
android.os.Bundle; android.view.View; android.widget.EditText; android.widget.Toast;
public class MainActivity extends
Activity {
private SQLiteDatabase db = null; private Cursor kamusCursor = null; private EditText txtInggris; private EditText txtIndonesia; private EditText txtJerman; private DatabaseHelper datakamus = null; public static final String INGGRIS = "inggris"; public static final String INDONESIA = "indonesia"; /** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); datakamus = new DatabaseHelper(this); db = datakamus.getWritableDatabase(); setContentView(R.layout.activity_main); txtInggris = (EditText) findViewById(R.id.txtInggris); txtIndonesia = (EditText) findViewById(R.id.txtIndonesia); txtJerman = (EditText) findViewById(R.id.txtJerman); } public void getTerjemahan(View view) { String bhsindonesia = ""; String bhsjerman=""; String englishword = txtInggris.getText().toString(); kamusCursor = db.rawQuery("SELECT _ID, INGGRIS, INDONESIA, JERMAN " + "FROM kamus where INGGRIS='" + englishword + "' ORDER BY INGGRIS", null); if (kamusCursor.moveToFirst()) {
55 | Android Database SQLITE
ANDROID FAST TRACK
for (; !kamusCursor.isAfterLast(); kamusCursor.moveToNext()) { bhsindonesia = kamusCursor.getString(2); bhsjerman = kamusCursor.getString(3); } }else{ Toast.makeText(getBaseContext(), "Terjemahan Tidak ditemukan", Toast.LENGTH_SHORT).show(); } txtIndonesia.setText(bhsindonesia); txtJerman.setText(bhsjerman); } @Override public void onDestroy() { super.onDestroy(); try { kamusCursor.close(); db.close(); }catch (Exception e){ } }
} 5.
Sekarang mari kita run projectnya
56 |
ANDROID FAST TRACK
AGUS HARYANTO
Pada isian Inggris ketikan run lalu klik button Terjemahkan. Coba isi inggris diisi dengan sepatu lalu klik Terjemahkan Coba inggris tidak diisi lalu klik Terjemahkan 6. Oke kita sudah berhasil membuat kamus, sekarang kita ingin menampilkan kata-kata dalam database kedalam list. 7. Buat Layout baru dengan nama row.xml lalu ketikan kode berikut
ANDROID FAST TRACK
android:layout_height="fill_parent" android:orientation="horizontal" android:paddingBottom="5sp" android:paddingTop="5sp" >
8. Buat Layout baru dengan nama daftarkata.xml lalu ketikan kode berikut
ANDROID FAST TRACK
AGUS HARYANTO
android:id="@+id/textView2" android:layout_width="100sp" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/textView1" android:text="Indonesia" android:textSize="20sp" /> 9. Buat Class baru dengan nama Daftarkata.java lalu ketikkan kode berikut. package net.agusharyanto.kamus; import import import import import import import import import import import
android.app.Activity; android.content.Context; android.database.Cursor; android.database.sqlite.SQLiteDatabase; android.os.Bundle; android.util.Log; android.view.LayoutInflater; android.view.View; android.view.ViewGroup; android.widget.ListView; android.widget.SimpleCursorAdapter;
59 | Android Database SQLITE
ANDROID FAST TRACK
import android.widget.TextView; public class DaftarKata extends Activity { private DatabaseHelper dbhelper; private SQLiteDatabase db = null; private ListView listContent = null; private Cursor kamusCursor = null; CustomCursorAdapter adapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dbhelper = new DatabaseHelper(this); setContentView(R.layout.daftarkata); listContent = (ListView) findViewById(R.id.list1); isDataListView(); } private void isDataListView() { try {
db = dbhelper.getWritableDatabase();
kamusCursor = db.query("kamus", new String[] { "_id", "inggris", "indonesia", "jerman" }, "_id>0", null, null, null, null); // startManagingCursor( jasaCursor); /* * Create an array to specify the fields we want to display in the * list (only the 'inggris,indonesia,jerman' column in this case) */ String[] from = new String[] { "inggris", "indonesia", "jerman" }; /* * and an array of the fields we want to bind those fieiplds to (in
60 |
ANDROID FAST TRACK
AGUS HARYANTO
* this case just the textView 'inggris,indonesia,jerman' from our new row.xml * layout above) */ int[] to = new int[] { R.id.inggris, R.id.indonesia, R.id.jerman }; /* Now create a simple cursor adapter.. */ adapter = new CustomCursorAdapter(this, R.layout.row, kamusCursor, from, to); // listView.setAdapter(adapter); listContent.setAdapter(adapter); } catch (Exception e) { e.printStackTrace(); } finally { if (db != null && db.isOpen()) { db.close(); } } } @Override public void onDestroy() { super.onDestroy(); try { kamusCursor.close(); } catch (Exception e) { } } protected class CustomCursorAdapter extends SimpleCursorAdapter { private int layout; private LayoutInflater inflater; private Context context; public CustomCursorAdapter(Context context,
61 | Android Database SQLITE
ANDROID FAST TRACK
int layout, Cursor c,
String[] from, int[] to) { super(context, layout, c, from, to); this.layout = layout; this.context = context; inflater = LayoutInflater.from(context); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { Log.d("NewView", "*****xxx"); View v = inflater.inflate(R.layout.row, parent, false); }
return v;
@Override public void bindView(View v, Context context, Cursor c) { // 1 is the column where you're getting your data from String inggris = c.getString(1); String jerman = c.getString(3); String indonesia = c.getString(2); /** * Next set the name of the entry. */ TextView name_text = (TextView) v.findViewById(R.id.inggris); TextView des_text = (TextView) v.findViewById(R.id.jerman); TextView id_text = (TextView) v.findViewById(R.id.indonesia); des_text.setText(jerman); id_text.setText(indonesia); if (name_text != null) { name_text.setText(inggris); }
62 |
ANDROID FAST TRACK
}
AGUS HARYANTO
}
} 10. Rubah bagian yang bercetak tebal pada AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="net.agusharyanto.kamus" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
11.
Sekarang mari kita Run projectnya.
63 | Android Database SQLITE
ANDROID FAST TRACK
12. Kita sudah sukses menampilkan daftar kata, selanjutnya kita akan menyedian form untuk menambahkan kata. 13. Buat layout baru dengan nama tambahkata.xml selanjutnya ketikan kode berikut
64 |
ANDROID FAST TRACK
/>
AGUS HARYANTO
<EditText android:id="@+id/txtInggris" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" > <EditText android:id="@+id/txtIndonesia" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" > <EditText android:id="@+id/txtJerman" android:layout_width="fill_parent"
65 | Android Database SQLITE
ANDROID FAST TRACK
android:layout_height="wrap_content" > <Button android:id="@+id/btnTerjemah" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="saveData" android:text="Save Data" > 14. Buat class baru dengan nama TambahKata.java package net.agusharyanto.kamus; import import import import import import import
android.app.Activity; android.content.ContentValues; android.database.sqlite.SQLiteDatabase; android.os.Bundle; android.view.View; android.widget.EditText; android.widget.Toast;
public class TambahKata
extends Activity{
private SQLiteDatabase db = null; private EditText txtInggris; private EditText txtIndonesia; private EditText txtJerman; private DatabaseHelper datakamus = null; public static final String INGGRIS= "inggris"; public static final String INDONESIA = "indonesia"; public static final String JERMAN = "JERMAN"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); datakamus = new DatabaseHelper(this); db = datakamus.getWritableDatabase(); setContentView(R.layout.tambahkata); txtInggris = (EditText) findViewById(R.id.txtInggris); 66 |
ANDROID FAST TRACK
AGUS HARYANTO
txtIndonesia = (EditText) findViewById(R.id.txtIndonesia); txtJerman = (EditText) findViewById(R.id.txtJerman); } public void saveData(View view) { String bhsindonesia = txtIndonesia.getText().toString();; String bhsjerman= txtJerman.getText().toString(); String englishword = txtInggris.getText().toString(); ContentValues cv=new ContentValues(); cv.put(INGGRIS, englishword); cv.put(INDONESIA, bhsindonesia); cv.put(JERMAN, bhsjerman); if (db.insert("kamus", INGGRIS, cv)>0){ Toast.makeText(getBaseContext(), "Save Data Success", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getBaseContext(), "Save Data Fail", Toast.LENGTH_SHORT).show(); } } @Override public void onDestroy() { super.onDestroy(); db.close(); }
}
15. Rubah AndroidManifest.xml yang bercetak tebal <manifest xmlns:android="http://schemas.android.com/apk/res/andr 67 | Android Database SQLITE
ANDROID FAST TRACK
oid"
package="net.agusharyanto.kamus" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
android:name="net.agusharyanto.kamus.TambahKata" android:label="@string/app_name" > 16. Sekarang mari kita run projectnya.
68 |
ANDROID FAST TRACK
AGUS HARYANTO
17. Bagaimana melihat hasilnya ? apa harus rubah AndroidManifest.xml. Cara yang lebih baik adalah dengan membuat menu yang dapat mengakses form Terjemahan, Daftar Kata dan Tambah Kata 18. Buat Class baru dengan nama MenuActivity.java lalu ketikkan kode berikut package net.agusharyanto.kamus; import import import import
android.app.ListActivity; android.content.Intent; android.os.Bundle; android.view.View;
69 | Android Database SQLITE
ANDROID FAST TRACK
import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MenuActivity extends ListActivity { String[] menuutama = new String[] { "Terjemah Kata", "Tambah Kata", "Daftar Kata", "Keluar Aplikasi" }; public void onCreate(Bundle icicle) { super.onCreate(icicle); // Menset nilai array ke dalam list adapater sehingga data pada array // akan dimunculkan dalam list this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menuutama)); } @Override /**method ini akan mengoveride method onListItemClick yang ada pada class List Activity * method ini akan d1ipanggil apabilai ada salah satu item dari list menu yang dipilih */ protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Menangkap nilai text yang dklik Object o = this.getListAdapter().getItem(position); String pilihan = o.toString(); // Menampilkan hasil pilihan menu dalam bentuk Toast tampilkanPilihan(pilihan); } protected void tampilkanPilihan(String pilihan) { try { //Intent digunakan untuk sebagai pengenal suatu activity Intent i = null;
70 |
ANDROID FAST TRACK
AGUS HARYANTO
if (pilihan.equals("Terjemah Kata"))
{
i = new Intent(this,MainActivity.class); } else if (pilihan.equals("Tambah Kata")) { i = new Intent(this, TambahKata.class); } else if (pilihan.equals("Daftar Kata")) { i = new Intent(this, DaftarKata.class); } else if (pilihan.equals("Keluar Aplikasi")) { finish(); } else { Toast.makeText(this,"Anda Memilih: " + pilihan + " , Actionnya belum dibuat", Toast.LENGTH_LONG).show(); } startActivity(i); } catch (Exception e) { e.printStackTrace(); } } } 19. Pada AndroidManifest.xml rubah dan tambahkan yang bercetak tebal <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="net.agusharyanto.kamus" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
ANDROID FAST TRACK
android:label="@string/app_name" android:theme="@style/AppTheme" > 20. Sekarang mari kita run projectnya
72 |
ANDROID FAST TRACK
AGUS HARYANTO
Klik masing-masing menu. 21. Sekarang kita melangkah kebagian Rubah data dan Hapus data. Pasti kita memikirkan bagaiman cara menempatkan Edit dan Hapus ini. Aha kita letakan saja di DaftarKata. Jadi ketika satu baris kata di klik lama (long click) akan memunculkan menu edit dan hapus. 22. Buka file String.xml pada direktori value ketikan kode berikut
<string name="app_name">Kamus <string name="action_settings">Settings <string name="hello_world">Hello world! 73 | Android Database SQLITE
ANDROID FAST TRACK
<string name="ok">OK <string name="save">Simpan <string name="cancel">Cancel <string name="add_title">Edit Kamus <string name="delete_title">Hapus Kamus, And yakin ? 23. Tambahkan layout untuk edit data beri nama edit.xml
<EditText android:id="@+id/inggris" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" > <EditText android:id="@+id/indonesia" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" > 74 |
ANDROID FAST TRACK
AGUS HARYANTO
<EditText android:id="@+id/jerman" android:layout_width="fill_parent" android:layout_height="wrap_content" > 24. Buka kembali file DaftarKata.java lalu ketikan kode berikut package net.agusharyanto.kamus; import import import import import import import import import import import import import import import import import import import
android.app.Activity; android.app.AlertDialog; android.content.ContentValues; android.content.Context; android.content.DialogInterface; android.database.Cursor; android.database.sqlite.SQLiteDatabase; android.os.Bundle; android.view.ContextMenu; android.view.LayoutInflater; android.view.Menu; android.view.MenuItem; android.view.View; android.view.ViewGroup; android.widget.AdapterView; android.widget.EditText; android.widget.ListView; android.widget.SimpleCursorAdapter; android.widget.TextView;
public class DaftarKata extends Activity { private DatabaseHelper dbhelper; private SQLiteDatabase db = null; private ListView listContent = null; 75 | Android Database SQLITE
ANDROID FAST TRACK
1; 2;
private static final int EDIT_ID = Menu.FIRST + private static final int DELETE_ID = Menu.FIRST + private Cursor kamusCursor = null; CustomCursorAdapter adapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dbhelper = new DatabaseHelper(this);
setContentView(R.layout.daftarkata); listContent = (ListView) findViewById(R.id.list1); isDataListView(); registerForContextMenu(listContent); } private void isDataListView() { try {
db = dbhelper.getWritableDatabase();
kamusCursor = db.query("kamus", new String[] { "_id", "inggris", "indonesia", "jerman" }, "_id>0", null, null, null, null); /* * Create an array to specify the fields we want to display in the * list (only the 'inggris,indonesia,jerman' column in this case) */ String[] from = new String[] { "inggris", "indonesia", "jerman" }; /* * and an array of the fields we want to bind those fieiplds to (in * this case just the textView 'inggris,indonesia,jerman' from our * new row.xml layout above) */
76 |
ANDROID FAST TRACK
AGUS HARYANTO
int[] to = new int[] { R.id.inggris, R.id.indonesia, R.id.jerman }; /* Now create a simple cursor adapter.. */ adapter = new CustomCursorAdapter(this, R.layout.row, kamusCursor, from, to); // listView.setAdapter(adapter); listContent.setAdapter(adapter); } catch (Exception e) { e.printStackTrace(); } finally { if (db != null && db.isOpen()) { // db.close(); } } } @Override public void onDestroy() { super.onDestroy(); try { kamusCursor.close(); } catch (Exception e) { } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "`Hapus") .setIcon(R.drawable.ic_launche r).setAlphabeticShortcut('e'); menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "Edit")
77 | Android Database SQLITE
ANDROID FAST TRACK
.setIcon(R.drawable.ic_launche r).setAlphabeticShortcut('d'); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case DELETE_ID: AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); delete(info.id); return (true); case EDIT_ID: AdapterView.AdapterContextMenuInfo infox = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); Cursor ckamusCursor = db.rawQuery( "SELECT _ID, inggris, indonesia, jerman " + "FROM kamus where _ID=" + infox.id, null); ckamusCursor.moveToFirst(); edit(infox.id, ckamusCursor.getString(1), ckamusCursor.getString(2), ckamusCursor.getString(3)); return (true); } return (super.onOptionsItemSelected(item)); } private void edit(long id, String pinggris, String pindonesia, String pjerman) { LayoutInflater inflater = LayoutInflater.from(this);
78 |
ANDROID FAST TRACK
AGUS HARYANTO
View addView = inflater.inflate(R.layout.edit, null); EditText edinggris = (EditText) addView.findViewById(R.id.inggris); EditText edindonesia = (EditText) addView.findViewById(R.id.indonesia); EditText edjerman = (EditText) addView.findViewById(R.id.jerman); edinggris.setText(pinggris); edindonesia.setText(pindonesia); edjerman.setText(pjerman); final DialogWrapper wrapper = new DialogWrapper(addView); final long xid = id; /* * wrapper.inggrisField.setText(pinggris); * wrapper.indonesiaField.setTag(pindonesia) */ new AlertDialog.Builder(this) .setTitle(R.string.add_title) .setView(addView) .setPositiveButton(R.string.sa ve, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { processEdit(wrapper, xid); } }) .setNegativeButton(R.string.ca
ncel,
DialogInterface.OnClickListener() { onClick(DialogInterface dialog,
new public void
int whichButton) { //
ignore, just dismiss }
79 | Android Database SQLITE
ANDROID FAST TRACK
}).show();
}
private void delete(final long rowId) { if (rowId > 0) { new AlertDialog.Builder(this) .setTitle(R.string.delet e_title) .setPositiveButton(R.stri ng.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { processDelete(rowId); } }) .setNegativeButton(R.stri
ng.cancel,
DialogInterface.OnClickListener() { void onClick(DialogInterface dialog,
new public
int whichButton) { /
/ ignore, just dismiss } }).show(); }
}
private void processEdit(DialogWrapper wrapper, long id) { ContentValues values = new ContentValues(2); values.put("inggris", wrapper.getinggris()); values.put("indonesia", wrapper.getindonesia()); values.put("jerman", wrapper.getjerman());
80 |
ANDROID FAST TRACK
AGUS HARYANTO
// db.update(table, values, whereClause, whereArgs) null);
db.update("kamus", values, "_id=" + id, kamusCursor.requery();
} private void processDelete(long rowId) { String[] args = { String.valueOf(rowId) };
}
db.delete("kamus", "_ID=?", args); kamusCursor.requery();
class DialogWrapper { EditText inggrisField = null; EditText indonesiaField = null; EditText jermanField = null; View base = null; DialogWrapper(View base) { this.base = base; indonesiaField = (EditText) base.findViewById(R.id.indonesia); } String getinggris() { return (getinggrisField().getText().toString()); } String getindonesia() { return (getindonesiaField().getText().toString()); } String getjerman() { return (getjermanField().getText().toString()); } private EditText getinggrisField() { if (inggrisField == null) { inggrisField = (EditText)
81 | Android Database SQLITE
ANDROID FAST TRACK
base.findViewById(R.id.inggris); } return (inggrisField); } private EditText getindonesiaField() { if (indonesiaField == null) { indonesiaField = (EditText) base.findViewById(R.id.indonesia); } }
return (indonesiaField);
private EditText getjermanField() { if (jermanField == null) { jermanField = (EditText) base.findViewById(R.id.jerman); } return (jermanField); }
}
protected class CustomCursorAdapter extends SimpleCursorAdapter { private int layout; private LayoutInflater inflater; private Context context; public CustomCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); this.layout = layout; this.context = context; inflater = LayoutInflater.from(context); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) {
82 |
ANDROID FAST TRACK
AGUS HARYANTO
View v = inflater.inflate(R.layout.row, parent, false); return v; } @Override public void bindView(View v, Context context, Cursor c) { // 1 is the column where you're getting your data from String inggris = c.getString(1); String jerman = c.getString(3); String indonesia = c.getString(2); /** * Next set the name of the entry. */ TextView name_text = (TextView) v.findViewById(R.id.inggris); TextView des_text = (TextView) v.findViewById(R.id.jerman); TextView id_text = (TextView) v.findViewById(R.id.indonesia); des_text.setText(jerman); id_text.setText(indonesia); if (name_text != null) { name_text.setText(inggris); } }
}
} 25. Sekarang mari kita run projectnya
83 | Android Database SQLITE
ANDROID FAST TRACK
Lakukan skenario seperti ini. •
Pilih salah satu data lalu tekan yang lama lalu Edit, akan muncul jendela edit.
•
Pilih salah satu data lalu tekan yang lama pada data tersebut akan muncul context menu, pilihlah hapus
Hore, kita telah berhasil membuat aplikasi database sqlite pada android yang didalamanya sudah mencakup fungsi Create Read Update Delete (CRUD).
Tugas 84 |
ANDROID FAST TRACK
AGUS HARYANTO
Buatlah Aplikasi yang ada fungsi CRUD SQLitenya contohnya Aplikasi Menu Makanan. Mempunyai Fitur List Menu makanan yang terdiri dari Nama Makanan dan Harganya, User juga dapat menambah menu baru, update menu dan hapus menu.
85 | Android Database SQLITE
4 ANDROID GOOGLE MAP Tak dapat dipungkiri smartphone saat ini tidak saja dimanfaatkan untuk aplikasi data entry dan hiburan tetapi sekarang sudah dimanfaatkan oleh pengembang untuk mendevelop Aplikasi Location Base Service dimana salah satunya adalah membantu pengguna menemukan lokasi Point of Interest (POS) yang terdekat, misalnya ditengah jalan bensinya mau habis, bisa memanfaatkan aplikasi untuk mencari terminal pengisian bahan bakar terdekat.
M E N A M P I L K A N D A T A GP S Hampir Semua Handphone ber OS android dilengkapi GPS, sebetulnya apasih GPS itu. GPS adalah singkatan dari Global Positionning System, dengan GPS kita dapat mengetahui lokasi kita berada yaitu data koordinat Latitude dan Longitudenya. Bagia yang pernah membuat aplikasi yang menggunakan MAP pasti sudah mengenal istilah ini. GPS hanyalah hardware, untuk memaksimalkannya kita perlu membuat aplikasi yang memanfaatkan GPS. Ada pertanyaan nih, setelah mengetahui fungsi GPS, kira-kira aplikasi apa yang akan kita bangun ?
ANDROID FAST TRACK
Ingat Aplikasi Social networking FourSquare, dimana pada foursquare kita dapat mengetahui posisi teman-teman kita yang sedang online, sehingga apabila ada yang jaraknya dekat dengan kita maka kita bisa copy darat. Sekarang kita masuk kemateri utama, mulai lah belajar dengan pertanyaan •
Bagaimanakah cara mendapatkan Lokasi kita saat ini dengan menggunakan GPS di android ?
•
Bagaimanakah cara menampilkannya dalam bentuk MAP ?
Mari kita buat project untuk menangkap koordinat dari GPS. 1.
Buat New Android Project dengan nama LokasiKu
88 |
ANDROID FAST TRACK
2.
AGUS HARYANTO
Edit layout activity_main.xml lalu ketikan kode berikut
<EditText android:id="@+id/edLatitude" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/textView1"
89 | Android Google Map
ANDROID FAST TRACK
android:layout_toRightOf="@+id/textView1" android:editable="false" android:ems="10" > <EditText android:id="@+id/edLongitude" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/edLatitude" android:layout_alignTop="@+id/textView2" android:editable="false" android:ems="10" />
3. Edit class MainActivity.java lalu ketikan kode berikut package net.agusharyanto.lokasiku; import import import import import import import import import
android.app.Activity; android.content.Context; android.location.Criteria; android.location.Location; android.location.LocationListener; android.location.LocationManager; android.os.Bundle; android.widget.EditText; android.widget.Toast;
public class MainActivity extends Activity implements LocationListener { private EditText latituteField; private EditText longitudeField; 90 |
ANDROID FAST TRACK
AGUS HARYANTO
private LocationManager locationManager; private String provider;
*/
/** Called when the activity is first created.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); latituteField = (EditText) findViewById(R.id.edLatitude); longitudeField = (EditText) findViewById(R.id.edLongitude); // Get the location manager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define the criteria how to select the locatioin provider -> use // default Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); // Initialize the location fields if (location != null) { System.out.println("Provider " + provider + " has been selected."); onLocationChanged(location); } else { latituteField.setText("Lokasi tidak tersedia"); longitudeField.setText("Lokasi tidak tersedia"); } } /* Request updates at startup */ @Override protected void onResume() {
91 | Android Google Map
ANDROID FAST TRACK
super.onResume(); locationManager.requestLocationUpdates(provider, 400, 1, this); } /* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { double lat = (double) (location.getLatitude()); double lng = (double) (location.getLongitude()); latituteField.setText(String.valueOf(lat)); longitudeField.setText(String.valueOf(lng)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Disabled provider " +
92 |
ANDROID FAST TRACK
provider, }
AGUS HARYANTO
Toast.LENGTH_SHORT).show();
}
4. Untuk menambahkan permission pada AndroidManifets.xml Tambahkan yang bercetak tebal <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="net.agusharyanto.lokasiku" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" > <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATIO N" >
93 | Android Google Map
ANDROID FAST TRACK
5.
Mari kita run projectnya
Jika belum ada koordinat maka Latitude dan Longitude akan berisi Lokasi tidak tersedia. Untuk itu kita bisa menset koordinatnya melalui emulator kontrol. Untuk membuka emulator kontrol pada eclipse menu klik Window → Show View → Other lalu klik folder Android lalu pilih Emulator Cotrol.
Isikan Latiude dan Longitude seperti diatas lalu klik Send, maka sekarang nilai Latitude dan Longitude pada emulator sudah terisi.
94 |
ANDROID FAST TRACK
AGUS HARYANTO
Selain melalui emulator control, untuk menset GPS kita juga bisa lakukan lewat telnet localhost 5554 lalu ketikan command geo fix -6.23326 106.85324
MENAMPILKAN MAP
PA D A
ANDROID
Apakah informasi koordinat gps berupa nilai latitude dan longitude itu cukup bagi user untuk menunjukkan lokasinya. Tentu banyak user yang bingung, untuk itu kita ditantang bagaimana cara menginformasikan lokasi ke User. Beruntung android sudah menyiapkan Library Peta GoogleMap sehingga kita bisa memanfaatkannya untuk menampilkan Lokasi tersebut dipeta.
95 | Android Google Map
ANDROID FAST TRACK
Pertama kita harus menginstall Google Play Service. Pada Eclipse klik menu Window lalu klik Android SDK Manager
Centang Google Play Services dari jendela Android SDK Manager klik folder Extra lalu centang Google Play Services Khusus untuk Map AVD yang dipakai harus yang Ada Goggle APIs, untuk itu dari jendela Android SDK Manager centang juga Google APIs (ARM System Image).
Setelah instalasi selesai. Buatlah AVD yang menggunakan Google APIs
96 |
ANDROID FAST TRACK
97 | Android Google Map
AGUS HARYANTO
ANDROID FAST TRACK
Sekarang mari kita mulai kodingnya. 1.
Buat New Android Project beri nama PetaLokasi.
Catat nama packagenya “net.agusharyanto.petalokasi” karena ini akan digunakan untuk membuat API KEY Google Map V2.
98 |
ANDROID FAST TRACK
AGUS HARYANTO
2. Langkah selanjutnya adalah menyediakan API KEY Googlemap. Karena saat ini Key untuk GoogleMap API v1 sudah tidak bisa lagi digunakan maka kita harus menggunakan Key GoogleMap API v2. 3. Cari lokasi file debug.keystore biasanya terdapat pada direktori “c:\Users\<user>\.android\debug.keystore” contoh “c:\Users\agus\.android\debug.keystore” 4. Masuk kedirektori bin pada java jdk contoh “C:\Program Files\Java\jdk1.7.0_10\bin” 5. Jalankan command untuk mendapatkan key debug .keystore
sha1 dari
Syntak Commandnya adalah keytool -list -v -alias androiddebugkey -keystore <path_to_debug_keystore>debug.keystore -storepass android -keypass android contoh eksekusinya keytool -list -v -alias androiddebugkey -keystore C:\Users\HP\.android\debug.keystore -storepass android -keypass android
Catat nilai SHA1: 22:C8:72:0A:9A:88:9E:63:72:A9:23:0E:FE:70:36:3B:CE:3E:11:42
99 | Android Google Map
ANDROID FAST TRACK
Registerkan Key diatasi melalui Google Api Console (https://code.google.com/apis/console/?pli=1 ) . Untuk masuk kesini kita harus punya Account GMAIL
Klik Create project... akan muncul jendela New Project, Isi Project Name dengan Android Map Project
100 |
ANDROID FAST TRACK
AGUS HARYANTO
Setelah tombol create diklik tungg sebentar maka akan muncul project dashboard
101 | Android Google Map
ANDROID FAST TRACK
Klik Enable an API lalu Aktifkan Google Maps Android API V2
Sekarang Saatnya membuat Key untuk aplikasinya. Klik Google Maps Android V2 lalau klik Quota
102 |
ANDROID FAST TRACK
103 | Android Google Map
AGUS HARYANTO
ANDROID FAST TRACK
isikan dengan 22:C8:72:0A:9A:88:9E:63:72:A9:23:0E:FE:70:36:3B:CE:3E:11:42;ne t.agusharyanto.petalokasi Klik Create
Catat API Keynya, ini akan digunakan dalam aplikasi. AIzaSyBeF0umtjOV4xQe8MJe1oZsEYfm3p3GzPc
104 |
ANDROID FAST TRACK
AGUS HARYANTO
2. Selanjutnya kita harus menginclude Google Play Services sebagai library projectnya. Hal yang harus dilakukan terlibuh dahulu adalah mengimport Project Google Play Service Library ke workspace saat ini. Klik Import Android Project, set Root Directory ke direktori kita menginstall Google Play Service, misalnya saja “C:\adt-bundle-windows-x8620131030\sdk\extras\google\google_play_services\libproject\googl e-play-services_lib”
Centang Copy projects into workspace
105 | Android Google Map
ANDROID FAST TRACK
Selanjutnya adalah menyertakan library ini dalam project kita. Caranya klik kanan pada project PetaLokasi lalu pilih properties
3. Kita harus mendaftarkan Key yang kita dapat pada AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.agusharyanto.petalokasi" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" 106 |
ANDROID FAST TRACK
AGUS HARYANTO
android:targetSdkVersion="19" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
107 | Android Google Map
ANDROID FAST TRACK
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyBeF0umtjOV4xQe8MJe1oZsEYfm3p3GzPc" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
4. Edit file activity_main.xml lalu ketikkan kode berikut
5.
Edit clas MainActivity.java lalu ketikan kode berikut
package net.agusharyanto.petalokasi; import android.app.Activity; import android.os.Bundle; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; 108 |
ANDROID FAST TRACK
AGUS HARYANTO
import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends Activity { static final LatLng RAGUNAN = new LatLng(-6.3039, 106.8267); static final LatLng TAMANMINI = new LatLng(6.29436, 106.8859); private GoogleMap map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker ragunan = map.addMarker(new MarkerOptions().position(RAGUNAN) .title("Ragunan")); Marker tamanmini = map.addMarker(new MarkerOptions() .position(TAMANMINI) .title("Taman Mini") .snippet("Taman Mini itu Indah") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(RAGUNAN, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); }
109 | Android Google Map
ANDROID FAST TRACK
}
6. Agar kita dapat menjalankan project Gooogle Map API 2 ini di emulator kita perlu install 2 apk yaitu venton.apk dam gms.apk melalui adb command. Sebelum pastikan emulator (Bukan Google API) sudah dijalankan.
7.
Mari kita jalankan projectnya.
110 |
ANDROID FAST TRACK
AGUS HARYANTO
Pertama akan muncul 2 marker, lalu tap lah masing-masing marker akan memunculkan info window.
MENAMPILKAN DIRECTION
PA D A
MAP
Tentunya akan lebih menarik apabila kita dapat menampilkan jalur yang harus ditempuh dari sebuah lokasi ke lokasi lainnya. Kita ingin apabila infowindow diklik maka akan muncul petunjuk jalur (driving direction) diantara kedua titik tersebut. Berikut langkah-langkahnya 8. Masih dalam project yang sama buat class baru dengan nama GmapV2Direction.java lalu ketikan kode berikut package net.agusharyanto.petalokasi;
111 | Android Google Map
ANDROID FAST TRACK
import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import import import import import import import import import
org.apache.http.HttpResponse; org.apache.http.client.HttpClient; org.apache.http.client.methods.HttpPost; org.apache.http.impl.client.DefaultHttpClient; org.apache.http.protocol.BasicHttpContext; org.apache.http.protocol.HttpContext; org.w3c.dom.Document; org.w3c.dom.Node; org.w3c.dom.NodeList;
import android.util.Log; import com.google.android.gms.maps.model.LatLng; public class GMapV2Direction { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; public GMapV2Direction() { } public Document getDocument(LatLng start, LatLng end, String mode) { String url = "http://maps.googleapis.com/maps/api/directions/xml?" + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=false&units=metric&mode=driving"; try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url);
112 |
ANDROID FAST TRACK
AGUS HARYANTO
HttpResponse response = httpClient.execute(httpPost, localContext); InputStream in = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder (); Document doc = builder.parse(in); return doc; } catch (Exception e) { e.printStackTrace(); } return null; } public String getDurationText (Document doc) { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); Log.i("DurationText", node2.getTextContent()); return node2.getTextContent(); } public int getDurationValue (Document doc) { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DurationValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } public String getDistanceText (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text"));
113 | Android Google Map
ANDROID FAST TRACK
Log.i("DistanceText", node2.getTextContent()); return node2.getTextContent(); } public int getDistanceValue (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } public String getStartAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("start_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getEndAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("end_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getCopyRights (Document doc) { NodeList nl1 = doc.getElementsByTagName("copyrights"); Node node1 = nl1.item(0); Log.i("CopyRights", node1.getTextContent()); return node1.getTextContent(); } public ArrayList
getDirection (Document
doc) {
NodeList nl1, nl2, nl3; ArrayList listGeopoints = new ArrayList();
114 |
ANDROID FAST TRACK
AGUS HARYANTO
nl1 = doc.getElementsByTagName("step"); if (nl1.getLength() > 0) { for (int i = 0; i < nl1.getLength(); i++) { Node node1 = nl1.item(i); nl2 = node1.getChildNodes(); Node locationNode = nl2.item(getNodeIndex(nl2, "start_location")); nl3 = locationNode.getChildNodes(); Node latNode = nl3.item(getNodeIndex(nl3, "lat")); double lat = Double.parseDouble(latNode.getTextContent()); Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); double lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); locationNode = nl2.item(getNodeIndex(nl2, "polyline")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "points")); ArrayList arr = decodePoly(latNode.getTextContent()); for(int j = 0 ; j < arr.size() ; j++) { listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude)); } locationNode = nl2.item(getNodeIndex(nl2, "end_location")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "lat")); lat = Double.parseDouble(latNode.getTextContent()); lngNode = nl3.item(getNodeIndex(nl3, "lng")); lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng));
115 | Android Google Map
ANDROID FAST TRACK
}
}
return listGeopoints; } private int getNodeIndex(NodeList nl, String nodename) { for(int i = 0 ; i < nl.getLength() ; i++) { if(nl.item(i).getNodeName().equals(nodename)) return i; } return -1; } private ArrayList decodePoly(String encoded) { ArrayList poly = new ArrayList(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.charAt(index++) 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = encoded.charAt(index++) 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng;
116 |
ANDROID FAST TRACK
AGUS HARYANTO
LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5); poly.add(position); } return poly; } }
9. Buat Class baru dengan nama DirectionActivity.java ketikkan kode berikut package net.agusharyanto.petalokasi;
lalu
import java.util.ArrayList; import org.w3c.dom.Document; import import import import import import import import
android.app.Activity; android.content.Context; android.graphics.Color; android.location.Location; android.location.LocationListener; android.location.LocationManager; android.os.AsyncTask; android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListe ner; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions; public class DirectionActivity extends Activity { static final LatLng TAMANMINI = new LatLng(-6.29436, 106.8859); 117 | Android Google Map
ANDROID FAST TRACK
private GoogleMap map; private GMapV2Direction md; private LocationManager locManager; private LocationListener locListener; Marker ragunan = null; LatLng fromPosition = new LatLng(-6.3039, 106.8267); LatLng toPosition = TAMANMINI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); md = new GMapV2Direction(); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker tamanmini = map.addMarker(new MarkerOptions() .position(TAMANMINI).title("Taman Mini") .snippet("Taman Mini Indonesia Indah")); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(TAMANMINI, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(11), 2000, null); map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { public void onInfoWindowClick(Marker marker) { String stitle = marker.getTitle(); if (!stitle.equals("Current Location")) { 118 |
ANDROID FAST TRACK
AGUS HARYANTO
callDirectionTask(); } } }); initLocationManager(); } private void callDirectionTask() { String arg[] = { "dummy" }; new LongOperation().execute(arg); } private class LongOperation extends AsyncTask<String, Void, Document> { @Override protected Document doInBackground(String... params) { Document doc = md.getDocument(fromPosition, toPosition, GMapV2Direction.MODE_DRIVING); return doc; } @Override protected void onPostExecute(Document result) { // this.dialog.cancel(); setResult(result); } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { } 119 | Android Google Map
ANDROID FAST TRACK
} public void setResult(Document doc) { ArrayList directionPoint = md.getDirection(doc); PolylineOptions rectLine = new PolylineOptions().width(3).color( Color.RED); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } map.addPolyline(rectLine); }
/** * Initialize the location manager. */ private void initLocationManager() { locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locListener = new LocationListener() { // method ini akan dijalankan apabila koordinat GPS berubah public void onLocationChanged(Location newLocation) { tampilkanPosisikeMap(newLocation); } public void onProviderDisabled(String arg0) { } public void onProviderEnabled(String arg0) { }
120 |
ANDROID FAST TRACK
AGUS HARYANTO
public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } }; locManager.requestLocationUpdates(LocationManager.GPS_PROVI DER, 5, 100, locListener); Location location = locManager .getLastKnownLocation(LocationMan ager.GPS_PROVIDER); tampilkanPosisikeMap(location); } /** * This method will be called when current position changed is submitted via * the GPS. * * @param newLocation */ protected void tampilkanPosisikeMap(Location newLocation) { LatLng currlok = new LatLng(newLocation.getLatitude(), newLocation.getLongitude()); fromPosition = currlok; if (ragunan != null)ragunan.remove(); ragunan = map.addMarker(new MarkerOptions().position(currlok).title( "Current Location").icon(BitmapDescriptorFactory .fromResource(R.draw able.ic_launcher))); map.moveCamera(CameraUpdateFactory.newLatLngZoom(currlok, 11)); // first remove old overlay } } 121 | Android Google Map
ANDROID FAST TRACK
10. Sebelum kita jalankan projectnya. Terlbih dahulu kita harus merubah AndroidMainfest.xml agar yang diryun adalah DirectionActivity maka ganti tulisan MainActivity dengan DirectionActivity.
11.
Sekarang mari kita jalankan projectnya.
Terlihat Posisi Terakhir dipeta, kecilkan peta agar marker taman mini terlihat, klik marker taman mini lalu klik infowindownya akan muncul direction dari posisi kita ke taman mini
122 |
ANDROID FAST TRACK
AGUS HARYANTO
Tugas Buatlah Aplikasi yang menampilkan lokasi-lokasi disekitar kita yang datanya diambil dari Database SQLite
123 | Android Google Map
5 A N D R O I D PH P M Y SQL Kali ini kita akan membahas Bagaimana Android dapat mengirim data ke server dan membacanya. Ada beberapa pendekatan untuk komunikasi dengan server ini tetapi yang sering dipakai adalah melalui http. Dengan demikian untuk mempraktekannya kita harus menginstall apache web server lengakap dengan PHP dan MySQLnya.
CRUD ANDROID PHP MYSQL Aplikasi yang menggunakan database pada umumnya memiliki fungsi untuk –
Menampilkan data
–
Menambah data
–
Menghapus data
–
Merubah data
Database SQLite pada android mempunyai keterbatasan pada salah satunya pada kapasitas penyimpanan data. Akan bermasalah apabila kita memaksakan menyimpan data yang besar (lebih dari 10000 data) pada SQLite. Selain itu jika kita ingin perubahan data aplikasi dirasakan oleh semua user tanpa harus install ulang aplikasi, maka data harus disimpan di Server. Cara yang paling sering digunakan adalah dengan perantara Webserver, PHP dan MySQL. Dimana an-
ANDROID FAST TRACK
droid untuk melakukan perubahan data atau mendapatkan data dari database server cukup dengan memanggil url php yang telah ditentukan. Agar lebih dimengerti mari kita buat aplikasi tentang maintenance data harga handphone yang database servernya menggunakan MySQL dengan Web Server Apache dan Server Side Scriptnya menggunakan PHP untuk itu hal yang penting untuk dilakukan sebelum memulai pembuatan aplikasinya adalah menyiaplkan environment servernya dengan menginstall XAMPP (Windows) atau LAMP (Linux). Setelah selesai Instalasi lalu kita lakukan langkah berikut. 1.
Pekerjaan di MySql, buat database dan tablenya.
CREATE DATABASE db_phone; CREATE TABLE tbl_phone ( id INT(4) NOT NULL AUTO_INCREMENT, phone_name VARCHAR(32) NOT NULL, price INT(10) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; insert into tbl_phone values(null,'Galaxy S3',6000000); insert into tbl_phone values(null,'Galaxy Ace 2',3000000); insert into tbl_phone values( null,'HTC One',6000000); 2. Siapkan Script PHP untuk memasukkan data baru ke tbl_phone, simpan dengan nama add_phone.php simpan didirectory document_root/phone contoh htdoc/phone jadi urlnya adalah “http://yourdomain/phone/add_phone.php”
126 |
ANDROID FAST TRACK
AGUS HARYANTO
$query = "insert into tbl_phone (phone_name,price) values('". $phone_name."',".$price.")"; $result = mysql_query($query, $link) or die('Error query: '.$query); if ($result == 1){echo "Save Data Success";}else{ echo "Save Data Fail";} ?> 3. Siapkan Script untuk menampilkan data yang sudah disimpan, simpan dengan nama list_phone.php 0){ $result["errorcode"] = "1"; $result["data"] = $items; }else{ } $result["errormsg"] = "Tidak ada data"; echo json_encode($result); ?> 4. Siapkan Script untuk Melakkukan perubahan data phone diserver, simpan dengan nama edit_phone.php
ANDROID FAST TRACK
mysql_select_db('db_phone', $link) or die('Cannot select the DB'); /* grab the posts from the db */ $query = "update tbl_phone set phone_name='$phone_name',price=$price where id=$id"; $result = mysql_query($query, $link) or die('Error query: '.$query); if ($result == 1){echo "Save Data Success";}else{ echo "Save Data Fail";} ?> 5. Siakan Scritpt untuk menghapus data phone di server, simpan dengan nama delete_phone.php 6. Sekarang mari kita siapkan bagian androidnya, buat new android project MySQLPhone
128 |
ANDROID FAST TRACK
AGUS HARYANTO
7. Buat Class HttpHelper lalu ketikkan kode berikut package net.agusharyanto.mysqlphone; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; 129 | Android PHP MySQL
ANDROID FAST TRACK
import import import import
org.apache.http.HttpResponse; org.apache.http.client.HttpClient; org.apache.http.client.methods.HttpGet; org.apache.http.impl.client.DefaultHttpClient;
import android.util.Log; public class HttpHelper { /**
* Method untuk Mengirimkan data kes erver event by button login diklik * * @param view */ public static String getRequest(String Url) { String sret=""; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(Url); try { HttpResponse response = client.execute(request); sret= request(response); } catch (Exception ex) { } return sret; } /** * Method untuk Menenrima data dari server * * @param response * @return */ public static String request(HttpResponse response) { String result = ""; try {
InputStream in = response.getEntity().getContent();
130 |
ANDROID FAST TRACK
BufferedReader(
AGUS HARYANTO
BufferedReader reader = new
new InputStreamReader(in)); StringBuilder str = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { str.append(line + "\n"); } in.close(); result = str.toString(); } catch (Exception ex) { result = "Error"; } return result; } } Class HttpHelper ini digunakan untuk mengirim data keserver dan menangkap nilai yang dikembalikan server. 8. Buat class JSONFunction lalu ketikkan kode berikut package net.agusharyanto.mysqlphone; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import import import import import import import import import import
org.apache.http.HttpEntity; org.apache.http.HttpResponse; org.apache.http.client.HttpClient; org.apache.http.client.methods.HttpPost; org.apache.http.impl.client.DefaultHttpClient; org.apache.http.params.BasicHttpParams; org.apache.http.params.HttpConnectionParams; org.apache.http.params.HttpParams; org.json.JSONException; org.json.JSONObject;
import android.util.Log;
131 | Android PHP MySQL
ANDROID FAST TRACK
public class JSONfunctions { public static JSONObject getJSONfromURL(String
url) {
InputStream is = null; String result = "0"; JSONObject jArray = null; try { HttpParams httpParameters = new
BasicHttpParams();
int timeoutConnection = 60000; HttpConnectionParams.setConnectionTimeout(httpParameter s, timeoutConnection); int timeoutSocket = 60000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error intimeout http connection " + e.toString()); } // convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new
132 |
ANDROID FAST TRACK
StringBuilder();
AGUS HARYANTO
null) {
String line = null; while ((line = reader.readLine()) !=
sb.append(line + "\n"); } is.close(); result = sb.toString(); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); result = "{\"errorcode\":\"0\"}"; } try { jArray = new JSONObject(result); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); result = "{\"errorcode\":\"0\"}"; try { jArray = new JSONObject(result); } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return jArray; } public static String getStringJSONfromURL(String
url) {
InputStream is = null; String result = "0"; // http post try { HttpParams httpParameters = new
BasicHttpParams();
int timeoutConnection = 60000;
133 | Android PHP MySQL
ANDROID FAST TRACK
HttpConnectionParams.setConnectionTimeout(httpParameter s, timeoutConnection); int timeoutSocket = 60000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); HttpPost(url);
HttpPost httppost = new
HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error intimeout http connection " + e.toString()); } // convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result = sb.toString(); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); result = "{\"errorcode\":\"0\"}"; }
134 |
ANDROID FAST TRACK
AGUS HARYANTO
return result; }
}
Class JSONFunction ini digunakan untuk menangkap nilai kembalian dari server yang datanya berupa JSON 9. Buat Layoutbaru dengan nama add.xml lalu ketikan kode berikut <EditText android:text="" android:id="@+id/edtName" android:layout_width="fill_parent" android:layout_height="wrap_content"> <EditText android:text="" android:id="@+id/edtPrice" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:text="Simpan" android:id="@+id/btnSave" android:layout_width="fill_parent" android:layout_height="wrap_content">
10. Buat Layout dengan nama listphone.xml
ANDROID FAST TRACK
xmlns:android="http://schemas.android.com/apk/res/andr oid" android:layout_width="match_parent" android:layout_height="match_parent" >
/>
11. Buat layout dengan nama row.xml
136 |
ANDROID FAST TRACK
AGUS HARYANTO
12. Semua Layout sudah siap, saatnya membuat bagian javanya. Pada awal yang ditampilkan adalah list smartphone dan harganya, buat class baru dengan nama ListDataPhoneActivity.java package net.agusharyanto.mysqlphone; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException;
137 | Android PHP MySQL
ANDROID FAST TRACK
import org.json.JSONObject; import import import import import import import import import import import import import import import import
android.app.Activity; android.app.ProgressDialog; android.content.Context; android.content.Intent; android.os.AsyncTask; android.os.Bundle; android.util.Log; android.view.ContextMenu; android.view.Menu; android.view.MenuItem; android.view.View; android.widget.AdapterView; android.widget.ListAdapter; android.widget.ListView; android.widget.SimpleAdapter; android.widget.Toast;
public class ListDataPhoneActivity extends Activity { /** Called when the activity is first created. */ private ListView listView1; private static final int REQUEST_CODE = 1; private ArrayList> mylist = new ArrayList>(); private static final int ADD_ID = Menu.FIRST + 1; private static final int EDIT_ID = Menu.FIRST + 2; private static final int DELETE_ID = Menu.FIRST + 3; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listphone); try { getDataPhone(); } catch (Exception e) { Log.e("log_tag", "Error parsing data " + e.toString()); }
138 |
ANDROID FAST TRACK
AGUS HARYANTO
} /** * Class CallWebPageTask untuk implementasi class AscyncTask */ private class requestTask extends AsyncTask<String, Void, String> { private ProgressDialog dialog; protected Context applicationContext; private String actionflag; @Override protected void onPreExecute() { this.dialog = ProgressDialog.show(applicationContext, "Load Data From Server Process", "Please Wait...", true); }
urls) {
@Override protected String doInBackground(String...
}
{
String response = ""; response = getDataServer(urls[0]); return response;
@Override protected void onPostExecute(String result)
this.dialog.cancel(); if (actionflag.equals("list")) { if (result.equals("1")) setListData(); } else if (actionflag.equals("delete")) { getDataPhone(); } } } public void getDataPhone() { mylist.clear();
139 | Android PHP MySQL
ANDROID FAST TRACK
requestTask task = new requestTask(); task.applicationContext = ListDataPhoneActivity.this; task.actionflag = "list"; String url = "http://192.168.235.1/phone/list_phone.php"; task.execute(new String[] { url }); } public String getDataServer(String url) { String sret = "1"; JSONObject json = JSONfunctions.getJSONfromURL(url); try { if (json.getString("errorcode").equals("0")) { Toast.makeText(getBaseContext(), json.getString("errormsg"), Toast.LENGTH_SHORT).show(); sret = "0"; } JSONArray makanan = json.getJSONArray("data"); for (int i = 0; i < makanan.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>(); JSONObject jsonobj = makanan.getJSONObject(i); map.put("id", jsonobj.getString("id")); ; map.put("phone_name", jsonobj.getString("phone_name")); map.put("price", jsonobj.getString("price"));
140 |
ANDROID FAST TRACK
AGUS HARYANTO
mylist.add(map); } } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return sret; } private void showToast(String msg, int flag) { Toast.makeText(getBaseContext(), "Result " + msg, Toast.LENGTH_LONG) .show(); } private void setListData() { listView1 = (ListView) findViewById(R.id.list1); ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.row, new String[] { "phone_name", "price" }, new int[] { R.id.phonename, R.id.price }); listView1.setAdapter(adapter); registerForContextMenu(listView1); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.add(Menu.NONE, ADD_ID, Menu.NONE, "Add") .setIcon(R.drawable.ic_launche r).setAlphabeticShortcut('a'); menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "Edit") .setIcon(R.drawable.ic_launche
141 | Android PHP MySQL
ANDROID FAST TRACK
r).setAlphabeticShortcut('d'); menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "Delete") .setIcon(R.drawable.ic_launche r).setAlphabeticShortcut('e'); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); int idphone = (int) info.id; HashMap<String, String> o = (HashMap<String, String>) listView1 .getItemAtPosition(idphone); switch (item.getItemId()) { case ADD_ID: addData(o, "add"); return (true); case DELETE_ID: deleteData(o); return (true); case EDIT_ID: editData(o, "edit"); return (true); } }
return (super.onOptionsItemSelected(item));
private void editData(HashMap<String, String> o, String action) { Log.d("****editData*****", "ïd:" + o.get("id")); callIntent(o, action);
142 |
ANDROID FAST TRACK
AGUS HARYANTO
} o) {
private void deleteData(HashMap<String, String>
requestTask task = new requestTask(); task.applicationContext = ListDataPhoneActivity.this; task.actionflag = "delete"; String url = "http://192.168.235.1/phone/delete_phone.php?id=" + o.get("id"); task.execute(new String[] { url }); } private void addData(HashMap<String, String> o, String action) { callIntent(o, action); } private void callIntent(HashMap<String, String> o, String action) { Intent i = new Intent(this, AddPhoneActivity.class);
}
i.putExtra("action", action); i.putExtra("dataphone", o); startActivityForResult(i, REQUEST_CODE);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { if (data.hasExtra("refreshflag")) { if (data.getExtras().getString("refreshflag").equals("1")) getDataPhone(); } }
}
}
143 | Android PHP MySQL
ANDROID FAST TRACK
13. Tentunya Aplikasikita tidak hanya menampilkan data saja tetapi dapat juga menambahkan data dan mengedit data, buat class baru dengan nama AddPhoneActivity.java package net.agusharyanto.mysqlphone; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import import import import import import import import import
android.app.Activity; android.content.Intent; android.os.AsyncTask; android.os.Bundle; android.util.Log; android.view.View; android.widget.Button; android.widget.EditText; android.widget.Toast;
public class AddPhoneActivity extends private EditText edtName; private EditText edtPrice;
Activity {
private Button btnSave; // Seusuaikan url dengan nama domain yang anda gunakan private String url = ""; String action=""; String phoneid=""; /** * Method yang dipanggil pada saat aplikaasi dijalankan * */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add); edtName = (EditText) findViewById(R.id.edtName); edtPrice = (EditText) findViewById(R.id.edtPrice); 144 |
ANDROID FAST TRACK
AGUS HARYANTO
btnSave = (Button) findViewById(R.id.btnSave); Bundle extras = getIntent().getExtras(); if (extras == null) { return; } action = extras.getString("action"); HashMap <String,String> dataphone= (HashMap<String, String>) extras.get("dataphone"); if (action.equals("edit")){ edtName.setText(dataphone.get("phone_name")); edtPrice.setText(dataphone.get("price")); phoneid=dataphone.get("id"); } // daftarkan even onClick pada btnSave btnSave.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { try { if (action.equals("add"))
{
url="http://192.168.235.1/phone/add_phone.php"; }else{ url="http://192.168.235.1/phone/edit_phone.php"; } String phone_name = URLEncoder.encode(edtName.getText() .toString(), "utf-8"); String price = URLEncoder.encode(edtPrice.getText() .toString(), "utf-8"); url += "?phone_name=" + phone_name + "&price=" + price; if (action.equals("edit")){
145 | Android PHP MySQL
ANDROID FAST TRACK
url+="&id="+phoneid;
}
Log.d("url**","url:"+url); new RequestTask().execute(url); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } });
} @Override public void finish() { Intent data = new Intent(); data.putExtra("refreshflag", "1"); setResult(RESULT_OK, data); super.finish(); } private void setResult(String result){ Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show(); finish(); } class RequestTask extends AsyncTask<String, String, String>{ @Override protected String doInBackground(String... uri) { String responseString = null; responseString= HttpHelper.getRequest(uri[0]);
146 |
ANDROID FAST TRACK
}
AGUS HARYANTO
return responseString;
@Override protected void onPostExecute(String result) { super.onPostExecute(result); setResult(result); //Do anything with response.. } } }
14. Edit AndroidManifest.xml lalu ketikan kode berikut <manifest xmlns:android="http://schemas.android.com/apk/res/andr oid" package="net.agusharyanto.mysqlphone" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" />
147 | Android PHP MySQL
ANDROID FAST TRACK
15. Sekarang mari kita jalankan programnya.
Tekan yang lama pada salah satu baris
148 |
ANDROID FAST TRACK
AGUS HARYANTO
Akan muncul konteks menu, jika ingin menambah data sentuh ADD, untuk merubah data sentuh Edit, untuk menghapus data sentih Delete.
149 | Android PHP MySQL
ANDROID FAST TRACK
Tugas Buatlah Aplikasi User Management yang inputannya terdiri dari username, password, nama_lengkap.
150 |
5 PENUTUP
S E M A N G AT Setelah memnyelesaikan materi yang ada dibuku ini, berarti kita sudah punya modal dasar untuk membuat aplikasi android sendiri. Disini kita sudah mempelajari tentang –
Dasar pembuatan project android
–
Dasar Layout dan viewnya
–
Aplikasi Android CRUD SQLite (Kamus)
– aLokasi) –
Aplikasi Peta dengan Android Googlemaps API V2 (PetAplikasi CRUD PHP MySQL (Smartphone Price)
Ilmu itu harus sering dilatih agar semakin mantap penguasaanya dan kita semkin produktif. Tanpa sering latihan janganlah kita bermimpi jadi programmer hebat dan produktif. Jadi harus semangat.
SEMINAR WORKSHOP ANDROID Untuk kampus atau sekolah yang berminat mengadakan seminar atau workshop android atau lainnya bisa hubungi saya di email [email protected] ,twitter @agus_inovator atau di 08551000444 / 089673371119. Khusus untuk luar kota biaya transportasi dan akomodasi ditanggung penyelenggara acara.
ANDROID FAST TRACK
REFERENSI Untuk buku Android Fast Track ini, saya menggunakan referensi dari –
http://developerandroid.com
–
http://stackoverflow.com
–
http://vogella.com
–
http://mobile.tutplus.com
–
Beginning Android 4 Application Development – Wei Meng Lee
152 |