SlideShare a Scribd company logo
1 of 109
versi Mei 2013 1
Pengantar Mobile Programming dengan Android
Yudi Wibisono (yudi@upi.edu)
Ilmu Komputer, Universitas Pendidikan Indonesia (http://cs.upi.edu)
versi (BETA): 22 Mei 2013
Periksa versi terakhir di: http://yuliadi.com/ilkom
http://creativecommons.org/licenses/by-nc-sa/3.0/
Modul ini bebas dicopy, didistribusikan, ditransmit dan diadaptasi/dimodifikasi/diremix dengan syarat:
tidak untuk komersial, pembuat asal tetap dicantumkan dan hasil modifikasi dishare dengan lisensi yang
sama.
Pengantar Modul................................................................................................................. 3
Sekilas Android................................................................................................................... 3
Fitur-fitur............................................................................................................................. 3
Perbedaan dengan Aplikasi Desktop .................................................................................. 4
Instalasi SDK (Windows) .................................................................................................. 4
Aplikasi Pertama: Hello World........................................................................................... 7
Aplikasi Kedua: Hello XXX............................................................................................. 10
Widget............................................................................................................................... 15
Text View...................................................................................................................... 16
Button............................................................................................................................ 16
ImageButton dan ImageView ....................................................................................... 17
EditText......................................................................................................................... 19
CheckBox...................................................................................................................... 19
RadioButton.................................................................................................................. 22
ListView........................................................................................................................ 23
Composite ListView ................................................................................................. 25
Penanganan Click pada ListView ............................................................................. 30
Dialog................................................................................................................................ 31
Toast.............................................................................................................................. 31
AlertDialog ................................................................................................................... 31
Logging............................................................................................................................. 32
Activity dan Intent ............................................................................................................ 34
Pertukaran Data antar Activity...................................................................................... 37
Mengirimkan data ke activity ................................................................................... 37
Menerima data dari actvity yang dipanggil .............................................................. 38
Activity Life Cycle ....................................................................................................... 40
versi Mei 2013 2
Simpan dan Load Activity State ............................................................................... 42
Layout Manager................................................................................................................ 45
RelativeLayout.............................................................................................................. 45
TableLayout .................................................................................................................. 47
Frame Layout................................................................................................................ 50
LinearLayout................................................................................................................. 51
ScrollView .................................................................................................................... 52
Kombinasi Layout......................................................................................................... 54
ActionBar.......................................................................................................................... 55
ActionItem .................................................................................................................... 56
String Resources ........................................................................................................... 57
Icon ............................................................................................................................... 58
Menyimpan Data............................................................................................................... 60
Shared Preferences........................................................................................................ 60
SQLite........................................................................................................................... 62
Group By, Having, Order By.................................................................................... 65
RawQuery ................................................................................................................. 65
Loop Semua Record.................................................................................................. 66
Mengisi ListView dengan Record ............................................................................ 66
File .................................................................................................................................... 73
Stream ....................................................................................................................... 73
Persiapan................................................................................................................... 74
File Teks.................................................................................................................... 75
Objek Stream ............................................................................................................ 76
Grafik 2D .......................................................................................................................... 79
Menggambar di Canvas ................................................................................................ 79
Menulis Teks di Canvas................................................................................................ 82
Event Touch.................................................................................................................. 84
Load Image di Canvas .................................................................................................. 86
Animasi di Canvas........................................................................................................ 87
Sensor................................................................................................................................ 90
Accelerometer............................................................................................................... 90
Orientasi: Yaw (Azimuth), Pitch & Roll ...................................................................... 94
Location API................................................................................................................. 97
Koneksi dengan Server ................................................................................................... 102
Google Map .................................................................................................................... 104
Zoom........................................................................................................................... 106
Ubah Posisi ................................................................................................................. 106
Menambahkan Layer .................................................................................................. 107
TAMBAHAN DAN PERBAIKAN MODUL BERIKUTNYA: .................................... 109
versi Mei 2013 3
Pengantar Modul
Modul praktikum ini dibuat untuk mendukung praktikum matakuliah Mobile
Programming di Program Studi Ilmu Komputer Universitas Pendidikan Indonesia (UPI).
Diasumsikan pengguna modul ini telah mengenal dasar-dasar bahasa Java dan XML.
Modul ini ditujukan sebagai pengantar dan bukan untuk referensi lengkap. Referensi
paling lengkap dan terbaru dapat dilihat di: http://developer.android.com
Sebaiknya modul ini dibaca dan dicoba secara berurutan, terutama bagi pemula. Ada
beberapa latihan di akhir materi yang sangat dianjurkan untuk dibuat. Latihan ini
mengukur sejauh mana anda telah memahami materi. Bagi dosen, idealnya memberikan
satu atau dua tugas besar (tiap tugas dikerjakan sekitar 2 bulan) yang dibuat untuk
mengaplikasikan dan mengintegrasikan keseluruhan materi.
Sebelum mulai, silahkan buka situs http://yuliadi.com/ilkom untuk memeriksa apakah
ada update untuk modul ini.
Sekilas Android
Android adalah software platform yang open source untuk mobile device. Android berisi
sistem operasi, middleware dan aplikasi-aplikasi dasar. Basis OS Android adalah kernel
Linux 2.6 yang telah dimodifikasi untuk mobile device.
Android versi 1.0 dikeluarkan tanggal 23 September 2008. Versi 1.1 adalah versi yang
pertama kali digunakan di mobile phone disusul versi 1.5 (Cupcake), 1.6 (Donut) dst.
Versi Android terakhir adalah:
2.2 (Froyo), mempercepat kinerja dengan Just In Time compiler dan Chrome V8
JavaScript engine, Wi-Fi hotspot tethering dan suppport Adobe Flash.
2.3 (Gingerbread), memperbaiki user interface, soft keyboard, copy/paste features
dan support Near Field Communication (NFC).
3.0 (Honeycomb), diperuntukkan untuk tablet yang menggunakan layar lebih besar,
multicore processors dan hardware acceleration untuk grafis.
4.0 (Ice-cream sandwich), kombinasi Gingerbread and 3.0 Honeycomb. Integrasi
antara platform untuk tablet dan smartphone.
4.1 & 4.2 (Jelly-Bean), user interface yang lebih halus (project butter).
Untuk mengembangkan aplikasi di Android, bahasa utama yang digunakan adalah Java,
tetapi bukan dalam platform J2ME yang memiliki banyak keterbatasan. Platform yang
digunakan di Android setara dengan J2SE, dan ini merupakan kelebihan utama Android.
Fitur-fitur
Fitur-fitur utama Android yang dapat dimanfaatkan oleh pengembang app sebagai
berikut:
Database dengan SQLite.
versi Mei 2013 4
Menulis dan membaca file di SD card.
Integrated browser berbasis WebKit engine
2D graphics library; dan OpenGL ES 2.0 untuk 3D graphics
Lokasi dan sensor: GPS, compass, gyroscope, barometer, light sensor,
accelerometer.
Renderscript untuk pemrosesan paralel memanfaatakan CPU dan GPU
Kamera, Audio capture, Jetplayer, Media support untuk MPEG4, H.264, MP3,
AAC, AMR, JPG, PNG, GIF
GSM Telephony: fasilitas telepon dan SMS.
Connectivity: USB, Bluetooth, NFC, SIP (Session Initiation Protocol, internet
telephony khusunya untuk video conference dan instant messaging) dan WiFi
Multitouch
Perbedaan dengan Aplikasi Desktop
Walaupun Java yang digunakan untuk mengembangkan Android app setara dengan J2SE
ada beberapa berbedaan app Android vs app Desktop yang perlu diperhatikan:
Beragamnya ukuran layar dan resolusi.
Karakteristik device yang memiliki banyak sensor (kamera, GPS, accelometer
dsb), terhubung ke internet dan selalu dibawa pengguna membuat app Android
punya potensi di bidang baru.
Walaupun saat ini prosesor device sudah powerfull, tetapi kemampuan batere dan
memori tetap menjadi masalah. Komputasi berat, terutama yang berjalan di
background perlu memperhitungkan masalah penggunaan daya.
Instalasi SDK (Windows)
Sebelumnya pastikan JDK telah diinstall. Jika belum, Anda dapat mendownloadnya di:
http://www.oracle.com/technetwork/java/javase/downloads/
Untuk membuat app Android, diperlukan Android SDK (Software Development Kit)
yang diperoleh di http://developer.android.com/sdk sedangkan untuk IDE (Integrated
Development Environment) dapat dipilih Eclipse, Netbeans atau bahkan langsung
dengan command line dan notepad. Tapi saat ini telah tersedia instalasi untuk Windows
yang telah menyediakan semua komponen yang dibutuhkan (ADT Bundle for Windows).
Download ADT Bundle ini, dan setelah selesai ekstrak ke tempat yang anda inginkan dan
langsung dapat dijalankan karena tidak ada proses instalasi.
Salah satu file hasil ekstrak dari ADT Bundle adalah “SDK Manager.exe”, jalankan file
ini. Dapat dilihat bahwa versi default API yang terinstall adalah 4.2.2 (API17). Jika anda
terkoneksi dengan internet, anda dapat download API versi lain yang dibutuhkan.
Selanjutnya kita perlu membuat emulator smartphone android (AVD: Android Virtual
Device). Program yang akan kita buat dikomputer akan dijalankan di emulator ini.
versi Mei 2013 5
Masih pada SDK Manager, Pilih ToolsManage AVDs. Akan muncul dialog berisi
daftar AVD kemudian klik “New”
Kita akan buat AVD versi 4.2. (JellyBean) Isi nama, device dan target
Lalu isi RAM dengan ukuran kecil terlebih dulu, dan centang “Use Host GPU” (jika
komputer anda memiliki GPU). Lalu tekan OK.
Pilih AVD yang baru Anda buat lalu klik Start dan kemudian Launch. Tunggu 1-5 menit
(tergantung kemampuan komputer yang Anda miliki).
Emulator ini membutuhkan waktu cukup lama dan memori yang besar. Ambil secangkir
kopi dan silahkan tunggu sampai layar berikut muncul (jika yang muncul masih tulisan
versi Mei 2013 6
Android berkelap-kelip, tunggu). Setelah emulator dijalankan, sebaiknya jangan ditutup
lagi untuk menghemat waktu.
Terutama bagi yang belum memiliki Android, Anda dapat gunakan emulator ini untuk
mengeksplorasi fitur-fitur Android.
Selanjutnya kembali ke file bundle yang telah diekstrak, terdapat direktori Eclipse.
Masuk ke direktori ini dan jalankan eclipse.exe. Akan muncul dialog untuk memilih
direktori tempat source akan diletakkan, lalu akan tampil window welcome seperti
gambar dibawah. Close window ini selanjutnya anda siap membuat program pertama.
Tip: Jika anda menggunaka prosesor Intel, ada cara untuk mempercepat emulator
Android, anda dapat menggunakan teknologi intel VT-x. Baca: http://wp.me/p3f1j-cI
(http://yudiwbs.wordpress.com/2012/09/15/mempercepat-emulator-android/)
versi Mei 2013 7
Aplikasi Pertama: Hello World
Sesuai tradisi programmer, langkah pertama saat mencoba suatu platform adalah
membuat aplikasi hello world.
Untuk memulai, jalankan Eclipse, pilih File  New  Android Application Project.
Isi seperti gambar dibawah, jangan lupa ganti nama package. Package name harus unik,
aturan yang biasa digunakan adalah menggunakan nama website organisasi anda (dalam
urutan yang dibalik), ditambah dengan nama applikasi. Misalkan nama website
organisasi anda adalah yuliadi.com, maka nama package adalah: com.yuliadi.namapp.
Jika nama web organisasinya cs.upi.edu, maka nama packagenya:
edu.upi.cs.yudiwbs.namaapp.
Dapat dilihat pada gambar di bawah bahwa minimum required SDK diset dengan API11
Android 3.0 (HoneyComb) karena versi ini telah mendukung ActionBar.
Selanjutnya pilih next sampai untuk activity pilih “BlankActiviy” dan Next.
versi Mei 2013 8
Terakhir, klik “Finish” dan tunggu beberapa saat.
Terlihat ADT telah menyiapkan komponen user interface activity utama (untuk sekarang,
anggap activity adalah semacam Form).
Sekarang coba kita lihat apa yang dihasilkan secara otomatis.
Komponen user interface untuk app Android disimpan di direktori /res/layout dalam
format XML. Dalam project ini secara otomatis dibuat activity_main.xml
Pertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untuk
mengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml untuk melihat
format XML-nya. Komponen user interface dalam Android didefinisikan didalam XML.
Jadi anda dapat mengubah elemen tampilan dengan dua cara: melalui graphical layout
atau langsung mengedit file xml-nya.
Sekarang coba buka source code. Lihat package explorer, buka src, package dan klik
MainActivity.java
versi Mei 2013 9
Dapat dilihat source code yang dibangkitkan ADT
Jalankan project dengan mengklik icon run (gambar bawah) atau ctrl-F11 dan pilih
Android Application. Tunggu emulator dilaunch jika emulator telah ditutup sebelumnya
.
Perhatikan tab console dibagian bawah. Tab ini penting untuk melihat apa yang terjadi.
Lihat emulator maka akan akan muncul aplikasi berikut
versi Mei 2013 10
Selamat! Anda telah menjalankan app pertama anda. Jangan tutup emulator ini, Eclipse
selanjutnya akan menggunakan emulator yang sudah terbuka ini sehingga tidak perlu
menjalankan yang baru.
Aplikasi Kedua: Hello XXX
Selanjutnya kita akan memodifikasi program ini dan menambahkan masukan nama dari
user, lalu setelah user menekan tombol, akan keluar “Hello, [nama]. Terimakasih”
Pertama, melalui project explorer kembali pilih activity_main.xml yang berada di
res/layout (gambar bawah).
Pilih tab “Graphical Layout”
Komponen-komponen user interface yang berada di bagian kiri, sering disebut “widget”
atau “view”.
Pertama pilih widget TextField, pilih yang paling atas (plain text), lalu drag ke dalam
form.
versi Mei 2013 11
Lalu drag button di Form Widget, dan letakkan disebelah kanan text field.
Terakhir, drag teks “hello world” dari tengah ke dekat button. Jika posisi menjadi
„berantakan‟ jangan khawatir, atur ulang sehingga posisinya seperti dibawah.
Coba run (ctrl-F11) untuk melihat hasil tampilan dari program ini. Jangan lupa, jangan
tutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang kita
akan menambahkan aksi yang akan dijalankan saat button diklik.
Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa yang
diketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap komponen perlu
diberi nama.
Kembali ke activity_main.xml. Klik Button kemudian lihat window properties yang
berada di sebelah kanan, ganti Text dengan “Sapa” dan id dengan “bSapa”
versi Mei 2013 12
Saat id diganti maka ada pesan untuk mengupdate semua kemunculan id, jawab ini
dengan “Yes”. Kemudian muncul window “Rename Resource” dan jawab ini juga
dengan OK. Cara ini akan membuat semua kemunculan id ini di activity_main akan
otomatis diganti. Ini akan lebih mudah dibandingkan harus mengganti secara manual file
xml.
Lakukan hal yang sama untuk textfield, ganti id dengan etNama
dan textview, ganti id dengan tvSalam.
Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihan
mengganti nama id menggunakan property.
versi Mei 2013 13
Tip: untuk merapikan XML tekan ctrl-shift-F.
Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan akan
dipanggil. Set atribut android.onClik pada button dengan nama method yang akan
menangani event tersebut (bSapaClick).
Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java (di
direktori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak terupdate
jika file xml tidak di-save secara eksplisit.
Sekarang kita perlu menambahkan code agar saat tombol diklik app akan mengeluarkan
respon.
Melalui package explorer, kembali ke activity utama (MainActivity.java).
Kemudian buat satu method baru bSapaClick. Pastikan nama method sama dengan
yang dicantumkan di activity_main.XML. Nama yang tidak sama akan menyebakan
error saat program dijalankan.
versi Mei 2013 14
Tambahkan impor class yang dibutuhkan. Salah satu cara yang paling mudah adalah
dengan mengklik gambar x merah di sebelah kiri, lalu pilih impor (gambar bawah).
Tip: Jika id tidak dikenali seperti R.id.etNama, R.id.tvSalam dan seterusnya, buka
kembali activity_main.xml lalu tekan ctrl-S (save)
Jalankan program (ctrl-F11), perhatikan tab Console di bagian bawah untuk memonitor
proses emulasi. Isi teks dan tekan tombol.
Cara ini paling sederhana, tetapi programmer harus memastikan nama method pada XML
sama dengan nama method di program. Jika nama method tidak sama, tidak akan muncul
kesalahan pada saat program dicompile, tapi akan menyebabkan kesalahan pada saat
versi Mei 2013 15
runtime (saat button diklik). Alternatif lain adalah dengan menggunakan listener seperti
code dibawah.
Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu tergantung
dari selera programmer dan standard code yang digunakan.
Widget
Pada modul sebelumnya kita telah menggunakan input box, button dan label. Komponen
user interface ini disebut widget. Beberapa widget dasar adalah: TextView, Button,
Image, EditText, CheckBox, RadioButton, ListView.
Latihan:
Buatlah program untuk menghitung luas sebuah persegi panjang. Input adalah
panjang dan lebar (dua edit text). Output adalah luasnya (panjang kali lebar).
Gunakan method berikut untuk mengubah tipe string ke double.
Catatan: input dari method setText bertipe teks, sehingga nilai luas yang bertipe
double harus dikonversi terlebih dulu menjadi teks. Gunakan
String.valueOf(dblLuas) untuk mengkoversi double menjadi teks.
versi Mei 2013 16
Setiap widget memiliki property atau atribut yang mengatur bagaimana widget itu
ditampilkan, seperti tinggi dan lebar widget. Property ini dapat diset melalui xml layout,
property editor atau melalui program. Beberapa widget memiliki beberapa event yang ter-
trigger berdasarkan aksi dari pengguna, misalnya event click pada button.
Detil property dan event untuk setiap widget dapat dilihat di:
http://developer.android.com/reference/android/widget/package-summary.html (scroll
sedikit ke bawah, di bagian classes)
Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project baru.
Text View
TextView digunakan untuk menampilkan label teks. View ini sudah kita gunakan
Beberapa contoh property dari TextView adalah android:textSize, android:textStyle,
android:textColor. Coba tambahkan textview standard dengan atribut dibawah.
Hasilnya:
Catatan: pada atribut textSize, direkomendasikan menggunakan ukuran sp. sp merupakan
singkatan dari scaled-pixel yang memperhitungkan kepadatan resolusi dan juga
preferensi ukuran font dari pengguna.
Button
Button merupakan turunan dari TextView sehingga yang berlaku di textView juga
berlaku di button. Tambahan property yang penting adalah onClick
versi Mei 2013 17
Hasilnya (perhatikan penggunan fill_parent untuk atribut layout_width):
Catatan: dp yang digunakan sebagai satuan panjang merupakan singkatan dari density-
independen pixel. Nilai pixel untuk 1 dp berubah-ubah sesuai dengan resolusi. 1 dp pada
resolusi 160 pixel berarti 1 pixel. Jika resolusinya 320 pixel, maka 1 dp = 2 pixel
demikian seterusnya.
ImageButton dan ImageView
ImageButton adalah turunan dari button, gunakan widget ini jika Anda ingin
menggunakan image sebagai pengganti tulisan pada button. Sedangkan ImageView dapat
digunakan untuk menampilkan image.
Image yang akan ditampilkan dalam button diletakkan di direktori /res sesuai dengan
resolusinya
/[project]/res/drawable-ldpi
/[project]/res/drawable-mdpi
/[project]/res/drawable-hdpi
/[project]/res/drawable-xhdpi
/[project]/res/drawable-xxhdpi
res merupakan singkatan dari “resource”, file-file yang berada di dalam direktori /res
disebut dengan project resources.
ldpi digunakan untuk untuk device dengan layar low density atau resolusi rendah 120dpi
(dot per inch), mdpi untuk medium (160dpi) , hdpi untuk high density (240dpi) dan xhdpi
untuk ekstra high density (320dpi). Sedangkan xxhdpi untuk resolusi 480dpi. Saat ini
sudah jarang device dengan resolusi ldpi.
versi Mei 2013 18
Coba buka direktori tersebut, terdapat icon launcher untuk masing-masing resolusi (ic-
launcher.png), dapat dilihat ukuran yang berbeda untuk setiap resolusi. Jadi untuk hasil
yang maksimal, untuk setiap image yang akan anda gunakan harus disediakan 4 image
untuk setiap resolusi (mdpi sampai dengan xxhdpi). Hal ini untuk mencegah gambar yang
digunakan terlihat pecah atau terlalu kecil pada device dengan resolusi berbeda.
Misalnya kita akan menambah button dan image view. Sebagai sumber gambar kita akan
menggunakan icon standard yang sudah ada direktori drawable. Di window palette, pilih
images & media lalu “Image View” (paling kiri).
Pilih ic_launcher
Coba lakukan yang sama untuk widget “Image Button” sehingga tampilannya akan
seperti ini
Coba jalankan dan klik terutama untuk button-nya.
versi Mei 2013 19
Untuk menambahkan image bersama-sama dengan teks pada button, dapat digunakan
komponen button (bukan ImageButton) lalu set atribut drawableLeft dengan image yang
diinginkan.
Coba tambah button, dan isi drawableLeft.
dan hasilnya
Coba ganti drawableLeft dengan drawableRight, drawableTop atau drawableButtom.
EditText
EditText digunakan untuk menerima input dari pengguna. Pada palette telah disediakan
berbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan XML yang
dihasilkan.
CheckBox
User dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette, Checkbox
ada di bagian FormWidgets.
versi Mei 2013 20
Coba tambahkan dua checkboxs lalu set atribut id dan text melalui window property:
Sehingga hasilnya
Sedangkan contoh program untuk mendapatkan nilai suatu checkbox di check atau tidak
adalah sebagai berikut.
Tambahkan Button dan TextView di form untuk menampilkan hasil pilihan user.
Sehingga tampilannya akan seperti ini.
Sedangkan XML-nya akan seperti ini, anda dapat langsung mengedit file XML ataupun
melalui window property. Jangan lupa atribut onClick:
versi Mei 2013 21
Tambahkan di activity code method klikHasil sebagai berikut, perhatikan penggunaan
isChecked untuk mengambil nilai apakah user meng-check pilihan:
Latihan CheckBox:
Buat soal berikut yang penggunanya dapat memilih lebih dari satu:
--------------------------------------------------------------------------------
1. Manakah kota dibawah ini yang merupakan ibu kota propinsi?
Bandung
Bogor
Banjarmasin
Bontang
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik]
--------------------------------------------------------------------------------
Jawaban yang benar adalah “Bandung” dan “Banjarmasin”. Setiap jawaban
benar bernilai 10, tetapi setiap jawaban yang salah akan dikurangi 5. Jadi jika
pengguna menjawab “Bandung”, “Bogor” dan “Banjarmasin” dan maka
pengguna mendapat nilai 20 – 5 = 15. Tampilkan nilai ini.
Catatan: input dari method setText adalah teks, sehingga nilai integer harus
dikonversi terlebih dulu menjadi teks. Gunakan Integer.toString(intNilai).
Periksa Nilai
ini button
versi Mei 2013 22
RadioButton
Pada radioButton, hanya satu pilihan yang boleh aktif (mutual exclusive) di dalam satu
group yang disebut radioGroup. Modifikasi program checkbox diatas, tambahkan radio
group (bukan radiobutton) yang ada di Form Widget
Hasilnya:
Tambahkan button dan textview, lalu gunakan property untuk mengedit sehingga
hasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel, radiobutton
dengan rbLaki dan rbPerempuan dan id TextView dengan tvHasilRadio.
Tambahkan property onClick pada button dengan nama klikHasilRadio
Catatan: Anda dapat mengeset atribut android:orientation pada RadioGroup menjadi
horizontal agar radio button tersusun secara mendatar.
Sedangkan code saat tombol diklik adalah sebagai berikut.Perhatikan pengunaan
getCheckRadioButtonId yang mengambil idRadio yang dipilih oleh pengguna:
versi Mei 2013 23
ListView
List view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll.
Karena ukuran layar smartphone terbatas, listview merupakan salah satu widget
terpenting dan paling sering digunakan untuk menampilkan kelompok informasi.
ListView dapat berbentuk sederhana sampai kompleks. Beberapa contoh
Latihan:
Buat soal berikut yang penggunanya hanya dapat memilih tepat satu:
--------------------------------------------------------------------------------
1. Sebutkan ibu kota propinsi Sulawesi Tenggara?
Samarinda
Kendari
Palu
Makasar
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik]
--------------------------------------------------------------------------------
Jawaban yang benar adalah “Kendari”. Jika pengguna memilih pilihan yang
benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan
mendapat nilai -2
Periksa Nilai
ini button
versi Mei 2013 24
Kita akan mulai dengan membuat list sederhana seperti gambar di bawah:
Pertama, buat project baru lalu pilih Composite dan tambahkan ListView di
activity_main.xml
Ganti id list view dengan “listAngka”
Di activity utama, tambahkan code sebagai berikut:
Coba jalankan.
versi Mei 2013 25
Pada code di atas, dibuat adapter berisi string untuk mengisi list. Sedangkan
R.layout.simple_expandable_list_item1 adalah layout standard yang disediakan
Android.
Bagaimana mengupdate isi listview saat program sedang berjalan?
Untuk mengupdate data pada contoh diatas, nilai array dapat langsung diubah lalu
panggil method adapter.notifyDataSetChanged()untuk merefresh tampilan. Sebagai
contoh, kita akan membuat button yang saat diklik akan mengubah item pertama:
Tambahkan button diatas listview
Tambahkan event onClick bernama klikButton dan kode seperti berikut:
Composite ListView
Listview juga dapat digunakan untuk menampilkan struktur yang lebih rumit. Contoh
berikut memperlihatkan listview dengan isi yang kita tentukan sendiri.
Untuk membuatnya, pertama buat project baru. Tambahkan ListView seperti pada contoh
sebelumnya. Ganti id dengan listJudul.
Kemudian kita akan buat layout untuk setiap baris pada ListView yang berisi judul dan
keterangan. Pilih project pada project explorer, lalu klik kanan  Android Tools 
New Resources File (gambar bawah)
versi Mei 2013 26
Catatan: alternatif lain membuat layout XML, klik kanan project  new  Android
XML File.
Pilih resource type “Layout”. Beri nama file row.xml, pilih root element LinearLayout,
XML akan dibuat di dalam direktori /res/layout. File row.xml ini akan menentukan
layout dari setiap baris pada listview.
Pada row.xml yang baru digenerate tambahkan widget LargeText dan TextView (gambar
bawah). Ganti Id kedua komponen itu. LargeText dengan tvJudul dan TextView
dengan tvKeterangan.
versi Mei 2013 27
Pada contoh di atas hanya digunakan dua widget (LargeText dan TextView), tapi
sebenarnya apapun dapat dimasukkan di dalam layout ini. Misalnya Button, ImageView
dan lainnya. Ini memungkinkan kita membuat ListView dengan isi yang kompleks.
Sekarang buat class untuk yang menampung data judul dan keterangan. Pada project
explorer, pilih /src/[package], klik kanan  new  Class
Beri nama DataList
Berikut isi dari DataList. Class ini akan berisi data yang akan muncul di setiap baris.
versi Mei 2013 28
Selanjutnya kita akan buat adapter untuk list. Fungsinya untuk “mengisi” setiap row
dengan isi objek DataList.
Buat class dengan cara yang sama dengan sebelumnya (klik /src/[package], klik kanan,
new class), beri nama DataAdapter, jadikan class ini turunan dari kelas ArrayAdapter.
Klik browse di dialog saat membuat class di bagian superclass (gambar bawahh)
Ketik Array…, maka akan muncul ArrayAdapter, pilih item tersebut (gambar bawah)
Isi class DataAdapter adalah sebagai berikut. Pada method getView, parameter pos
adalah indeks baris. Perhatikan pengisian tvJudul dan tvKeterangan dengan data sesuai
indeks.
versi Mei 2013 29
Terakhir, di activity utama (MainActivity.java) tambahkan kode berikut:
Jika dijalankan, hasilnya akan seperti ini:
Latihan:
Buat program dengan tampilan seperti berikut, saat tombol diklik, maka isi list
akan bertambah sesuai dengan nim dan nama. Tip: gunakan
adapter.notifyDataSetChanged() untuk merefresh data.
versi Mei 2013 30
Penanganan Click pada ListView
Listview sering digunakan untuk menampilkan data master-detail yang jika di tap
barisnya akan menampilkan detil pada layar terpisah. Listview juga dapat digunakan
untuk menampilkan menu.
Untuk menangani tap pada listview, gunakan method setOnItemClickListener
Contoh berikut akan menampilkan dialog singkat jika baris ditekan, judul pada baris juga
akan berubah menjadi warna merah. Berdasarkan kode pada contoh listview sebelumnya,
tambahkan kode berikut (bagian yang dilingkari). Penjelasan tentang Toast ada di sub
bab berikutnya.
Ada empat parameter untuk onItemClick:
Parent AdapterView (view parent yang menampung semua row)
View View baris yang ditap
Position Posisi (indeks) dari view pada adapter
id Id dari row.
versi Mei 2013 31
Dialog
Seringkali app perlu menyampaikan pesan sementara kepada pengguna, misalnya jika
menampilkan informasi, melaporkan kesalahan atau memperlihatkan proses yang
memakan waktu lama.
Toast
Toast digunakan untuk menampilkan pesan yang kemudian akan menghilang dengan
sendirinya tanpa interaksi dengan pengguna. Fokus juga tetap pada aplikasi dan tidak
berpindah ke Toast. Kelebihan Toast adalah mudah untuk dibuat, sedangkan
kelemahannya adalah pengguna dapat saja tidak melihat pesan yang dikandung Toast.
Untuk mencobanya, buat project baru, tambahkan satu button, beri label “Toast” dan
kode berikut adalah event saat button diklik:
AlertDialog
Jika yang diinginkan adalah dialog yang muncul dan harus ditutup secara manual oleh
pengguna maka dapat digunakan AlertDialog. AlertDialog dapat menampilkan tiga
button.
Tambahkan button pada program sebelumnya, beri label “AlertDialog”. Tambahkan
code berikut untuk event onClick.
Hasilnya akan seperti ini:
versi Mei 2013 32
Selain setMessage dan setPositiveButton, dapat digunakan method setTitle, setIcon
untuk mengeset judul dan icon message dan SetNeutralButton (button tengah) dan
SetNegativeButton (button kanan). Berikut contohnya
Logging
Fitur logging digunakan untuk memberikan keterangan apa yang sedang terjadi pada app.
Manfaat utama fitur ini adalah untuk mendebug app.
Sebagai contoh, buka project yang pernah anda buat sebelumnya. Lalu pada bagian
MainActivity onCreate tambahkan log sebagai berikut. “yw” adalah tag dan dapat diganti
dengan string apapun.
Buka tab logcat dan jalankan program
versi Mei 2013 33
Terlihat banyak message di dalam logcat, untuk memfilternya sesuai dengan tag yang
kita tentukan sebelumnya, tambahkan filter (gambar bawah). Nama filter dapat diisi
bebas.
Fitur filter yang lain adalah memfilter berdasarkan jenis lognya (verbose sampai dengan
error), terutama untuk jenis error.
Pada contoh diatas kita menggunakan Log.i (info), selain itu dapat digunakan method
Log.v(), Log.d(), log.w() dan Log.e() untuk verbose, debug, warn dan error.
versi Mei 2013 34
Tips: untuk tag, dianjurkan menggunakan variabel yang ditempelkan di class activity
(code dibawah)
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"program dimulai");
}
Activity dan Intent
Dalam materi sebelumnya, selalu digunakan satu activity. Tentu saja sebuah applikasi
sering membutuhkan lebih dari satu activity. Activity adalah komponen terkecil
penyusun Android App yang berisi satu kegiatan yang dapat dilakukan oleh pengguna.
Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah fasilitas
untuk menghubungkan satu activity ke activity yang lain, baik untuk app yang sama
maupun app yang berbeda. Intent juga digunakan untuk notifikasi event misalnya SD
card dimasukkan, SMS masuk dan lain-lain.
Untuk lebih memahami activity dan intent, sekarang coba buka salah satu app android
yang telah dibuat sebelumnya, lalu pada project explorer pilih AndroidManifest.xml. File
XML ini berisi property aplikasi, termasuk di dalamnya activity dan intent.
Klik xml-nya dibagian bawah
Lihat tag activity, dapat dilihat ada satu activity dengan property nama dan label.
versi Mei 2013 35
Selain itu ada tag intent-filter yang digunakan untuk memfilter intent yang dapat dihandle
activity. android.intent.categori.LAUNCHER menyatakan activity ini adalah initial
activity yang dapat dipanggil langsung oleh launcher sedangkan intent.action.MAIN
menyatakan activity ini adalah initial activity tanpa data input dan tidak menghasilkan
output.
Sekarang kita akan membuat contoh app yang memiliki dua activity.
Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat class
baru: di project explorer klik package, klik kanan  New  Class. Beri nama class ini
ActivityDua dan pastikan superclass kelas ini adalah android.app.Activity (gambar
bawah)
Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut name
dengan nama class lengkap dengan nama package dan label.
Penting: Tanpa menambahkan activity ke dalam AndroidManifest.xml, akan terjadi
force close saat program dijalankan.
versi Mei 2013 36
Sekarang kembali ke activity utama (MainActivity), tambahkan button di
activity_main.xml, isi atribut onClick dengan clickButton. Buat implementasi method
clickButton sebagai berikut, perhatikan pengunaan class Intent:
Dari kode diatas dapat dilihat bahwa intent merupakan struktur data (objek) yang
„dilempar‟ sebagai paramater ke method startActivity.
Jika program dijalankan hasilnya akan seperti ini. Terlihat label pada ActivityDua yang
disimpan di dalam AndroidManifest.xml akan menjadi title.
Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat layout untuk
activity tersebut. Ini mirip saat membuat layout baris pada ListView.
Untuk membuat file layout, pilih project di project explorer, klik kanan, AndroidTools 
New Resources File. Pilih resource type “Layout”. Beri nama file activity_dua.xml, pilih
root element LinearLayout (gambar bawah)
versi Mei 2013 37
Tambahkan widget Large Text ke dalam layout, beri nama tvDua dan save.
Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka class
ActivityDua dan tambahkan kode dibawah dan coba jalankan.
Pertukaran Data antar Activity
Pada contoh sebelumnya, activity kedua dipanggil tanpa ada data yang dikirimkan dari
activity utama ke maupun data kembali. Sekarang kita akan belajar bagaimana cara
mengirim dan menerima data antar activity.
Mengirimkan data ke activity
Kita akan memodifikasi contoh pada app sebelumnya (app dengan dua activity).
Pada MainActivity, ubah kode sebagai berikut, perhatikan method putExtra untuk
menambahkan data yang akan dikirim.
Sedangakan di ActivityDua tambah kode sebagai berikut untuk menerima data. Method
onStart ini akan otomatis dipanggil saat activity mulai dijalankan setelah onCreate. Coba
jalankan kembali app ini.
versi Mei 2013 38
Menerima data dari actvity yang dipanggil
Untuk mengirimkan dan menerima data dari activity, dapat digunakan method
startActivityForResult.
Sebagai contoh, kita akan membuat activity yang memanggil activity lain, pengguna
mengisi data pada activity tersebut dan mengirimkannya kembali ke activity utama. Kita
akan memodifikasi program sebelumnya.
Catatan: jika anda mau program sebelumnya tidak hilang anda dapat menduplikasi
project dengan mencopy-paste project tersebut pada package explorer.
Sekarang kita kembali ke activity utama MainActivity, gunakan method putExtra untuk
menambahkan data ke intent. Pada startActivityForResult terdapat parameter angka 99
(silahkan ganti dengan angka atau konstanta apapun). Paremeter ini diperlukan karena
satu activity bisa mengirimkan banyak intent dan diperlukan cara untuk membedakan
antara satu intent dengan intent yang lain.
Method onActivityResult akan dipanggil saat activity yang dipanggil telah selesai.
versi Mei 2013 39
Selanjutnya kita akan menambahkan widget editText pada activity dua yang dapat diedit
oleh pengguna dan hasilnya akan dikirimkan kembali ke activity utama. Buka
res/layout/activity_dua.xml. Tambakan satu editText dan satu button. Beri nama etNama
dan tambahkan android:onClick="clickButtonActDua" di button.
Sekarang kita akan membuat kode di activitydua yang akan mengisi editText dengan data
yang dikirim dari activity utama dan setelah button ditekan mengirimkan hasil update ke
activity utama. Buka file ActivityDua.java dan tambahkan kode berikut:
Jika dijalankan hasilnya sebagai berikut
versi Mei 2013 40
Activity Life Cycle
Pada contoh sebelumnya, kita telah menggunakan lebih dari satu activity. Setiap activity
memiliki siklus seperti gambar dibawah. Saat pertama kali dijalankan activty akan berada
dalam status active. Ketika user pindah app atau menjalankan activity lain maka status
dapat berubah menjadi paused atau stopped. Setelah itu app bisa kembali active (user
membuka kembali) atau di-destroy oleh Android (memori habis).
Kita dapat menangani setiap fase dari activity. Ini berguna misalnya untuk app game,
pada saat activity berubah dari active menjadi paused, maka game juga harus otomatis
dipaused dan jika activity di-kill oleh Android, maka state game perlu disimpan dan
dikembalikan. Demikian juga untuk app yang menggunakan sensor, koneksi dengan
sensor perlu dilepaskan saat app di-pause atau distop.
Latihan Activity-Intent
Menggunakan listview (layar1), tampilkan daftar nama mahasiswa. Pengguna
dapat men-tap nama (baris), dan kemudian app akan menampilkan informasi
yang lebih detil berisi NIM, NAMA, ALAMAT dan NOHP (layar2). Pada layar
informasi detil (layar2) tersebut ada button “EDIT” yang jika diklik akan
membawa ke layar ketiga yang berisi editText untuk mengupdate data. Hasil
update akan muncul baik di layar1 dan layar2
versi Mei 2013 41
Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih terlihat
walaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti menulis ke database
karena akan memperlambat proses transisi ke activity lain. Umumnya onPause digunakan untuk
tiga hal: menstop animasi atau aktivitas yang menggunakan banyak CPU; commit input dari user
(misalnya draft email); melepaskan system resources seperti sensor atau kamera.
Saat activity berubah dari pause menjadi stop, maka akan dipanggil onStop(). Pada method ini
dapat dilakukan komputasi yang kompleks untuk menyimpan state. Pada saat kondisi stop,
activity sama sekali tidak muncul di layar dan fokus sudah berada di app lain.
Jika app kembali aktif, maka akan dipanggil onResume(). Pada method ini lakukan proses untuk
mengembalikan kondisi app seperti semula (kebalikan dari onStop). Selain onResume, untuk
state stop ada event lain yang terlibat yaitu onRestart. Hubungan keduanya dapat dilihat pada
gambar bawah
diambil dari: http://developer.android.com/training/basics/activity-lifecycle/stopping.html
Active/Running Paused
StoppedDestroyed
hilang fokus tapi masih visible
sistem kekurangan memori
sistem kekurangan memori
tidak visible
versi Mei 2013 42
Dari gambar diatas, dapat dilihat urutan pada dari state stop menuju resumed urutannya
adalah OnRestart()  onStart()  onResume()
Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab mengenai
sensor.
Simpan dan Load Activity State
Coba lihat project yang pernah anda buat sebelumnya, dalam setiap project, di method
onCreate dapat dilihat parameter bertipe Bundle.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Parameter ini berisi objek yang menyimpan state activity seperti isi widget sehingga saat
app masuk ke pause/stop dan kemudian kembali, widget terisi kembali secara otomatis.
Kita dapat memanfaatkan Bundle ini untuk menyimpan variabel-variabel yang perlu
dikembalikan state-nya pada saat activity aktif kembali dari stop atau destroyed.
Contoh berikut akan lebih menjelaskan masalah ini, pertama buatlah app dengan dua
button dan satu textview. Saat button “simpan” diklik maka variabel nama dan skor akan
terisi. Sedangkan saat tombol “tampil” diklik maka isi variabel akan dicetak di TextView.
Layoutnya adalah sebagai berikut:
<Button
….
android:onClick="klikButtonTampil"
android:text="Tampil" />
<Button
…
android:onClick="klikButtonSimpan"
android:text="Simpan" />
versi Mei 2013 43
Implementasi dua button di MainActivity adalah sebagai berikut.
String nama;
int skor;
public void klikButtonSimpan(View v) {
skor = 100;
nama = "budi martami";
}
public void klikButtonTampil(View v) {
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText("skor:"+skor+" nama: "+nama);
}
Coba jalankan program.
Klik simpan lalu klik tampil, maka hasilnya akan seperti ini:
Sekarang coba rotate screen (ctrl-F11). Proses rotate akan men-destroy activity dan
mengcreate ulang. Sekarang coba klik tampil (jangan klik simpan), efeknya akan seperti
ini:
Bayangkan efeknya jika dengan merotate device semua variabel di activity hilang. Tentu
saja asumsi pengguna adalah proses rotate tidak akan merubah state dari activity. Ini juga
berlaku misalnya saat pengguna pindah ke activity lain dan kemudian kembali ke activity
semula, mereka akan berharap kondisi activity akan sama seperti sebelum ditinggalkan.
Walaupun pada kenyataanya Android dapat mendestroy activity yang ditinggalkan
tersebut.
versi Mei 2013 44
Untuk mengatasi ini, kita perlu meng-override dua method di MainActivity, pertama
onSaveInstanceState untuk menyimpan variabel dan kedua adalah
onRestoreInstanceState untuk mengembalikan state. Contoh kodenya adalah sebagai
berikut:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//simpan variabel
//method ini dipanggil sebelum onStop
savedInstanceState.putInt("state_skor", skor);
savedInstanceState.putString("state_nama", nama);
//jangan lupa panggil superclass
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Restore nilai
skor = savedInstanceState.getInt("state_skor");
nama = savedInstanceState.getString("state_nama");
}
Jalankan dan perhatikan efeknya (simpan  tampil  rotate (ctrl-F11)  tampil). Maka
variabel akan tetap tersimpan.
Gambaran berikut memperlihatkan posisi dua method untuk menyimpan state:
Diambil dari http://developer.android.com/training/basics/activity-lifecycle/recreating.html
versi Mei 2013 45
Layout Manager
Untuk meletakan komponen (view) pada layar, android menggunakan layout manager.
Karena ukuran layar device Android sangat beragam, tidak ada peletakan posisi widget
secara eksak per pixel.
Terdapat empat jenis layout manager yang memiliki fungsi masing-masing.
LinearLayout, TableLayout, RelativeLayout dan FrameLayout. Berikut akan dibahas
lebih rinci untuk setiap layout.
RelativeLayout
RelativeLayout mengatur posisi secara relatif berdasarkan posisi widget yang lain atau
parentnya. Sebagai contoh, dua widget pada gambar di bawah. EditText posisinya relatif
terhadap textView nama.
Contoh deklarasinya adalah sebagai berikut:
Untuk layout_width dan layout_height ada dua pilihan: match_parent (view berusaha
sebesar parent) dan wrap_content (view hanya berusaha sebesar content yang berada di
dalamnya). Sedangkan padding menyatakan jarak antara pinggir layar dengan komponen.
versi Mei 2013 46
Perhatikan penggunaan atribut layout_toRightOf yang menyatakan bahwa EditText
berada disebelah kanan label. Sedangkan atribut layout_baseLine digunakan agar
TextView dan EditText aligned. Jika layout_baseLine dihapus efeknya akan sebagai
berikut (Text View terlalu tinggi posisinya):
Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan widget lain
adalah:
android:layout_above
android:layout_below
android:layout_toLeftOf
android:layout_toRightOf.
Untuk mengatur posisi ada tambahan lima atribut: android: layout_alignTop,
android:layout_alignBottom, android:layout_alignLeft, android:layout_alignBaseline
Contoh jika kita ingin menambahkan button sehingga posisinya sebagai berikut:
Maka deklarasi buttonnya adalah sebagai berikut:
Artinya button tersebut dibawah dan disebelah kanan EditText.
Widget juga dapat diatur berdasarkan gravity android:layout_gravity ada beberapa
pilihan untuk gravity ini: left, right, center_horizontal, center_vertical, bottom, top.
Gravity ini juga berlaku untuk layout manager yang lain. Berikut adalah contohnya:
versi Mei 2013 47
Hasilnya:
Silahkan bereksperimen dengan berbagai setting atribut layout.
TableLayout
Untuk memilih layout manager, selain dengan cara manual dapat juga ditentukan
membuat layout (File  New  Other  Android XML Layout File). Saat muncul
dialog berikut, pilih Root Element sebagai TableLayout.
versi Mei 2013 48
TableLayout meletakan komponen dalam bentuk tabel (baris dan kolom), mirip seperti
Table yang digunakan di HTML. Pengguna mendefinisikan baris dengan tag
<TableRow> dan sistem secara otomatis mendefinisikan kolomnya. Contoh deklarasi
berikut:
Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan dua kolom dan
dua baris.
Kolom 0 Kolom 1
versi Mei 2013 49
Misalnya kita ingin agar EditText sampai ke bagian belakang, maka tambahkan
android:stretchColumns="1" pada TableLayout. Maka kolom 1 akan terisi penuh.
Hasilnya:
Untuk menambahkan widget di kolom terntentu, gunakan aandroid:layout_column.
Misalnya kita akan menambahkan TextView di kolom 1 (ingat kolom dimulai dari 0). Ini
bisa dilakukan dengan menggunakan atribut android:layout_column. Tanpa atribut ini,
TextView akan muncul di kolom 0
Hasilnya sebagai berikut:
versi Mei 2013 50
Frame Layout
Framelayout digunakan untuk menampilkan satu komponen dalam satu layar. Jika ada
lebih dari satu widget, maka akan ditampilkan secara bertumpuk, walaupun posisi widget
dapat diatur dengan gravity. Kita bisa menambahkan layout lain sebagai child di dalam
frame layout.
Contoh untuk deklarasi berikut menampilkan dua ImageView (pastikan file image telah
disimpan di direktori [project]/res/drawable-hdpi, [project]/res/drawable-ldpi dan
[project]/res/drawable-mdpi )
Hasilnya gambar akan bertumpuk seperti ini.
Catatan: layout_weight adalah rasio antara view. Misalnya ada dua widget, widget
pertama ukurannya harus ¾ layar dan sisanya ¼ layar. Maka set layout_weight widget
pertama dengan 3 dan widget kedua dengan 1. Height atau widht perlu diset 0px.
TBD contohnya
versi Mei 2013 51
LinearLayout
Sesuai dengan namanya, linear layout menyimpan widget dalam satu baris atau satu
kolom (tergantung orientasinya).
Jika orientasinya vertical (android:orientation="vertical") maka hasilnya akan seperti ini
Sedangkan jika orientasinya horizontal (android:orientation="horizontal"), maka hasilnya
akan seperti ini.
Berikut adalah contoh linear layout dengan satu textview dan satu button.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
versi Mei 2013 52
ScrollView
Dengan scrollview, layout seolah-olah memiliki layar yang lebih luas. Pengguna dapat
melakukan scroll. Scrollview hanya mempunyai satu child dan umumnya adalah
LinearLayout. Scrollview hanya dapat melakukan vertical scrolling, gunakan
HorizontalScrollView untuk layout yang dapat discroll secara horizontal.
Jangan gunakan Listview bersama layout ini karena listview telah memiliki mekanisme
scrolling tersendiri.
Berikut adalah contoh scrollview yang menghasilkan layout seperti ini yang dapat
discroll. Dua button teratas menggunakan RelativeLayout yang disisipkan dalam
ScrollView. Ini adalah contoh penggabungan antara dua layout.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
versi Mei 2013 53
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/button1"
android:text="Button" />
</RelativeLayout>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</ScrollView>
RelativeLayout didalam
LinearLayout.
Didalamnya ada dua
button.
Beberapa button agar
scroll terlihat.
versi Mei 2013 54
Kombinasi Layout
Kita bisa mengkombinasikan beberapa layout dalam satu activity. Contoh berikut
menggunakan linearlayout yang memiliki dua anak yaitu relativelayout dan tablelayout.
Relative
layout
dengan dua
TextView
TableLayout
dengan tiga
kolom dan tiga
baris
versi Mei 2013 55
ActionBar
Actionbar adalah bar yang berada diatas activity yang mulai diperkenalkan sejak Android
3. Action bar memperlihatkan identitas berupa judul dan icon activity, tempat fitur-fitur
utama (misalnya search, shared, create dsb), dan dapat digunakan untuk navigasi global.
Beberapa contoh action bar:
(sumber: 8)
Untuk mengimplementasikan ActionBar pada Android dengan versi lebih kecil dari 3
dapat menggunakan library actionbarsherlock.com
Dalam aplikasi sebelumnya, sebenarnya kita secara default selalu membuat ActionBar
karena minimal SDK diset 11 (Android 3.0). Coba buka MainActvity.java dan lihat
Latihan Layout
Berdasarkan hasil latihan activity-intent, pada layar2 dan layar3, tambahkan
layout yang tepat agar tampilan widget rapi.
versi Mei 2013 56
function onCreateOptionMenu. Terlihat fungsi ini mengisi ActionBar dengan isi
res/menu/main.xml
Coba lihat /res/menu/main.xml
Kita akan bahas lebih detil tentang ini pada bagian berikutnya.
ActionItem
ActionItem berbentuk button atau text yang dapat diakses langsung dari ActionBar. Jika
tidak cukup, maka actionitem akan muncul di overflow menu.
Buat project baru, pastikan minimal SDK diisi dengan 11 (Android 3.0)
Kemudian buka /res/menu/main.xml. Isi dengan item sebagai berikut. Kita
menambahkan dua item “Add” dan “Delete” yang akan muncul jika tempatnya cukup
(“ifRoom”).
Saat dijalankan akan menghasilkan ActionBar sebagai berikut.
versi Mei 2013 57
Sekarang kita akan buat aksi kalau “ADD” atau “DELETE” ditekan. Override fungsi
onOptionsItemSelected dan cek hasil getItemId().
String Resources
Pada kode diatas kata “add” dan “delete” dimasukkan ke dalam kode. Ini bukan praktek
yang baik (perhatikan warning pada /main.xml), karena akan menyulitkan jika app akan
diporting untuk bahasa lain. Solusinya adalah dengan menggunakan string resources.
Pertama-tama, buka /res/values/strings.xml. Perhatikan bahwa secara default telah ada
string untuk nama app (app_name) dan lainnya. Tambahkan add dan delete (gambar
bawah). Jangan lupa save setelah selesai.
Selanjutnya resource dapat diakses dalam file xml dengan “@string/nama_res"
sedangkan untuk mengaksesnya dalam source code gunakan R.string.nama_res.
Sekarang kita akan mengubah item menu. Buka /res/menu/main.xml ganti kata “add”
dan “delete” dengan “@string/add” dan “@string/delete”
versi Mei 2013 58
Sedangkan untuk MainActivity.java, ganti dengan R.string.add dan R.string.delete.
Icon
Umumnya action bar menggunakan icon yang lebih mudah dikenali oleh pengguna.
Untuk menambahkan icon, cara yang paling mudah adalah mendownload Android design
icon di: http://developer.android.com/design/downloads/index.html
Setelah download dan ekstrak, pilih all_icons/holo_dark dan copy icon yang diinginkan
(dengan Windows Explorer) ke direktori /res/drawable-hdpi, /res/drawable-mdpi dan
/res/drawable-xhdpi. Ingat dalam pembahasan sebelumnya bahwa setiap resoulusi
membutuhkan gambar yang terpisah.
Setelah itu masuk ke package explorer dan refresh (F5), hasilnya akan seperti ini:
versi Mei 2013 59
Sesuai dengan penamaan standard untuk icon ActionBar, rename agar didahului dengan
“ic_menu_” Untuk me-rename, klik kanan pada nama file refactor  rename. Semua
resolusi secara otomatis akan diganti. Sehingga hasilnya sebagai berikut:
Sekarang buka res/menu/main.xml dan tambahkan atribut android:icon
Jalankan dan hasilnya akan seperti berikut:
Jika kita ingin menambahkan teks disebelah icon, tambahkan nilai “withText” pada
android:showAsAction sebagai berikut:
Jika dijalankan hasilnya tidak berubah. Mengapa? karena tidak cukup ruang untuk
menambahkan teks. Coba ubah orientasi AVD menjadi landscape dengan ctrl-F11 maka
versi Mei 2013 60
tulisan akan muncul (gambar bawah). Untuk mengembalikan menjadi portrait tekan ctrl-
F12.
Selain “ifRoom” dan “withText”, pilihan yang lain adalah “never” agar item hanya
muncul di overlflow menu (gambar bawah)
Sedangkan “always” akan memaksa item selalu muncul. Gunakan untuk item yang benar-
benar sangat penting karena jika tidak mencukupi akan terjadi overlap.
Menyimpan Data
Android menyediakan beberapa cara untuk menyimpan data: file, relasional database
dengan SQLlite dan pasangan key/value yang disebut sistem preferences. Untuk sharing
antar aplikasi disediakan mekanisme yang disebut ContentProvider.
Shared Preferences
Shared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value untuk
tipe data primitif (integer, double, string, booelan). SP cocok untuk penggunaan ringan
seperti menyimpan setting aplikasi dan kondisi user interface misalnya pada saat activity
masuk ke state sleep karena device menerima telepon.
Data dalam shared preferences disimpan dalam device android dalam bentuk XML.
Ada tiga mode untuk shared preferences (SP)
Latihan:
Modifikasi latihan activity-intent pada halaman 40, tambahkan action item
“delete” dan “edit” saat detil data mahasiswa (layar2)
versi Mei 2013 61
MODE_PRIVATE: hanya aplikasi yang membuat SP yang dapat mengakses data
MODE_WORLD_READABLE: aplikasi lain boleh membaca
MODE_WORLD_WRITEABLE: aplikasi lain boleh membaca sekaligus menulis.
Shared Preference objek untuk activity diperoleh melalui method getPreferences(). Kode
berikut memperlihatkan cara penggunaan SP. Jangan lupa memanggil commit!
Jalankan. Kemudian coba komentari bagian isi data, dan jalankan kembali aplikasi.
Dapat dilihat data nama dan umur tersimpan walaupun aplikasi sudah ditutup.
Latihan:
Buat applikasi yang menyimpan berapa kali aplikasi telah dijalankan. Tampilkan
jumlah tersebut.
versi Mei 2013 62
SQLite
SQLite adalah embedded database (hanya menggunakan sekitar 250KB memori) yang
menyediakan fasilitas relational DBMS termasuk SQL. Referensi lengkap SQLite dapat
dilihat di http://www.sqlite.org/ SQLite tidak hanya digunakan di Android.
Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan shared
preference, tidak disediakan fasilitas agar aplikasi dapat membaca database aplikasi lain.
Untuk menggunakan SQLite, sangat dianjurkan menggunakan class helper untuk
membuka dan menutup database, menginisiasi tabel dst. Helper juga digunakan saat
melakukan upgrade struktur database jika suatu saat aplikasi diupdate. Class helper ini
diturunkan dari class SQLiteOpenHelper.
Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data mahasiswa
berupa nama dan nomor telpon. Pertama kita buat class helper terlebih dulu. Buatlah
project Android, tambahkan ke dalam project tersebut satu class (ke project explorer,
pilih src/nama package; klik kanan  New  Class). Pastikan superclass kelas ini
adalah SQLiteOpenHelper. Beri nama class ini OpenHelper.
Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jika
database diuprade.
versi Mei 2013 63
Selanjutnya kita akan membuat class yang melakukan manipulasi terhadap data (insert,
ambil data), beri nama DbMahasiswa Source code DbMahasiwa adalah sebagai berikut:
public class DbMahasiswa {
//class yang menampung record Mahasiswa
public static class Mahasiswa {
public String nama;
public String telepon;
}
private SQLiteDatabase db;
private final Context con;
private final OpenHelper dbHelper;
public DbMahasiswa (Context c) {
con = c;
dbHelper = new OpenHelper(con,"",null,0);
}
public void open() {
db = dbHelper.getWritableDatabase();
}
public void close() {
db.close();
}
public long insertMahasiswa(String nama, String noTelp) {
versi Mei 2013 64
ContentValues newValues = new ContentValues();
newValues.put("NAMA", nama);
newValues.put("TELEPON", noTelp);
return db.insert("MAHASISWA", null, newValues);
}
public Mahasiswa getMahasiswa(String nama) {
Cursor cur = null;
Mahasiswa M = new Mahasiswa();
//kolom yang diambil
String[] cols = new String [] {"ID", "NAMA", "TELEPON"};
//parameter, akan mengganti ? pada NAMA=?
String[] param = {nama};
cur = db.query("MAHASISWA",cols,"NAMA=?",param,null,null,null);
if (cur.getCount()>0) { //ada data? ambil
cur.moveToFirst();
M.nama = cur.getString(1);
M.telepon = cur.getString(2);
}
return M;
}
}
Setelah kita membuat class helper dan class dbMahasiswa, sekarang kita akan
memanfaatkan dua kelas tersebut. Kembali ke activity utama yaitu class MainActivity.
Tambahkan kode dibagian onCreate sebagai berikut:
Selain tipe INTEGER dan TEXT yang digunakan pada contoh diatas, dapat digunakan
tipe REAL, BLOB. Semua tipe lain seperti boolean, date harus dimasukkan ke dalam
tipe tersebut. SQLite tidak melakukan pengecekan tipe, sehingga bisa saja memasukkan
tipe
versi Mei 2013 65
Group By, Having, Order By
Pada kode sebelumnya dapat dilihat penggunaan db.query untuk mengambil data
mahasiswa dengan nama tertentu.
Method query menerima tujuh parameter. Parameter pertama adalah nama table,
parameter kedua adalah array kolom yang akan diambil (SELECT), parameter ketiga
adalah bagian seleksi record (bagian setelah „where‟), parameter keempat adalah isi
bagian seleksi. Parameter 5, 6 dan 7 adalah bagian „group by‟, „having‟ dan „order by‟.
Contoh penggunaan parameter 5-7 adalah sebagai berikut: jika kita menambahkan field
„KELAS‟ pada tabel MAHASISWA dan kita ingin menampilkan jumlah mahasiswa per
kelas (contoh misalnya ada kelas A, B, C dst), tapi hanya kelas yang mempunyai anggota
>1 dengan kelas terurut descending, maka query-nya adalah sebagai berikut:
select kelas, count(*) as jum from mahasiswa
group by kelas
having jum > 1
order by kelas desc;
Maka di dalam program pemanggilan quernya adalah sebagai berikut:
RawQuery
Selain method query, tersedia juga rawQuery untuk memasukkan langsung query.
Sebagai contoh, berikut perbandingan antara query dengan rawQuery
group by
having order by
versi Mei 2013 66
Mana yang lebih baik? beberapa sumber mengatakan query lebih cepat dibandingkan
rawQuery dan lebih mudah untuk dibaca.
Loop Semua Record
Untuk mengambil data semua record, dapat digunakan moveToNext() dalam loop
seperti pada contoh berikut
alternatif lain yang dapat digunakan untuk loop semua record adalah adalah:
Mengisi ListView dengan Record
Listview dapat langsung dihubungkan dengan database dan untuk mencegah user
interface yang tidak responsif (ANR: Application Not Responding), idealnya data diload
di background.
Untuk mencapai hal ini dapat digunakan SimpleCursorAdapter, ContentProvider dan
Loader. Sayangnya hal ini cukup kompleks (mudah-mudahan akan lebih disederhanakan
di API berikutnya). Berikut adalah contoh penggunakan ketiga class tersebut.
Pertama buat project baru:
versi Mei 2013 67
Seperti dalam contoh sebelumnya, buat class helper yang merupakan turunan dari kelas
SQLiteOpenHelper.
Catatan: untuk dapat menggunakan cursor adapter, table harus mengandung field _id
(dan harus huruf kecil)
package edu.upi.cs.yudi.listviewdb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class DbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION =1;
private static final String DATABASE_NAME ="dbMhs";
//cursoradapter mewajibkan nama _id
//harus _id dengan huruf kecil, JANGAN _ID
private static final String TABLE_CREATE =
"CREATE TABLE MHS (_id integer primary key autoincrement, " +
"nama text);";
public DbHelper(Context context, String name,
CursorFactory factory, int version) {
super (context,DATABASE_NAME,factory,DATABASE_VERSION);
}
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//create database
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
//jika database diupgrade, hapus yang lama, buat yang baru
db.execSQL("DROP TABLE IF EXISTS MHS");
versi Mei 2013 68
onCreate(db);
}
}
Selanjutnya kita akan membuat class Contentprovider untuk mengakses tabel.
Class ini merupakan turunan dari ContentProvider (gambar bawah)
Untuk tahap pertama hanya insert dan query yang dibuat. Update dan delete akan
dibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk widget
yang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat di MainActivity
nanti.
package edu.upi.cs.yudi.listviewdb;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
Catatan:
Biasanya Contentprovider dibuat agar data app kita dapat diakses oleh
app lain. Tapi class Contentprovider juga dapat digunakan di app
sendiri secara private (tidak bisa diakses app lain). Keuntungan content
provider adalah:
1. Dapat dieksekusi secara asynchronus, sehingga menghindari
error app not responding.
2. Memberikan akses tunggal ke data.
3. Memudahkan hubungan antara view (widget) dengan data
melalui ContentObserver milik ContentResolver.
4. Dimanfaatkan untuk rest client app.
Kerugian menggunakan contentprovider? relatif rumit.
versi Mei 2013 69
public class MhsContentProvider extends ContentProvider {
// database
private DbHelper database;
// konstanta2 dibawah mendefinisikan bagaimana contentprovider ini diakses
// contentprovider diakses melalui URI
// contoh penggunaa URI ini dapat dilihat di MainActivity
private static final int MHS = 1;
private static final int MHS_ID = 2;
private static final String AUTHORITY = "edu.upi.cs.yudi.listviewdb.contentprovider";
private static final String BASE_PATH = "mhs";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
+ "/" + BASE_PATH);
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, MHS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", MHS_ID);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//insert data
int uriType = sURIMatcher.match(uri);
SQLiteDatabase sqlDB = database.getWritableDatabase();
long id = 0;
switch (uriType) {
case MHS:
id = sqlDB.insert("MHS", null, values);
break;
default:
throw new IllegalArgumentException("URI tdk dikenal: " + uri);
}
//notifikasi
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(BASE_PATH + "/" + id);
}
@Override
public boolean onCreate() {
database = new DbHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs,String sortOrder) {
//query tabel
SQLiteDatabase db = database.getWritableDatabase();
Cursor cur=null;
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case MHS:
//ambil semua
cur = db.query("MHS",projection,selection,selectionArgs,sortOrder,null,null);
break;
case MHS_ID:
// ambil berdasarkan id … nanti dibuat
break;
default:
versi Mei 2013 70
throw new IllegalArgumentException("URI tidak dikenal: " + uri);
}
//notifikasi
cur.setNotificationUri(getContext().getContentResolver(), uri);
return cur;
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// nanti dibuat
return 0;
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// nanti dibuat
return 0;
}
@Override
public String getType(Uri arg0) {
// nanti dibuat
return null;
}
}
Content provider ini harus didaftarkan di AndroidManifest. Buka dan tambahkan di
dalam <application>. android:exported=”false” menunjukkan bahwa content provider ini
private dan tidak dapat diakses app lain. Sedangkan android:name adalah nama kelas,
penggunaan titik pada “.MhsContentProvider” merupakan singkatan dari nama
app. Jadi “.MhsContentProvider” artinya sama dengan
“edu.upi.cs.yudi.listviewdb.MhsContentProvider”
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="edu.upi.cs.yudi.listviewdb.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:exported="false"
android:name=".MhsContentProvider"
android:authorities="edu.upi.cs.yudi.listviewdb.contentprovider" >
</provider>
</application>
versi Mei 2013 71
Setelah Helper dan ContentProvider dibuat, selanjutnya kita akan mempersiapkan
ListView. Caranya seperti ListView pada contoh sebelumnya. Buka
layout/activity_main.xml, drag listview.
Selanjutnya buat xml layout baru sebagai isi dari baris di listview (pilih layout, klik
kanan  new  Android XML ) Beri nama row.xml, dan tambahkan dua textview.
Ganti namanya dengan tvNama dan tvId.
Selanjutnya kita akan melengkapi ActivityMain.java. Activity ini mengimplemen
LoaderCallback sehingga data akan diload dibackground dan baru diisi ke ListView saat
sudah selesai. Pada activity ini akan diinsert dua record kemudian ditampilkan dalam
listview.
package edu.upi.cs.yudi.listviewdb;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.app.LoaderManager;
//implementes LoaderManager
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
//adapter untuk listview
private SimpleCursorAdapter adapter;
private void insertData() {
versi Mei 2013 72
//masukkan dua data untuk testing
ContentValues values = new ContentValues();
values.put("nama", "rudi");
//perhatikan penggunaan URI untuk mengidentifikasi contentprovider
//isi dari MhsContentProvider.CONTENT_URI adalah:
// content://edu.upi.cs.yudi.listviewdb.contentprovider/mhs
getContentResolver().insert(MhsContentProvider.CONTENT_URI, values);
values = new ContentValues();
values.put("nama", "budi");
getContentResolver().insert(MhsContentProvider.CONTENT_URI, values);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.listView1);
//testing insert data. Setelah dijalankan sekali, bisa dikomentari
insertData();
//harus _id dengan huruf kecil!
String[] proj = new String[] { "_id","nama"};
// widget UI yang dipetakan sesuai field diatas (di row.xml)
int[] to = new int[] { R.id.tvId, R.id.tvNama };
getLoaderManager().initLoader(0, null, this);
//adapter yang digunakan adalah simplecursoradapter
adapter = new SimpleCursorAdapter(this, R.layout.row, null, proj,to, 0);
lv.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//load data ke cursor
//harus ada _id dengan huruf kecil!
String[] projection = { "_id", "nama" };
CursorLoader cursorLoader = new CursorLoader(this,
MhsContentProvider.CONTENT_URI, projection, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cur) {
//dipanggil saat cursor sudah terisi, dilakukan
//dibackground sehingga user interface tetap responsif
//isi adapter dengan cursor yang sudah terisi
adapter.swapCursor(cur);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//reset, kosongkan
adapter.swapCursor(null);
}
}
versi Mei 2013 73
Latihan SQLite1:
Buat applikasi untuk menyimpan datamahasiswa (NIM, NAMA, ALAMAT). Buatlah
menu untuk menambahkan data dan mencari berdasarkan NIM (NIM diinput oleh user).
Latihan SQLite2:
Modifikasi latihan activity-intent agar dapat menyimpan ke database.
File
[cek untuk Android versi >=3.0?]
File dapat disimpan baik di dalam device maupun di media penyimpanan (SD card).
Secara default, aplikasi tidak dapat mengakses file milik aplikasi lain. Bagi anda yang
telah mengenal stream dan file di Java, anda dapat membaca secara cepat bagian ini,
karena tidak ada perbedaan antara Java dan Android. Class yang mensupport operasi file
disediakan di package java.io.*
Stream
Pemrosesan file dalam jumlah besar, yang membutuhkan kinerja yang tinggi masih
dibutuhkan berbagai bidang. Misalnya aplikasi backend yang mengelola dokumen di
perusahaan, aplikasi pengolahan teks, aplikasi pemroses XML, HTML, aplikasi
simulasi-simulasi dan sebagainya. Penguasaan stream dan file akan membantu anda
untuk memecahkan berbagai masalah
Stream adalah aliran data. Bayangkan stream sebagai sungai yang mengalirkan air.
Seperti sungai, stream mengalirkan byte-byte data. Pemrosesan input dan output di Java
pada prinsipnya menggunakan konsep stream ini.
Gambar 1: Input Stream (diambil dari http://download.oracle.com/javase/tutorial)
versi Mei 2013 74
Gambar 1: Output Stream (diambil dari http://download.oracle.com/javase/tutorial)
Untuk membantu programmer, tersedia banyak class-class untuk memproses stream,
bahkan lebih dari 60 kelas! (lihat gambar 3 dan gambar 4). Tentu saja tidak semua kelas
tersebut harus digunakan, programmer bisa memilih kelas mana yang dibutuhkan untuk
menyelesaikan masalahnya.
Persiapan
Sebelum memulai, pastikan emulator sudah memiliki SD-Card (Start All Program 
Android SDK Tools)
Lalu untuk setiap project yang akan mengakses ke SD Card, tambahkan ijin untuk
menulis ke media penyimpanan external di AndroidManifest.xml
versi Mei 2013 75
File Teks
Sebelum mulai, pastikan virtual device telah diset SD-Card dan AndroidManifest telah
ditambahkan ijin untuk menulis (baca bagian persiapan)
File teks penting untuk menulis data, XML, HTML dan sebagainya. File teks dianggap
sebagai stream dari karakter. Untuk menulis ke file teks, cara yang paling mudah adalah
dengan menggunakan class PrintWriter. Berikut adalah contoh program yang menulis
dua baris ke file teks.
Sedangkan untuk membaca, dapat digunakan class Scanner yang dapat membaca baris
demi baris. Berikut contoh codenya, letakkan di bawah code atas.
versi Mei 2013 76
Objek Stream
Java telah menyediakan fasilitas agar objek dapat disimpan ke dalam stream secara
otomatis dengan mudah. Class yang digunakan adalah ObjectOutputStream dan
ObjectInputStream.
Setelah membuat project baru (pastikan AndroidManifest.xml-nya telah ditambahkan ijin
menulis ke external!) Sekarang coba kita buat class Mahasiswa sebagai berikut.
Tambah class baru (Filenewclass). Perhatikan penggunaan interface
java.io.Serializable yang menandakan bahwa class ini dalam disimpan ke dalam stream
Latihan: buat file teks berisi
<html>
<body> Halo </body>
</html>
versi Mei 2013 77
Codenya sebagai berikut. Perhatikan variabel serialVersionUID untuk menyatakan versi
class. Jangan lupa class Mahasiswa ini mengimplementas interface Serializable.
Selanjutnya, buat program untuk menulis dua objek mahasiswa ke dalam class. Penulisan
objek ke stream sangat mudah, hanya dengan class ObjectOutputStream dan method
writeObject. Buatlah code ini di activity Main.
versi Mei 2013 78
Sekarang kita lanjutkan ke pembacaan objek yang telah dituliskan. Untuk membaca file
berisi objek digunakan class FileInputStream dan ObjectInputStream;
Catatan:
Perhatikan penggunaan code
ObjectOutputStream out =
new ObjectOutputStream (new FileOutputStream(namaFileOutput));
Pada code diatas Objek FileOuputStream „dibungkus‟ dengan ObjekOutputStream. Ini
yang disebut dengan stream layering, yaitu penggunaan kombinasi beberapa class
yang memproses stream. Contoh yang lain:
pbin = new PushbackInputStream(
new BufferedInputStream(new FileInputStream("pegawai.dat"))));
Walaupun pada awalnya teknik layering stream ini terlihat sulit, tapi teknik ini sangat
bermanfaat untuk mengkombinasikan berbagai fitur yang dibutuhkan.
versi Mei 2013 79
Grafik 2D
Menggambar di Canvas
Dalam contoh pertama kita akan menggunakan Canvas, Paint, Path dan Color untuk
menggambar kotak. Koordinat canvas 0,0 berada di kiri atas. Makin ke kanan nilai x
semakin besar dan makin kebawah nilai y semakin besar.
Setelah membuat project baru, buatlah class yang bernama GraphicsView yang
merupakan turunan class View.
package com.example.cobagraphicview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
public class GraphicView extends View {
private RectF kotak = new RectF(100,100,200,200);
Paint cat= new Paint();
Latihan:
Buatlah class User dengan atribut username dan password. Simpan data objek
user (minimal 3 user) ke dalam Android menggunakan file teks dan file objek.
versi Mei 2013 80
public GraphicView(Context context) {
super(context);
}
protected void onDraw(Canvas c) {
cat.setColor(Color.GREEN);
c.drawRect(kotak,cat);
}
}
Lalu di-activity utama, tambahkan kode berikut yang men-set contentview dengan class
GraphicView.
Hasilnya akan seperti ini
Canvas, sesuai namanya adalah tempat untuk menggambar bentuk 2D. Dengan canvas,
kita dapat menggambar bentuk (lingkaran, kotak, garis, titik), menggambar text dan
melakukan operasi translate, scale, rotate.
Paint digunakan untuk menyimpan style, warna dan informasi lainnya yang dibutuhkan
untuk menggambar.
Class Color digunakan untuk merepresentasikan warna. Android menggunakan 4 angka
untuk alpha, red, green dan blue (RGB) dengan masing-masing rentang nilai 0 sd 255.
Alpha digunakan menyatakan transparansi: alpha 0 artinya transparan 100% . Pada code
diatas, kita menggunakan color constant (Color.GREEN). Coba ganti baris tersebut
menjadi, silahkan berkesperimen dengan alpha yang lebih kecil.
versi Mei 2013 81
cat.setColor(Color.argb(75, 255, 0, 0)); //alphpa,reg,gree,blue
Sekarang kita coba fungsi-fungsi lain pada canvas, tambahkan code berikut dalam class
Graphicsview
package com.example.cobagraphicview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.view.View;
public class GraphicView extends View {
private RectF kotak = new RectF(100,150,200,200); //x1,y1,x2,y2
private RectF kotak2 = new RectF(200,25,300,75);
private RectF kotak3 = new RectF(300,300,400,400);
private RectF oval = new RectF(100,200,200,300); //oval akan mengikut rect ini
private RectF oval2 = new RectF(100,300,200,400);
private Paint cat= new Paint();
public GraphicView(Context context) {
super(context);
}
protected void onDraw(Canvas c) {
//gambar kotak
cat.setColor(Color.argb(75, 255, 0, 0)); //alpha,red,green,blue
c.drawRect(kotak,cat);
//gambar lingkarang biru
cat.setColor(Color.BLUE);
c.drawCircle(50, 50, 30, cat); //x,y,radius
//gambar kotak dengan ujung membulat
c.drawRoundRect(kotak2, 10, 10, cat); //lokasikotak,x-radius oval, y radius oval
//gambar mulai dari posisi 45 derajat sebanyak 90 derajat searah jarum jam
//lengkungan akan mengikuti rect oval
//paramater ke 4 jika true garis penutup melewati titik pusat
//memberikan efek spt pizza yang dipotong.
c.drawArc(oval, 45, 90, true,cat);
cat.setColor(Color.RED);
//jika parameter ke-4 false maka garis akan melewati
//ujung ke ujung tanpa harus ke titik pusat
//menyebabkan efek spt lingkarang dipotong2 mendatar
c.drawArc(oval2, 45, 90, false,cat);
//gambar garis
c.drawLine(50,500,400,500,cat); //x1,y1,x2,y2
//gambar kotak kosong
cat.setColor(Color.GREEN);
cat.setStyle(Style.STROKE);
cat.setStrokeWidth(5);
c.drawRect(kotak3,cat);
//gambar titik
cat.setColor(Color.BLACK);
for (int i=0;i<10;i++) {
versi Mei 2013 82
c.drawPoint( (float) Math.random()*500, (float)Math.random()*500, cat);
}
}
Hasilnya akan seperti berikut:
}
Menulis Teks di Canvas
Method drawText dapat digunakan untuk menambahkan teks di canvas, sedangkan Path
dan drawTextOnPath dapat digunakan untuk menggambar teks yang mengikuti jalur
tertentu. Untuk jelasnya, tambahkan code dibawah pada project sebelumnya. Akan
ditampilkan tulisan berwarna merah dan tulisan italic
cat.setColor(Color.RED);
//diisi dalam maupun outline
cat.setStyle(Style.FILL_AND_STROKE);
cat.setStrokeWidth(2);
cat.setTextSize(35);
c.drawText("Hello World", 10, 500, cat);
//teks serif dan italic
cat.setTypeface(Typeface.create(Typeface.SERIF,Typeface.ITALIC));
c.drawText("ini serif italic", 10, 550, cat);
Selanjutnya kita akan membuat lingkarang yang mengikuti suatu jalur menggunakan
class Path. Deklarasikan satu objek ini di luar onDraw:
Dianjurkan untuk membuat objek diluar method onDraw karena onDraw dapat dipanggil
berulang-ulang.
versi Mei 2013 83
Selanjutnya tambahkan kode berikut, kode ini akan membuat dua tulisan dengan path
berbeda.
path1.moveTo(10,85);
path1.lineTo(250,150);
path1.lineTo(350,300);
cat.setTextSize(25);
//0,0 artinya tidak ada jarak antara tulisan dgn path (offset)
c.drawTextOnPath("tulisan ini mengikuti path", path1, 0, 0, cat);
// gambar tulisan melingkar
//kosongkan path
path1.reset();
//x,y,radius dan berlawan jarumjam (CCW)
path1.addCircle(250, 250, 50, Path.Direction.CCW);
c.drawTextOnPath("ini mengikuti lingkaran", path1, 0, 0, cat);
Hasilnya akan seperti ini:
Penting: Perhatikan bahwa layar Android memiliki resolusi berbeda-beda. Sebagai
contoh, 100 point di layar dengan resolusi tinggi akan memiliki panjang berbeda dengan
layar resolusi rendah. Gunakan Canvas.getWidth() dan Canvas.getHeight untuk
menghitung panjang objek yang diinginkan. Misalnya jika kita ingin membuat garis
sepanjang setengah layar, gunakan ukuran getWidth() / 2 sehingga pada resolusi apapun,
garis akan selalu sepanjang setengah layar.
versi Mei 2013 84
Kode berikut akan menambahkan kotak yang mengikuti ukuran layar yang
memanfaatkan class Path.
int lebar = c.getWidth();
int tinggi = c.getHeight();
int offset=20; //memberikan efek frame
cat.setColor(Color.RED);
cat.setStyle(Style.STROKE);
cat.setStrokeWidth(10);
//menggunakan path, bisa juga dengan drawRect
path1.reset();
path1.moveTo(0+offset, 0+offset); //kiri atas
path1.lineTo(lebar-offset, 0+offset); //kanan atas
path1.lineTo(lebar-offset, tinggi-offset); //kanan bawah
path1.lineTo(0+offset, tinggi-offset); //kiri bawah
path1.lineTo(0+offset, 0+offset); //kembali ke kiri atas
c.drawPath(path1, cat);
Event Touch
Selenjutnya kita akan membuat app yang akan menggambar kotak ditempat pengguna
menyentuh layar. Buat project baru dan tambahkan class baru turunan dari class View,
beri nama GraphicsView. Berikut adalah isi kelas tersebut yang membersihkan layar dan
kemudian menggambar kotak pada koordinat sentuhan jari.
package com.example.cobatouch;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class GraphicsView extends View {
//posisi sentuh
public float posX=-1;
Latihan:
Buatlah gambar rumah seperti ini, tambahkan warna dan modifikasi sesuai yang
anda inginkan
versi Mei 2013 85
public float posY=-1;
private int offset=25;
private Paint cat = new Paint();
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas c) {
//clear screen
cat.setColor(Color.BLACK);
c.drawRect(0,0,c.getWidth(),c.getHeight(),cat);
//gambar kotak diposisi yang disentuh
if (posX!=-1) {
cat.setColor(Color.YELLOW);
c.drawRect(posX-offset,posY-offset,posX+offset,posY+offset,cat);
}
}
}
Sedangkan code untuk MainActivity adalah sebagai berikut. MainActivity
mengimplements onTouchListener
package com.example.cobatouch;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class MainActivity extends Activity implements OnTouchListener{
private GraphicsView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this);
//set listener agar saat graphicview ditouch
//maka onTouch di kelas ini akan dipanggil
gv.setOnTouchListener(this);
setContentView(gv);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: //jari menyentuh layar
//passing posisi ke graphicsview
gv.posX = event.getX();
gv.posY = event.getY();
gv.invalidate(); //draw ulang
break;
case MotionEvent.ACTION_MOVE: //bergerak
break;
case MotionEvent.ACTION_UP: //diangkat
break;
versi Mei 2013 86
case MotionEvent.ACTION_CANCEL: //batal
break;
default:
break;
}
return true;
}
}
Load Image di Canvas
Jika kita ingin meload image (jpg,png) ke dalam canvas, maka file gambar tersebut perlu
dimasukkan ke dalam /res/drawable (hdpi,xhdpi dst), baca kembali pembahasan icon
dalam Actionbar. Dalam contoh berikut digunakan gambar ic_launcher yang sudah
tersedia.
Buat class baru bernama GraphicsView turunan dari View:
package com.example.cobaloadbitmap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
public class GraphicsView extends View {
public Bitmap bmpGambar;
private Paint cat;
public GraphicsView(Context context) {
super(context);
}
protected void onDraw(Canvas c) {
c.drawBitmap(bmpGambar,50,50,cat);
}
}
Latihan:
Buat app yang menampilkan gambar tank (atau tentara) mush secara random.
Pengguna harus mentouch lokasi tank tersebut, dan jika tepat maka tank akan
hilang.
versi Mei 2013 87
Sedangkan code mainActivity adalah sebagai berikut:
package com.example.cobaloadbitmap;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GraphicsView gv = new GraphicsView(this);
//load bitmap
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
}
}
Hasilnya akan muncul seperti ini
TBD:
ubah ukuran image
“drawable-nodpi”
Animasi di Canvas
Animasi di canvas cocok digunakan untuk game sederhana seperti game berjenis puzzle
yang melibatkan sedikit objek dan tidak memperlukan animasi berat. Canvas juga lebih
sederhana dibandingkan dengan OpenGL
Animasi dapat dilakukan dengan membersihkan layar dan menggambar objek di tempat
yang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek dan jeda antar
versi Mei 2013 88
frame. Asyntask melakukan proses dibackground, sehingga app tidak terkunci dan tetap
responsif.
Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView yang
merupakan turunan View seperti pada contoh sebelumnya. Class ini akan membersihkan
layar dan menggambar image sesuai posisi.
package com.example.cobaanimasibmp;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class GraphicsView extends View{
//posisi bola
public float posX=0;
public float posY=0;
public Bitmap bmpGambar;
private Paint cat = new Paint();
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas c) {
//clear screen
c.drawColor(Color.WHITE);
//gambar bitmap
c.drawBitmap(bmpGambar,posX,posY,cat);
}
}
Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask. Kelas ini
berperan untuk mengatur posisi objek dan memerintahkan agar canvas didraw ulang
setiap posisi berubah.
package com.example.cobaanimasibmp;
import android.os.AsyncTask;
import android.util.Log;
public class AnimasiTask extends AsyncTask <Void, Void, Void> {
public GraphicsView gv; //tempat animasi digambar
@Override
protected Void doInBackground(Void... arg0) {
// method ini dijalankan di background secara asynchronous
for (int i=10;i<600;i=i+20) {
//bergerak diagonal
gv.posX=i;
versi Mei 2013 89
gv.posY=i;
//publisgProgress adalah method standard di Asyntask
//dipanggil pada saat loop untuk memberikan kesempatan
//UI untuk mendraw
//contohnya untuk mendraw progressBar
//tapi dalam app ini digunakan untuk mendraw image
//diposisi baru
publishProgress();
//tidur 0.2 detik, agar animasi tdk terlalu cepat
try {
Thread.sleep((long)(1000*0.2));
} catch (InterruptedException e) {
e.printStackTrace();
Log.e("yw","error saat mencoba sleep"+e.getMessage());
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... progress) {
gv.postInvalidate(); //refresh canvas agar menggambar image di posisi baru
}
}
Terakhir, di-activity utama tambahkan code berikut:
package com.example.cobaanimasibmp;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
public class MainActivity extends Activity {
private GraphicsView gv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this);
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
AnimasiTask at = new AnimasiTask();
at.gv = gv;
at.execute(); //jalankan animasi secara async dan dibackground
}
}
versi Mei 2013 90
Sensor
Android mendukung berbagai sensor, mulai dari yang umum tersedia seperti
accelerometer, magnetometer, GPS sampai barometer, termometer dan pengukur
kelembaban.
Accelerometer
Accelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahan
kecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat bahwa
benda yang jatuh mengalami percepatan) maupun perubahan dinamik seperti saat device
bergerak atau bergetar.
Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device.
Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah mana
benda bergerak dan secepat apa.
Penggunaan accelerometer di smartphone/tablet yang paling umum adalah mendeteksi
posisi portrait dan landscape. Selain itu telah ada app yang memanfaatkan accelerometer
untuk menghitung kecepatan dan jarak lari, membunyikan alarm jika device dipindahkan,
game dan sebagainya.
Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini mengukur
perubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah). Satuannya adalah
m/det^2. Gaya gravitasi selalu mempengaruhi. Sehingga jika device diletakkan diam,
nilai sumbu z tetap terbaca sekitar 9.8m/det^2.
Latihan:
Buatlah game sederhana memukul serangga di layar. Program menampilkan
serangga di layar yang bergerak, jika pengguna „memukulnya‟ dengan jari, maka
pengguna mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misal
kotak berubah warna).
versi Mei 2013 91
Diambil dari: http://developer.android.com/reference/android/hardware/SensorEvent.html
Untuk menggunakan sensor di Android, class yang harus digunakan adalah
SensorManager untuk mengetahui apakah device mensupport sensor yang kita inginkan.
Kemudian class Sensor untuk mendapatkan data dari sensor dan interface
SensorEventListener yang diimplement oleh activity.
Buat project baru, tambahkan kode berikut di MainActivity.
versi Mei 2013 92
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
private TextView tvHasil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHasil = (TextView) findViewById(R.id.textView1);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
//device memiliki accelerometer,lanjutkan
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
else {
//tidak punya sensor accelerometer, tampilkan pesan error
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// kalau akurasi berubah
}
@Override
public void onSensorChanged(SensorEvent event) {
double ax=0,ay=0,az=0;
// menangkap perubahan nilai sensor
//if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
ax=event.values[0];
ay=event.values[1];
az=event.values[2];
}
//ax,ay,az bisa digunakan
tvHasil.setText("x:"+ax+" y:"+ay+" z:"+az);
}
@Override
protected void onPause() {
//app kehilangan fokus (misal user menerima telp), lepaskan sensor
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
//app kembali
super.onResume();
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
//SENSOR_DELAY_NORMAL:sampling setiap 200,000 microseconds
versi Mei 2013 93
//SENSOR_DELAY_GAME: 20,000 microsecond
//SENSOR_DELAY_UI: 60,000 microsecond
//SENSOR_DELAY_FASTEST: 0 microsecond
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Masalahnya adalah AVD tidak mensupport accelerometer sehingga saat app harus
dijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan atau
manual melalui APK.
Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet dengan
komputer melalui kabel USB. Pastikan USB driver telah terinstall. Untuk jenis Nexus,
usb driver dapat diinstall melalui SDK manager (Extra  Google USB Driver).
Kemudian klik kanan project  Run As  Run Configuration
Pilih tab target, lalu pilih launch on all … dengan “Active Devices”
Kemudian pada device, jalankan USB Debugging dengan pilihan Setting Developer
Options  USB Debugging.
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android
Modul android

More Related Content

What's hot

Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah Populer
Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah PopulerUstadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah Populer
Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah PopulerAhmad Abdul Haq
 
Membuat dokumen la tex edisi 12
Membuat dokumen la tex edisi 12Membuat dokumen la tex edisi 12
Membuat dokumen la tex edisi 12Hirwanto Iwan
 
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan Aplikasi Kolaborasi Web 2.0 dalam Pendidikan
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan Mohamed Amin Embi
 
Simulasi visual (blender) by SEAMOLEC
Simulasi visual (blender) by SEAMOLECSimulasi visual (blender) by SEAMOLEC
Simulasi visual (blender) by SEAMOLECNovel Helybra
 
Pembuatan animasi- -modul- pustekkom-
Pembuatan animasi- -modul- pustekkom-Pembuatan animasi- -modul- pustekkom-
Pembuatan animasi- -modul- pustekkom-nuzul liana
 
Beamer ; Media Presentasi LaTeX
Beamer ; Media Presentasi LaTeXBeamer ; Media Presentasi LaTeX
Beamer ; Media Presentasi LaTeXHirwanto Iwan
 
17715124 modul-praktikum-tik-kls-7-sem1-2
17715124 modul-praktikum-tik-kls-7-sem1-217715124 modul-praktikum-tik-kls-7-sem1-2
17715124 modul-praktikum-tik-kls-7-sem1-2Rini Susyanti ST
 
Arsitektur & organisasi komputer
Arsitektur & organisasi komputerArsitektur & organisasi komputer
Arsitektur & organisasi komputeryusupnurikhsan
 
LaTeX InDesign Creative Cloud with PGF/ TikZ
LaTeX InDesign Creative Cloud with PGF/ TikZLaTeX InDesign Creative Cloud with PGF/ TikZ
LaTeX InDesign Creative Cloud with PGF/ TikZHirwanto Iwan
 
Katalog game pendidikan 494
Katalog game pendidikan   494Katalog game pendidikan   494
Katalog game pendidikan 494nyitnoraja
 

What's hot (17)

Algoritma dan pemrograman
Algoritma dan pemrogramanAlgoritma dan pemrograman
Algoritma dan pemrograman
 
Swing excerpt
Swing excerptSwing excerpt
Swing excerpt
 
Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah Populer
Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah PopulerUstadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah Populer
Ustadz Abu Ubaidah As Sidawiy - Catatan terhadap Buku 37 Masalah Populer
 
Membuat dokumen la tex edisi 12
Membuat dokumen la tex edisi 12Membuat dokumen la tex edisi 12
Membuat dokumen la tex edisi 12
 
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan Aplikasi Kolaborasi Web 2.0 dalam Pendidikan
Aplikasi Kolaborasi Web 2.0 dalam Pendidikan
 
X ref auto cad 2007-r2
X ref auto cad 2007-r2X ref auto cad 2007-r2
X ref auto cad 2007-r2
 
Simulasi visual (blender) by SEAMOLEC
Simulasi visual (blender) by SEAMOLECSimulasi visual (blender) by SEAMOLEC
Simulasi visual (blender) by SEAMOLEC
 
Moduldwibhs k3 slatem
Moduldwibhs k3 slatemModuldwibhs k3 slatem
Moduldwibhs k3 slatem
 
Pembuatan animasi- -modul- pustekkom-
Pembuatan animasi- -modul- pustekkom-Pembuatan animasi- -modul- pustekkom-
Pembuatan animasi- -modul- pustekkom-
 
Mikro tik
Mikro tikMikro tik
Mikro tik
 
Beamer ; Media Presentasi LaTeX
Beamer ; Media Presentasi LaTeXBeamer ; Media Presentasi LaTeX
Beamer ; Media Presentasi LaTeX
 
17715124 modul-praktikum-tik-kls-7-sem1-2
17715124 modul-praktikum-tik-kls-7-sem1-217715124 modul-praktikum-tik-kls-7-sem1-2
17715124 modul-praktikum-tik-kls-7-sem1-2
 
Membuat Dokumen LaTeX
Membuat Dokumen LaTeXMembuat Dokumen LaTeX
Membuat Dokumen LaTeX
 
Arsitektur & organisasi komputer
Arsitektur & organisasi komputerArsitektur & organisasi komputer
Arsitektur & organisasi komputer
 
LaTeX InDesign Creative Cloud with PGF/ TikZ
LaTeX InDesign Creative Cloud with PGF/ TikZLaTeX InDesign Creative Cloud with PGF/ TikZ
LaTeX InDesign Creative Cloud with PGF/ TikZ
 
Katalog game pendidikan 494
Katalog game pendidikan   494Katalog game pendidikan   494
Katalog game pendidikan 494
 
Lime survei user manual
Lime survei   user manualLime survei   user manual
Lime survei user manual
 

Viewers also liked

Pemrograman aplikasi android
Pemrograman aplikasi androidPemrograman aplikasi android
Pemrograman aplikasi androidMdeno Akbar
 
Membuat sendiri aplikasi android
Membuat sendiri aplikasi androidMembuat sendiri aplikasi android
Membuat sendiri aplikasi androidMdeno Akbar
 
Modul praktikum 4 - Android Sudaryatno
Modul praktikum 4 - Android SudaryatnoModul praktikum 4 - Android Sudaryatno
Modul praktikum 4 - Android SudaryatnoYatno Sudar
 
Modul praktikum 7 - Android Sudaryatno
Modul praktikum 7 - Android SudaryatnoModul praktikum 7 - Android Sudaryatno
Modul praktikum 7 - Android SudaryatnoYatno Sudar
 
Modul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoModul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoYatno Sudar
 
Fundamental android application development
Fundamental android application developmentFundamental android application development
Fundamental android application developmentGoogle
 
Modul praktikum 2 - Android Sudaryatno
Modul praktikum 2 - Android SudaryatnoModul praktikum 2 - Android Sudaryatno
Modul praktikum 2 - Android SudaryatnoYatno Sudar
 
Modul praktikum 13 - Android Sudaryatno
Modul praktikum 13 - Android SudaryatnoModul praktikum 13 - Android Sudaryatno
Modul praktikum 13 - Android SudaryatnoYatno Sudar
 
Modul praktikum 3 - Android Sudaryatno
Modul praktikum 3 - Android SudaryatnoModul praktikum 3 - Android Sudaryatno
Modul praktikum 3 - Android SudaryatnoYatno Sudar
 
Pengenalan android ndk
Pengenalan android ndkPengenalan android ndk
Pengenalan android ndkGoogle
 
Modul praktikum 5 - Android Sudaryatno
Modul praktikum 5 - Android SudaryatnoModul praktikum 5 - Android Sudaryatno
Modul praktikum 5 - Android SudaryatnoYatno Sudar
 
Modul praktikum 12 - Android Sudaryatno
Modul praktikum 12 - Android SudaryatnoModul praktikum 12 - Android Sudaryatno
Modul praktikum 12 - Android SudaryatnoYatno Sudar
 
Modul praktikum 11 - Android Sudaryatno
Modul praktikum 11 - Android SudaryatnoModul praktikum 11 - Android Sudaryatno
Modul praktikum 11 - Android SudaryatnoYatno Sudar
 
Modul praktikum 9 - Android Sudaryatno
Modul praktikum 9 - Android SudaryatnoModul praktikum 9 - Android Sudaryatno
Modul praktikum 9 - Android SudaryatnoYatno Sudar
 
Modul praktikum 8 - Android Sudaryatno
Modul praktikum 8 - Android SudaryatnoModul praktikum 8 - Android Sudaryatno
Modul praktikum 8 - Android SudaryatnoYatno Sudar
 
Android Sliding Menu dengan Navigation Drawer
Android Sliding Menu dengan Navigation DrawerAndroid Sliding Menu dengan Navigation Drawer
Android Sliding Menu dengan Navigation DrawerAgus Haryanto
 
Material design for android (Diggest)
Material design for android (Diggest)Material design for android (Diggest)
Material design for android (Diggest)Google
 
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...Uofa_Unsada
 
Tutorial Lengkap Cara Membuat Aplikasi Android Sederhana
Tutorial Lengkap Cara Membuat Aplikasi Android SederhanaTutorial Lengkap Cara Membuat Aplikasi Android Sederhana
Tutorial Lengkap Cara Membuat Aplikasi Android Sederhanacreatorb dev
 

Viewers also liked (19)

Pemrograman aplikasi android
Pemrograman aplikasi androidPemrograman aplikasi android
Pemrograman aplikasi android
 
Membuat sendiri aplikasi android
Membuat sendiri aplikasi androidMembuat sendiri aplikasi android
Membuat sendiri aplikasi android
 
Modul praktikum 4 - Android Sudaryatno
Modul praktikum 4 - Android SudaryatnoModul praktikum 4 - Android Sudaryatno
Modul praktikum 4 - Android Sudaryatno
 
Modul praktikum 7 - Android Sudaryatno
Modul praktikum 7 - Android SudaryatnoModul praktikum 7 - Android Sudaryatno
Modul praktikum 7 - Android Sudaryatno
 
Modul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android SudaryatnoModul praktikum 10 - Android Sudaryatno
Modul praktikum 10 - Android Sudaryatno
 
Fundamental android application development
Fundamental android application developmentFundamental android application development
Fundamental android application development
 
Modul praktikum 2 - Android Sudaryatno
Modul praktikum 2 - Android SudaryatnoModul praktikum 2 - Android Sudaryatno
Modul praktikum 2 - Android Sudaryatno
 
Modul praktikum 13 - Android Sudaryatno
Modul praktikum 13 - Android SudaryatnoModul praktikum 13 - Android Sudaryatno
Modul praktikum 13 - Android Sudaryatno
 
Modul praktikum 3 - Android Sudaryatno
Modul praktikum 3 - Android SudaryatnoModul praktikum 3 - Android Sudaryatno
Modul praktikum 3 - Android Sudaryatno
 
Pengenalan android ndk
Pengenalan android ndkPengenalan android ndk
Pengenalan android ndk
 
Modul praktikum 5 - Android Sudaryatno
Modul praktikum 5 - Android SudaryatnoModul praktikum 5 - Android Sudaryatno
Modul praktikum 5 - Android Sudaryatno
 
Modul praktikum 12 - Android Sudaryatno
Modul praktikum 12 - Android SudaryatnoModul praktikum 12 - Android Sudaryatno
Modul praktikum 12 - Android Sudaryatno
 
Modul praktikum 11 - Android Sudaryatno
Modul praktikum 11 - Android SudaryatnoModul praktikum 11 - Android Sudaryatno
Modul praktikum 11 - Android Sudaryatno
 
Modul praktikum 9 - Android Sudaryatno
Modul praktikum 9 - Android SudaryatnoModul praktikum 9 - Android Sudaryatno
Modul praktikum 9 - Android Sudaryatno
 
Modul praktikum 8 - Android Sudaryatno
Modul praktikum 8 - Android SudaryatnoModul praktikum 8 - Android Sudaryatno
Modul praktikum 8 - Android Sudaryatno
 
Android Sliding Menu dengan Navigation Drawer
Android Sliding Menu dengan Navigation DrawerAndroid Sliding Menu dengan Navigation Drawer
Android Sliding Menu dengan Navigation Drawer
 
Material design for android (Diggest)
Material design for android (Diggest)Material design for android (Diggest)
Material design for android (Diggest)
 
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
 
Tutorial Lengkap Cara Membuat Aplikasi Android Sederhana
Tutorial Lengkap Cara Membuat Aplikasi Android SederhanaTutorial Lengkap Cara Membuat Aplikasi Android Sederhana
Tutorial Lengkap Cara Membuat Aplikasi Android Sederhana
 

Similar to Modul android

Panduan praktis belajar komputer
Panduan praktis belajar komputerPanduan praktis belajar komputer
Panduan praktis belajar komputerPutuMahendra Wijaya
 
Swing excerpt
Swing excerptSwing excerpt
Swing excerptmalvicom
 
Swing excerpt
Swing excerptSwing excerpt
Swing excerptezah
 
Modul 2 Mengidentifikasi Komputer
Modul 2   Mengidentifikasi KomputerModul 2   Mengidentifikasi Komputer
Modul 2 Mengidentifikasi KomputerAan Solo
 
Pengembangan Aplikasi Cloud Computing Menggunakan Node.js
Pengembangan Aplikasi Cloud Computing Menggunakan Node.jsPengembangan Aplikasi Cloud Computing Menggunakan Node.js
Pengembangan Aplikasi Cloud Computing Menggunakan Node.jsBambang Purnomosidi D. P.
 
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013LaTeX InDesign with Smart Diagram Miicrosoft Word 2013
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013Hirwanto Iwan
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)Donny Kurniawan
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)Donny Kurniawan
 
Modul pelatihan-adobe-flash-cs3-professional
Modul pelatihan-adobe-flash-cs3-professionalModul pelatihan-adobe-flash-cs3-professional
Modul pelatihan-adobe-flash-cs3-professionalkhafidz huda
 
X ref system auto cad 2007
X ref system auto cad 2007X ref system auto cad 2007
X ref system auto cad 2007Rizki Rohman
 
Pengenalan linux
Pengenalan linuxPengenalan linux
Pengenalan linuxBais Wong
 
Buku Ajar Mikrokontroler dan Interface.pdf
Buku Ajar Mikrokontroler dan Interface.pdfBuku Ajar Mikrokontroler dan Interface.pdf
Buku Ajar Mikrokontroler dan Interface.pdfSiswantoSpd
 
Membuat Dokumen LaTeX edisi 13
Membuat Dokumen LaTeX edisi 13Membuat Dokumen LaTeX edisi 13
Membuat Dokumen LaTeX edisi 13Hirwanto Iwan
 
Membuat Dokumen LaTeX Eleventh Edition
Membuat Dokumen LaTeX  Eleventh EditionMembuat Dokumen LaTeX  Eleventh Edition
Membuat Dokumen LaTeX Eleventh EditionHirwanto Iwan
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)Donny Kurniawan
 

Similar to Modul android (20)

Panduan praktis belajar komputer
Panduan praktis belajar komputerPanduan praktis belajar komputer
Panduan praktis belajar komputer
 
Swing excerpt
Swing excerptSwing excerpt
Swing excerpt
 
Swing excerpt
Swing excerptSwing excerpt
Swing excerpt
 
Modul 2 Mengidentifikasi Komputer
Modul 2   Mengidentifikasi KomputerModul 2   Mengidentifikasi Komputer
Modul 2 Mengidentifikasi Komputer
 
Pengembangan Aplikasi Cloud Computing Menggunakan Node.js
Pengembangan Aplikasi Cloud Computing Menggunakan Node.jsPengembangan Aplikasi Cloud Computing Menggunakan Node.js
Pengembangan Aplikasi Cloud Computing Menggunakan Node.js
 
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013LaTeX InDesign with Smart Diagram Miicrosoft Word 2013
LaTeX InDesign with Smart Diagram Miicrosoft Word 2013
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 3)
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 4)
 
Modul pelatihan-adobe-flash-cs3-professional
Modul pelatihan-adobe-flash-cs3-professionalModul pelatihan-adobe-flash-cs3-professional
Modul pelatihan-adobe-flash-cs3-professional
 
X ref system auto cad 2007
X ref system auto cad 2007X ref system auto cad 2007
X ref system auto cad 2007
 
Pengenalan linux
Pengenalan linuxPengenalan linux
Pengenalan linux
 
Letech indesign cc
Letech indesign ccLetech indesign cc
Letech indesign cc
 
Buku Ajar Mikrokontroler dan Interface.pdf
Buku Ajar Mikrokontroler dan Interface.pdfBuku Ajar Mikrokontroler dan Interface.pdf
Buku Ajar Mikrokontroler dan Interface.pdf
 
Algoritma dan pemrograman
Algoritma dan pemrogramanAlgoritma dan pemrograman
Algoritma dan pemrograman
 
Pengantar os-linux
Pengantar os-linuxPengantar os-linux
Pengantar os-linux
 
Membuat Dokumen LaTeX edisi 13
Membuat Dokumen LaTeX edisi 13Membuat Dokumen LaTeX edisi 13
Membuat Dokumen LaTeX edisi 13
 
Kata pengantar daf isi sisop
Kata pengantar daf isi sisopKata pengantar daf isi sisop
Kata pengantar daf isi sisop
 
Membuat Dokumen LaTeX Eleventh Edition
Membuat Dokumen LaTeX  Eleventh EditionMembuat Dokumen LaTeX  Eleventh Edition
Membuat Dokumen LaTeX Eleventh Edition
 
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)
Cara Membuat Program Chatting Sederhana Dengan Visual Basic (Program 1 dan 2)
 
Pelatihan word
Pelatihan wordPelatihan word
Pelatihan word
 

Modul android

  • 1. versi Mei 2013 1 Pengantar Mobile Programming dengan Android Yudi Wibisono (yudi@upi.edu) Ilmu Komputer, Universitas Pendidikan Indonesia (http://cs.upi.edu) versi (BETA): 22 Mei 2013 Periksa versi terakhir di: http://yuliadi.com/ilkom http://creativecommons.org/licenses/by-nc-sa/3.0/ Modul ini bebas dicopy, didistribusikan, ditransmit dan diadaptasi/dimodifikasi/diremix dengan syarat: tidak untuk komersial, pembuat asal tetap dicantumkan dan hasil modifikasi dishare dengan lisensi yang sama. Pengantar Modul................................................................................................................. 3 Sekilas Android................................................................................................................... 3 Fitur-fitur............................................................................................................................. 3 Perbedaan dengan Aplikasi Desktop .................................................................................. 4 Instalasi SDK (Windows) .................................................................................................. 4 Aplikasi Pertama: Hello World........................................................................................... 7 Aplikasi Kedua: Hello XXX............................................................................................. 10 Widget............................................................................................................................... 15 Text View...................................................................................................................... 16 Button............................................................................................................................ 16 ImageButton dan ImageView ....................................................................................... 17 EditText......................................................................................................................... 19 CheckBox...................................................................................................................... 19 RadioButton.................................................................................................................. 22 ListView........................................................................................................................ 23 Composite ListView ................................................................................................. 25 Penanganan Click pada ListView ............................................................................. 30 Dialog................................................................................................................................ 31 Toast.............................................................................................................................. 31 AlertDialog ................................................................................................................... 31 Logging............................................................................................................................. 32 Activity dan Intent ............................................................................................................ 34 Pertukaran Data antar Activity...................................................................................... 37 Mengirimkan data ke activity ................................................................................... 37 Menerima data dari actvity yang dipanggil .............................................................. 38 Activity Life Cycle ....................................................................................................... 40
  • 2. versi Mei 2013 2 Simpan dan Load Activity State ............................................................................... 42 Layout Manager................................................................................................................ 45 RelativeLayout.............................................................................................................. 45 TableLayout .................................................................................................................. 47 Frame Layout................................................................................................................ 50 LinearLayout................................................................................................................. 51 ScrollView .................................................................................................................... 52 Kombinasi Layout......................................................................................................... 54 ActionBar.......................................................................................................................... 55 ActionItem .................................................................................................................... 56 String Resources ........................................................................................................... 57 Icon ............................................................................................................................... 58 Menyimpan Data............................................................................................................... 60 Shared Preferences........................................................................................................ 60 SQLite........................................................................................................................... 62 Group By, Having, Order By.................................................................................... 65 RawQuery ................................................................................................................. 65 Loop Semua Record.................................................................................................. 66 Mengisi ListView dengan Record ............................................................................ 66 File .................................................................................................................................... 73 Stream ....................................................................................................................... 73 Persiapan................................................................................................................... 74 File Teks.................................................................................................................... 75 Objek Stream ............................................................................................................ 76 Grafik 2D .......................................................................................................................... 79 Menggambar di Canvas ................................................................................................ 79 Menulis Teks di Canvas................................................................................................ 82 Event Touch.................................................................................................................. 84 Load Image di Canvas .................................................................................................. 86 Animasi di Canvas........................................................................................................ 87 Sensor................................................................................................................................ 90 Accelerometer............................................................................................................... 90 Orientasi: Yaw (Azimuth), Pitch & Roll ...................................................................... 94 Location API................................................................................................................. 97 Koneksi dengan Server ................................................................................................... 102 Google Map .................................................................................................................... 104 Zoom........................................................................................................................... 106 Ubah Posisi ................................................................................................................. 106 Menambahkan Layer .................................................................................................. 107 TAMBAHAN DAN PERBAIKAN MODUL BERIKUTNYA: .................................... 109
  • 3. versi Mei 2013 3 Pengantar Modul Modul praktikum ini dibuat untuk mendukung praktikum matakuliah Mobile Programming di Program Studi Ilmu Komputer Universitas Pendidikan Indonesia (UPI). Diasumsikan pengguna modul ini telah mengenal dasar-dasar bahasa Java dan XML. Modul ini ditujukan sebagai pengantar dan bukan untuk referensi lengkap. Referensi paling lengkap dan terbaru dapat dilihat di: http://developer.android.com Sebaiknya modul ini dibaca dan dicoba secara berurutan, terutama bagi pemula. Ada beberapa latihan di akhir materi yang sangat dianjurkan untuk dibuat. Latihan ini mengukur sejauh mana anda telah memahami materi. Bagi dosen, idealnya memberikan satu atau dua tugas besar (tiap tugas dikerjakan sekitar 2 bulan) yang dibuat untuk mengaplikasikan dan mengintegrasikan keseluruhan materi. Sebelum mulai, silahkan buka situs http://yuliadi.com/ilkom untuk memeriksa apakah ada update untuk modul ini. Sekilas Android Android adalah software platform yang open source untuk mobile device. Android berisi sistem operasi, middleware dan aplikasi-aplikasi dasar. Basis OS Android adalah kernel Linux 2.6 yang telah dimodifikasi untuk mobile device. Android versi 1.0 dikeluarkan tanggal 23 September 2008. Versi 1.1 adalah versi yang pertama kali digunakan di mobile phone disusul versi 1.5 (Cupcake), 1.6 (Donut) dst. Versi Android terakhir adalah: 2.2 (Froyo), mempercepat kinerja dengan Just In Time compiler dan Chrome V8 JavaScript engine, Wi-Fi hotspot tethering dan suppport Adobe Flash. 2.3 (Gingerbread), memperbaiki user interface, soft keyboard, copy/paste features dan support Near Field Communication (NFC). 3.0 (Honeycomb), diperuntukkan untuk tablet yang menggunakan layar lebih besar, multicore processors dan hardware acceleration untuk grafis. 4.0 (Ice-cream sandwich), kombinasi Gingerbread and 3.0 Honeycomb. Integrasi antara platform untuk tablet dan smartphone. 4.1 & 4.2 (Jelly-Bean), user interface yang lebih halus (project butter). Untuk mengembangkan aplikasi di Android, bahasa utama yang digunakan adalah Java, tetapi bukan dalam platform J2ME yang memiliki banyak keterbatasan. Platform yang digunakan di Android setara dengan J2SE, dan ini merupakan kelebihan utama Android. Fitur-fitur Fitur-fitur utama Android yang dapat dimanfaatkan oleh pengembang app sebagai berikut: Database dengan SQLite.
  • 4. versi Mei 2013 4 Menulis dan membaca file di SD card. Integrated browser berbasis WebKit engine 2D graphics library; dan OpenGL ES 2.0 untuk 3D graphics Lokasi dan sensor: GPS, compass, gyroscope, barometer, light sensor, accelerometer. Renderscript untuk pemrosesan paralel memanfaatakan CPU dan GPU Kamera, Audio capture, Jetplayer, Media support untuk MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF GSM Telephony: fasilitas telepon dan SMS. Connectivity: USB, Bluetooth, NFC, SIP (Session Initiation Protocol, internet telephony khusunya untuk video conference dan instant messaging) dan WiFi Multitouch Perbedaan dengan Aplikasi Desktop Walaupun Java yang digunakan untuk mengembangkan Android app setara dengan J2SE ada beberapa berbedaan app Android vs app Desktop yang perlu diperhatikan: Beragamnya ukuran layar dan resolusi. Karakteristik device yang memiliki banyak sensor (kamera, GPS, accelometer dsb), terhubung ke internet dan selalu dibawa pengguna membuat app Android punya potensi di bidang baru. Walaupun saat ini prosesor device sudah powerfull, tetapi kemampuan batere dan memori tetap menjadi masalah. Komputasi berat, terutama yang berjalan di background perlu memperhitungkan masalah penggunaan daya. Instalasi SDK (Windows) Sebelumnya pastikan JDK telah diinstall. Jika belum, Anda dapat mendownloadnya di: http://www.oracle.com/technetwork/java/javase/downloads/ Untuk membuat app Android, diperlukan Android SDK (Software Development Kit) yang diperoleh di http://developer.android.com/sdk sedangkan untuk IDE (Integrated Development Environment) dapat dipilih Eclipse, Netbeans atau bahkan langsung dengan command line dan notepad. Tapi saat ini telah tersedia instalasi untuk Windows yang telah menyediakan semua komponen yang dibutuhkan (ADT Bundle for Windows). Download ADT Bundle ini, dan setelah selesai ekstrak ke tempat yang anda inginkan dan langsung dapat dijalankan karena tidak ada proses instalasi. Salah satu file hasil ekstrak dari ADT Bundle adalah “SDK Manager.exe”, jalankan file ini. Dapat dilihat bahwa versi default API yang terinstall adalah 4.2.2 (API17). Jika anda terkoneksi dengan internet, anda dapat download API versi lain yang dibutuhkan. Selanjutnya kita perlu membuat emulator smartphone android (AVD: Android Virtual Device). Program yang akan kita buat dikomputer akan dijalankan di emulator ini.
  • 5. versi Mei 2013 5 Masih pada SDK Manager, Pilih ToolsManage AVDs. Akan muncul dialog berisi daftar AVD kemudian klik “New” Kita akan buat AVD versi 4.2. (JellyBean) Isi nama, device dan target Lalu isi RAM dengan ukuran kecil terlebih dulu, dan centang “Use Host GPU” (jika komputer anda memiliki GPU). Lalu tekan OK. Pilih AVD yang baru Anda buat lalu klik Start dan kemudian Launch. Tunggu 1-5 menit (tergantung kemampuan komputer yang Anda miliki). Emulator ini membutuhkan waktu cukup lama dan memori yang besar. Ambil secangkir kopi dan silahkan tunggu sampai layar berikut muncul (jika yang muncul masih tulisan
  • 6. versi Mei 2013 6 Android berkelap-kelip, tunggu). Setelah emulator dijalankan, sebaiknya jangan ditutup lagi untuk menghemat waktu. Terutama bagi yang belum memiliki Android, Anda dapat gunakan emulator ini untuk mengeksplorasi fitur-fitur Android. Selanjutnya kembali ke file bundle yang telah diekstrak, terdapat direktori Eclipse. Masuk ke direktori ini dan jalankan eclipse.exe. Akan muncul dialog untuk memilih direktori tempat source akan diletakkan, lalu akan tampil window welcome seperti gambar dibawah. Close window ini selanjutnya anda siap membuat program pertama. Tip: Jika anda menggunaka prosesor Intel, ada cara untuk mempercepat emulator Android, anda dapat menggunakan teknologi intel VT-x. Baca: http://wp.me/p3f1j-cI (http://yudiwbs.wordpress.com/2012/09/15/mempercepat-emulator-android/)
  • 7. versi Mei 2013 7 Aplikasi Pertama: Hello World Sesuai tradisi programmer, langkah pertama saat mencoba suatu platform adalah membuat aplikasi hello world. Untuk memulai, jalankan Eclipse, pilih File  New  Android Application Project. Isi seperti gambar dibawah, jangan lupa ganti nama package. Package name harus unik, aturan yang biasa digunakan adalah menggunakan nama website organisasi anda (dalam urutan yang dibalik), ditambah dengan nama applikasi. Misalkan nama website organisasi anda adalah yuliadi.com, maka nama package adalah: com.yuliadi.namapp. Jika nama web organisasinya cs.upi.edu, maka nama packagenya: edu.upi.cs.yudiwbs.namaapp. Dapat dilihat pada gambar di bawah bahwa minimum required SDK diset dengan API11 Android 3.0 (HoneyComb) karena versi ini telah mendukung ActionBar. Selanjutnya pilih next sampai untuk activity pilih “BlankActiviy” dan Next.
  • 8. versi Mei 2013 8 Terakhir, klik “Finish” dan tunggu beberapa saat. Terlihat ADT telah menyiapkan komponen user interface activity utama (untuk sekarang, anggap activity adalah semacam Form). Sekarang coba kita lihat apa yang dihasilkan secara otomatis. Komponen user interface untuk app Android disimpan di direktori /res/layout dalam format XML. Dalam project ini secara otomatis dibuat activity_main.xml Pertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untuk mengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml untuk melihat format XML-nya. Komponen user interface dalam Android didefinisikan didalam XML. Jadi anda dapat mengubah elemen tampilan dengan dua cara: melalui graphical layout atau langsung mengedit file xml-nya. Sekarang coba buka source code. Lihat package explorer, buka src, package dan klik MainActivity.java
  • 9. versi Mei 2013 9 Dapat dilihat source code yang dibangkitkan ADT Jalankan project dengan mengklik icon run (gambar bawah) atau ctrl-F11 dan pilih Android Application. Tunggu emulator dilaunch jika emulator telah ditutup sebelumnya . Perhatikan tab console dibagian bawah. Tab ini penting untuk melihat apa yang terjadi. Lihat emulator maka akan akan muncul aplikasi berikut
  • 10. versi Mei 2013 10 Selamat! Anda telah menjalankan app pertama anda. Jangan tutup emulator ini, Eclipse selanjutnya akan menggunakan emulator yang sudah terbuka ini sehingga tidak perlu menjalankan yang baru. Aplikasi Kedua: Hello XXX Selanjutnya kita akan memodifikasi program ini dan menambahkan masukan nama dari user, lalu setelah user menekan tombol, akan keluar “Hello, [nama]. Terimakasih” Pertama, melalui project explorer kembali pilih activity_main.xml yang berada di res/layout (gambar bawah). Pilih tab “Graphical Layout” Komponen-komponen user interface yang berada di bagian kiri, sering disebut “widget” atau “view”. Pertama pilih widget TextField, pilih yang paling atas (plain text), lalu drag ke dalam form.
  • 11. versi Mei 2013 11 Lalu drag button di Form Widget, dan letakkan disebelah kanan text field. Terakhir, drag teks “hello world” dari tengah ke dekat button. Jika posisi menjadi „berantakan‟ jangan khawatir, atur ulang sehingga posisinya seperti dibawah. Coba run (ctrl-F11) untuk melihat hasil tampilan dari program ini. Jangan lupa, jangan tutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang kita akan menambahkan aksi yang akan dijalankan saat button diklik. Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa yang diketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap komponen perlu diberi nama. Kembali ke activity_main.xml. Klik Button kemudian lihat window properties yang berada di sebelah kanan, ganti Text dengan “Sapa” dan id dengan “bSapa”
  • 12. versi Mei 2013 12 Saat id diganti maka ada pesan untuk mengupdate semua kemunculan id, jawab ini dengan “Yes”. Kemudian muncul window “Rename Resource” dan jawab ini juga dengan OK. Cara ini akan membuat semua kemunculan id ini di activity_main akan otomatis diganti. Ini akan lebih mudah dibandingkan harus mengganti secara manual file xml. Lakukan hal yang sama untuk textfield, ganti id dengan etNama dan textview, ganti id dengan tvSalam. Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihan mengganti nama id menggunakan property.
  • 13. versi Mei 2013 13 Tip: untuk merapikan XML tekan ctrl-shift-F. Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan akan dipanggil. Set atribut android.onClik pada button dengan nama method yang akan menangani event tersebut (bSapaClick). Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java (di direktori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak terupdate jika file xml tidak di-save secara eksplisit. Sekarang kita perlu menambahkan code agar saat tombol diklik app akan mengeluarkan respon. Melalui package explorer, kembali ke activity utama (MainActivity.java). Kemudian buat satu method baru bSapaClick. Pastikan nama method sama dengan yang dicantumkan di activity_main.XML. Nama yang tidak sama akan menyebakan error saat program dijalankan.
  • 14. versi Mei 2013 14 Tambahkan impor class yang dibutuhkan. Salah satu cara yang paling mudah adalah dengan mengklik gambar x merah di sebelah kiri, lalu pilih impor (gambar bawah). Tip: Jika id tidak dikenali seperti R.id.etNama, R.id.tvSalam dan seterusnya, buka kembali activity_main.xml lalu tekan ctrl-S (save) Jalankan program (ctrl-F11), perhatikan tab Console di bagian bawah untuk memonitor proses emulasi. Isi teks dan tekan tombol. Cara ini paling sederhana, tetapi programmer harus memastikan nama method pada XML sama dengan nama method di program. Jika nama method tidak sama, tidak akan muncul kesalahan pada saat program dicompile, tapi akan menyebabkan kesalahan pada saat
  • 15. versi Mei 2013 15 runtime (saat button diklik). Alternatif lain adalah dengan menggunakan listener seperti code dibawah. Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu tergantung dari selera programmer dan standard code yang digunakan. Widget Pada modul sebelumnya kita telah menggunakan input box, button dan label. Komponen user interface ini disebut widget. Beberapa widget dasar adalah: TextView, Button, Image, EditText, CheckBox, RadioButton, ListView. Latihan: Buatlah program untuk menghitung luas sebuah persegi panjang. Input adalah panjang dan lebar (dua edit text). Output adalah luasnya (panjang kali lebar). Gunakan method berikut untuk mengubah tipe string ke double. Catatan: input dari method setText bertipe teks, sehingga nilai luas yang bertipe double harus dikonversi terlebih dulu menjadi teks. Gunakan String.valueOf(dblLuas) untuk mengkoversi double menjadi teks.
  • 16. versi Mei 2013 16 Setiap widget memiliki property atau atribut yang mengatur bagaimana widget itu ditampilkan, seperti tinggi dan lebar widget. Property ini dapat diset melalui xml layout, property editor atau melalui program. Beberapa widget memiliki beberapa event yang ter- trigger berdasarkan aksi dari pengguna, misalnya event click pada button. Detil property dan event untuk setiap widget dapat dilihat di: http://developer.android.com/reference/android/widget/package-summary.html (scroll sedikit ke bawah, di bagian classes) Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project baru. Text View TextView digunakan untuk menampilkan label teks. View ini sudah kita gunakan Beberapa contoh property dari TextView adalah android:textSize, android:textStyle, android:textColor. Coba tambahkan textview standard dengan atribut dibawah. Hasilnya: Catatan: pada atribut textSize, direkomendasikan menggunakan ukuran sp. sp merupakan singkatan dari scaled-pixel yang memperhitungkan kepadatan resolusi dan juga preferensi ukuran font dari pengguna. Button Button merupakan turunan dari TextView sehingga yang berlaku di textView juga berlaku di button. Tambahan property yang penting adalah onClick
  • 17. versi Mei 2013 17 Hasilnya (perhatikan penggunan fill_parent untuk atribut layout_width): Catatan: dp yang digunakan sebagai satuan panjang merupakan singkatan dari density- independen pixel. Nilai pixel untuk 1 dp berubah-ubah sesuai dengan resolusi. 1 dp pada resolusi 160 pixel berarti 1 pixel. Jika resolusinya 320 pixel, maka 1 dp = 2 pixel demikian seterusnya. ImageButton dan ImageView ImageButton adalah turunan dari button, gunakan widget ini jika Anda ingin menggunakan image sebagai pengganti tulisan pada button. Sedangkan ImageView dapat digunakan untuk menampilkan image. Image yang akan ditampilkan dalam button diletakkan di direktori /res sesuai dengan resolusinya /[project]/res/drawable-ldpi /[project]/res/drawable-mdpi /[project]/res/drawable-hdpi /[project]/res/drawable-xhdpi /[project]/res/drawable-xxhdpi res merupakan singkatan dari “resource”, file-file yang berada di dalam direktori /res disebut dengan project resources. ldpi digunakan untuk untuk device dengan layar low density atau resolusi rendah 120dpi (dot per inch), mdpi untuk medium (160dpi) , hdpi untuk high density (240dpi) dan xhdpi untuk ekstra high density (320dpi). Sedangkan xxhdpi untuk resolusi 480dpi. Saat ini sudah jarang device dengan resolusi ldpi.
  • 18. versi Mei 2013 18 Coba buka direktori tersebut, terdapat icon launcher untuk masing-masing resolusi (ic- launcher.png), dapat dilihat ukuran yang berbeda untuk setiap resolusi. Jadi untuk hasil yang maksimal, untuk setiap image yang akan anda gunakan harus disediakan 4 image untuk setiap resolusi (mdpi sampai dengan xxhdpi). Hal ini untuk mencegah gambar yang digunakan terlihat pecah atau terlalu kecil pada device dengan resolusi berbeda. Misalnya kita akan menambah button dan image view. Sebagai sumber gambar kita akan menggunakan icon standard yang sudah ada direktori drawable. Di window palette, pilih images & media lalu “Image View” (paling kiri). Pilih ic_launcher Coba lakukan yang sama untuk widget “Image Button” sehingga tampilannya akan seperti ini Coba jalankan dan klik terutama untuk button-nya.
  • 19. versi Mei 2013 19 Untuk menambahkan image bersama-sama dengan teks pada button, dapat digunakan komponen button (bukan ImageButton) lalu set atribut drawableLeft dengan image yang diinginkan. Coba tambah button, dan isi drawableLeft. dan hasilnya Coba ganti drawableLeft dengan drawableRight, drawableTop atau drawableButtom. EditText EditText digunakan untuk menerima input dari pengguna. Pada palette telah disediakan berbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan XML yang dihasilkan. CheckBox User dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette, Checkbox ada di bagian FormWidgets.
  • 20. versi Mei 2013 20 Coba tambahkan dua checkboxs lalu set atribut id dan text melalui window property: Sehingga hasilnya Sedangkan contoh program untuk mendapatkan nilai suatu checkbox di check atau tidak adalah sebagai berikut. Tambahkan Button dan TextView di form untuk menampilkan hasil pilihan user. Sehingga tampilannya akan seperti ini. Sedangkan XML-nya akan seperti ini, anda dapat langsung mengedit file XML ataupun melalui window property. Jangan lupa atribut onClick:
  • 21. versi Mei 2013 21 Tambahkan di activity code method klikHasil sebagai berikut, perhatikan penggunaan isChecked untuk mengambil nilai apakah user meng-check pilihan: Latihan CheckBox: Buat soal berikut yang penggunanya dapat memilih lebih dari satu: -------------------------------------------------------------------------------- 1. Manakah kota dibawah ini yang merupakan ibu kota propinsi? Bandung Bogor Banjarmasin Bontang Nilai anda: [ditampilkan setelah tombol periksa nilai diklik] -------------------------------------------------------------------------------- Jawaban yang benar adalah “Bandung” dan “Banjarmasin”. Setiap jawaban benar bernilai 10, tetapi setiap jawaban yang salah akan dikurangi 5. Jadi jika pengguna menjawab “Bandung”, “Bogor” dan “Banjarmasin” dan maka pengguna mendapat nilai 20 – 5 = 15. Tampilkan nilai ini. Catatan: input dari method setText adalah teks, sehingga nilai integer harus dikonversi terlebih dulu menjadi teks. Gunakan Integer.toString(intNilai). Periksa Nilai ini button
  • 22. versi Mei 2013 22 RadioButton Pada radioButton, hanya satu pilihan yang boleh aktif (mutual exclusive) di dalam satu group yang disebut radioGroup. Modifikasi program checkbox diatas, tambahkan radio group (bukan radiobutton) yang ada di Form Widget Hasilnya: Tambahkan button dan textview, lalu gunakan property untuk mengedit sehingga hasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel, radiobutton dengan rbLaki dan rbPerempuan dan id TextView dengan tvHasilRadio. Tambahkan property onClick pada button dengan nama klikHasilRadio Catatan: Anda dapat mengeset atribut android:orientation pada RadioGroup menjadi horizontal agar radio button tersusun secara mendatar. Sedangkan code saat tombol diklik adalah sebagai berikut.Perhatikan pengunaan getCheckRadioButtonId yang mengambil idRadio yang dipilih oleh pengguna:
  • 23. versi Mei 2013 23 ListView List view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll. Karena ukuran layar smartphone terbatas, listview merupakan salah satu widget terpenting dan paling sering digunakan untuk menampilkan kelompok informasi. ListView dapat berbentuk sederhana sampai kompleks. Beberapa contoh Latihan: Buat soal berikut yang penggunanya hanya dapat memilih tepat satu: -------------------------------------------------------------------------------- 1. Sebutkan ibu kota propinsi Sulawesi Tenggara? Samarinda Kendari Palu Makasar Nilai anda: [ditampilkan setelah tombol periksa nilai diklik] -------------------------------------------------------------------------------- Jawaban yang benar adalah “Kendari”. Jika pengguna memilih pilihan yang benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan mendapat nilai -2 Periksa Nilai ini button
  • 24. versi Mei 2013 24 Kita akan mulai dengan membuat list sederhana seperti gambar di bawah: Pertama, buat project baru lalu pilih Composite dan tambahkan ListView di activity_main.xml Ganti id list view dengan “listAngka” Di activity utama, tambahkan code sebagai berikut: Coba jalankan.
  • 25. versi Mei 2013 25 Pada code di atas, dibuat adapter berisi string untuk mengisi list. Sedangkan R.layout.simple_expandable_list_item1 adalah layout standard yang disediakan Android. Bagaimana mengupdate isi listview saat program sedang berjalan? Untuk mengupdate data pada contoh diatas, nilai array dapat langsung diubah lalu panggil method adapter.notifyDataSetChanged()untuk merefresh tampilan. Sebagai contoh, kita akan membuat button yang saat diklik akan mengubah item pertama: Tambahkan button diatas listview Tambahkan event onClick bernama klikButton dan kode seperti berikut: Composite ListView Listview juga dapat digunakan untuk menampilkan struktur yang lebih rumit. Contoh berikut memperlihatkan listview dengan isi yang kita tentukan sendiri. Untuk membuatnya, pertama buat project baru. Tambahkan ListView seperti pada contoh sebelumnya. Ganti id dengan listJudul. Kemudian kita akan buat layout untuk setiap baris pada ListView yang berisi judul dan keterangan. Pilih project pada project explorer, lalu klik kanan  Android Tools  New Resources File (gambar bawah)
  • 26. versi Mei 2013 26 Catatan: alternatif lain membuat layout XML, klik kanan project  new  Android XML File. Pilih resource type “Layout”. Beri nama file row.xml, pilih root element LinearLayout, XML akan dibuat di dalam direktori /res/layout. File row.xml ini akan menentukan layout dari setiap baris pada listview. Pada row.xml yang baru digenerate tambahkan widget LargeText dan TextView (gambar bawah). Ganti Id kedua komponen itu. LargeText dengan tvJudul dan TextView dengan tvKeterangan.
  • 27. versi Mei 2013 27 Pada contoh di atas hanya digunakan dua widget (LargeText dan TextView), tapi sebenarnya apapun dapat dimasukkan di dalam layout ini. Misalnya Button, ImageView dan lainnya. Ini memungkinkan kita membuat ListView dengan isi yang kompleks. Sekarang buat class untuk yang menampung data judul dan keterangan. Pada project explorer, pilih /src/[package], klik kanan  new  Class Beri nama DataList Berikut isi dari DataList. Class ini akan berisi data yang akan muncul di setiap baris.
  • 28. versi Mei 2013 28 Selanjutnya kita akan buat adapter untuk list. Fungsinya untuk “mengisi” setiap row dengan isi objek DataList. Buat class dengan cara yang sama dengan sebelumnya (klik /src/[package], klik kanan, new class), beri nama DataAdapter, jadikan class ini turunan dari kelas ArrayAdapter. Klik browse di dialog saat membuat class di bagian superclass (gambar bawahh) Ketik Array…, maka akan muncul ArrayAdapter, pilih item tersebut (gambar bawah) Isi class DataAdapter adalah sebagai berikut. Pada method getView, parameter pos adalah indeks baris. Perhatikan pengisian tvJudul dan tvKeterangan dengan data sesuai indeks.
  • 29. versi Mei 2013 29 Terakhir, di activity utama (MainActivity.java) tambahkan kode berikut: Jika dijalankan, hasilnya akan seperti ini: Latihan: Buat program dengan tampilan seperti berikut, saat tombol diklik, maka isi list akan bertambah sesuai dengan nim dan nama. Tip: gunakan adapter.notifyDataSetChanged() untuk merefresh data.
  • 30. versi Mei 2013 30 Penanganan Click pada ListView Listview sering digunakan untuk menampilkan data master-detail yang jika di tap barisnya akan menampilkan detil pada layar terpisah. Listview juga dapat digunakan untuk menampilkan menu. Untuk menangani tap pada listview, gunakan method setOnItemClickListener Contoh berikut akan menampilkan dialog singkat jika baris ditekan, judul pada baris juga akan berubah menjadi warna merah. Berdasarkan kode pada contoh listview sebelumnya, tambahkan kode berikut (bagian yang dilingkari). Penjelasan tentang Toast ada di sub bab berikutnya. Ada empat parameter untuk onItemClick: Parent AdapterView (view parent yang menampung semua row) View View baris yang ditap Position Posisi (indeks) dari view pada adapter id Id dari row.
  • 31. versi Mei 2013 31 Dialog Seringkali app perlu menyampaikan pesan sementara kepada pengguna, misalnya jika menampilkan informasi, melaporkan kesalahan atau memperlihatkan proses yang memakan waktu lama. Toast Toast digunakan untuk menampilkan pesan yang kemudian akan menghilang dengan sendirinya tanpa interaksi dengan pengguna. Fokus juga tetap pada aplikasi dan tidak berpindah ke Toast. Kelebihan Toast adalah mudah untuk dibuat, sedangkan kelemahannya adalah pengguna dapat saja tidak melihat pesan yang dikandung Toast. Untuk mencobanya, buat project baru, tambahkan satu button, beri label “Toast” dan kode berikut adalah event saat button diklik: AlertDialog Jika yang diinginkan adalah dialog yang muncul dan harus ditutup secara manual oleh pengguna maka dapat digunakan AlertDialog. AlertDialog dapat menampilkan tiga button. Tambahkan button pada program sebelumnya, beri label “AlertDialog”. Tambahkan code berikut untuk event onClick. Hasilnya akan seperti ini:
  • 32. versi Mei 2013 32 Selain setMessage dan setPositiveButton, dapat digunakan method setTitle, setIcon untuk mengeset judul dan icon message dan SetNeutralButton (button tengah) dan SetNegativeButton (button kanan). Berikut contohnya Logging Fitur logging digunakan untuk memberikan keterangan apa yang sedang terjadi pada app. Manfaat utama fitur ini adalah untuk mendebug app. Sebagai contoh, buka project yang pernah anda buat sebelumnya. Lalu pada bagian MainActivity onCreate tambahkan log sebagai berikut. “yw” adalah tag dan dapat diganti dengan string apapun. Buka tab logcat dan jalankan program
  • 33. versi Mei 2013 33 Terlihat banyak message di dalam logcat, untuk memfilternya sesuai dengan tag yang kita tentukan sebelumnya, tambahkan filter (gambar bawah). Nama filter dapat diisi bebas. Fitur filter yang lain adalah memfilter berdasarkan jenis lognya (verbose sampai dengan error), terutama untuk jenis error. Pada contoh diatas kita menggunakan Log.i (info), selain itu dapat digunakan method Log.v(), Log.d(), log.w() dan Log.e() untuk verbose, debug, warn dan error.
  • 34. versi Mei 2013 34 Tips: untuk tag, dianjurkan menggunakan variabel yang ditempelkan di class activity (code dibawah) public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG,"program dimulai"); } Activity dan Intent Dalam materi sebelumnya, selalu digunakan satu activity. Tentu saja sebuah applikasi sering membutuhkan lebih dari satu activity. Activity adalah komponen terkecil penyusun Android App yang berisi satu kegiatan yang dapat dilakukan oleh pengguna. Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah fasilitas untuk menghubungkan satu activity ke activity yang lain, baik untuk app yang sama maupun app yang berbeda. Intent juga digunakan untuk notifikasi event misalnya SD card dimasukkan, SMS masuk dan lain-lain. Untuk lebih memahami activity dan intent, sekarang coba buka salah satu app android yang telah dibuat sebelumnya, lalu pada project explorer pilih AndroidManifest.xml. File XML ini berisi property aplikasi, termasuk di dalamnya activity dan intent. Klik xml-nya dibagian bawah Lihat tag activity, dapat dilihat ada satu activity dengan property nama dan label.
  • 35. versi Mei 2013 35 Selain itu ada tag intent-filter yang digunakan untuk memfilter intent yang dapat dihandle activity. android.intent.categori.LAUNCHER menyatakan activity ini adalah initial activity yang dapat dipanggil langsung oleh launcher sedangkan intent.action.MAIN menyatakan activity ini adalah initial activity tanpa data input dan tidak menghasilkan output. Sekarang kita akan membuat contoh app yang memiliki dua activity. Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat class baru: di project explorer klik package, klik kanan  New  Class. Beri nama class ini ActivityDua dan pastikan superclass kelas ini adalah android.app.Activity (gambar bawah) Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut name dengan nama class lengkap dengan nama package dan label. Penting: Tanpa menambahkan activity ke dalam AndroidManifest.xml, akan terjadi force close saat program dijalankan.
  • 36. versi Mei 2013 36 Sekarang kembali ke activity utama (MainActivity), tambahkan button di activity_main.xml, isi atribut onClick dengan clickButton. Buat implementasi method clickButton sebagai berikut, perhatikan pengunaan class Intent: Dari kode diatas dapat dilihat bahwa intent merupakan struktur data (objek) yang „dilempar‟ sebagai paramater ke method startActivity. Jika program dijalankan hasilnya akan seperti ini. Terlihat label pada ActivityDua yang disimpan di dalam AndroidManifest.xml akan menjadi title. Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat layout untuk activity tersebut. Ini mirip saat membuat layout baris pada ListView. Untuk membuat file layout, pilih project di project explorer, klik kanan, AndroidTools  New Resources File. Pilih resource type “Layout”. Beri nama file activity_dua.xml, pilih root element LinearLayout (gambar bawah)
  • 37. versi Mei 2013 37 Tambahkan widget Large Text ke dalam layout, beri nama tvDua dan save. Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka class ActivityDua dan tambahkan kode dibawah dan coba jalankan. Pertukaran Data antar Activity Pada contoh sebelumnya, activity kedua dipanggil tanpa ada data yang dikirimkan dari activity utama ke maupun data kembali. Sekarang kita akan belajar bagaimana cara mengirim dan menerima data antar activity. Mengirimkan data ke activity Kita akan memodifikasi contoh pada app sebelumnya (app dengan dua activity). Pada MainActivity, ubah kode sebagai berikut, perhatikan method putExtra untuk menambahkan data yang akan dikirim. Sedangakan di ActivityDua tambah kode sebagai berikut untuk menerima data. Method onStart ini akan otomatis dipanggil saat activity mulai dijalankan setelah onCreate. Coba jalankan kembali app ini.
  • 38. versi Mei 2013 38 Menerima data dari actvity yang dipanggil Untuk mengirimkan dan menerima data dari activity, dapat digunakan method startActivityForResult. Sebagai contoh, kita akan membuat activity yang memanggil activity lain, pengguna mengisi data pada activity tersebut dan mengirimkannya kembali ke activity utama. Kita akan memodifikasi program sebelumnya. Catatan: jika anda mau program sebelumnya tidak hilang anda dapat menduplikasi project dengan mencopy-paste project tersebut pada package explorer. Sekarang kita kembali ke activity utama MainActivity, gunakan method putExtra untuk menambahkan data ke intent. Pada startActivityForResult terdapat parameter angka 99 (silahkan ganti dengan angka atau konstanta apapun). Paremeter ini diperlukan karena satu activity bisa mengirimkan banyak intent dan diperlukan cara untuk membedakan antara satu intent dengan intent yang lain. Method onActivityResult akan dipanggil saat activity yang dipanggil telah selesai.
  • 39. versi Mei 2013 39 Selanjutnya kita akan menambahkan widget editText pada activity dua yang dapat diedit oleh pengguna dan hasilnya akan dikirimkan kembali ke activity utama. Buka res/layout/activity_dua.xml. Tambakan satu editText dan satu button. Beri nama etNama dan tambahkan android:onClick="clickButtonActDua" di button. Sekarang kita akan membuat kode di activitydua yang akan mengisi editText dengan data yang dikirim dari activity utama dan setelah button ditekan mengirimkan hasil update ke activity utama. Buka file ActivityDua.java dan tambahkan kode berikut: Jika dijalankan hasilnya sebagai berikut
  • 40. versi Mei 2013 40 Activity Life Cycle Pada contoh sebelumnya, kita telah menggunakan lebih dari satu activity. Setiap activity memiliki siklus seperti gambar dibawah. Saat pertama kali dijalankan activty akan berada dalam status active. Ketika user pindah app atau menjalankan activity lain maka status dapat berubah menjadi paused atau stopped. Setelah itu app bisa kembali active (user membuka kembali) atau di-destroy oleh Android (memori habis). Kita dapat menangani setiap fase dari activity. Ini berguna misalnya untuk app game, pada saat activity berubah dari active menjadi paused, maka game juga harus otomatis dipaused dan jika activity di-kill oleh Android, maka state game perlu disimpan dan dikembalikan. Demikian juga untuk app yang menggunakan sensor, koneksi dengan sensor perlu dilepaskan saat app di-pause atau distop. Latihan Activity-Intent Menggunakan listview (layar1), tampilkan daftar nama mahasiswa. Pengguna dapat men-tap nama (baris), dan kemudian app akan menampilkan informasi yang lebih detil berisi NIM, NAMA, ALAMAT dan NOHP (layar2). Pada layar informasi detil (layar2) tersebut ada button “EDIT” yang jika diklik akan membawa ke layar ketiga yang berisi editText untuk mengupdate data. Hasil update akan muncul baik di layar1 dan layar2
  • 41. versi Mei 2013 41 Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih terlihat walaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti menulis ke database karena akan memperlambat proses transisi ke activity lain. Umumnya onPause digunakan untuk tiga hal: menstop animasi atau aktivitas yang menggunakan banyak CPU; commit input dari user (misalnya draft email); melepaskan system resources seperti sensor atau kamera. Saat activity berubah dari pause menjadi stop, maka akan dipanggil onStop(). Pada method ini dapat dilakukan komputasi yang kompleks untuk menyimpan state. Pada saat kondisi stop, activity sama sekali tidak muncul di layar dan fokus sudah berada di app lain. Jika app kembali aktif, maka akan dipanggil onResume(). Pada method ini lakukan proses untuk mengembalikan kondisi app seperti semula (kebalikan dari onStop). Selain onResume, untuk state stop ada event lain yang terlibat yaitu onRestart. Hubungan keduanya dapat dilihat pada gambar bawah diambil dari: http://developer.android.com/training/basics/activity-lifecycle/stopping.html Active/Running Paused StoppedDestroyed hilang fokus tapi masih visible sistem kekurangan memori sistem kekurangan memori tidak visible
  • 42. versi Mei 2013 42 Dari gambar diatas, dapat dilihat urutan pada dari state stop menuju resumed urutannya adalah OnRestart()  onStart()  onResume() Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab mengenai sensor. Simpan dan Load Activity State Coba lihat project yang pernah anda buat sebelumnya, dalam setiap project, di method onCreate dapat dilihat parameter bertipe Bundle. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } Parameter ini berisi objek yang menyimpan state activity seperti isi widget sehingga saat app masuk ke pause/stop dan kemudian kembali, widget terisi kembali secara otomatis. Kita dapat memanfaatkan Bundle ini untuk menyimpan variabel-variabel yang perlu dikembalikan state-nya pada saat activity aktif kembali dari stop atau destroyed. Contoh berikut akan lebih menjelaskan masalah ini, pertama buatlah app dengan dua button dan satu textview. Saat button “simpan” diklik maka variabel nama dan skor akan terisi. Sedangkan saat tombol “tampil” diklik maka isi variabel akan dicetak di TextView. Layoutnya adalah sebagai berikut: <Button …. android:onClick="klikButtonTampil" android:text="Tampil" /> <Button … android:onClick="klikButtonSimpan" android:text="Simpan" />
  • 43. versi Mei 2013 43 Implementasi dua button di MainActivity adalah sebagai berikut. String nama; int skor; public void klikButtonSimpan(View v) { skor = 100; nama = "budi martami"; } public void klikButtonTampil(View v) { TextView tv = (TextView) findViewById(R.id.textView1); tv.setText("skor:"+skor+" nama: "+nama); } Coba jalankan program. Klik simpan lalu klik tampil, maka hasilnya akan seperti ini: Sekarang coba rotate screen (ctrl-F11). Proses rotate akan men-destroy activity dan mengcreate ulang. Sekarang coba klik tampil (jangan klik simpan), efeknya akan seperti ini: Bayangkan efeknya jika dengan merotate device semua variabel di activity hilang. Tentu saja asumsi pengguna adalah proses rotate tidak akan merubah state dari activity. Ini juga berlaku misalnya saat pengguna pindah ke activity lain dan kemudian kembali ke activity semula, mereka akan berharap kondisi activity akan sama seperti sebelum ditinggalkan. Walaupun pada kenyataanya Android dapat mendestroy activity yang ditinggalkan tersebut.
  • 44. versi Mei 2013 44 Untuk mengatasi ini, kita perlu meng-override dua method di MainActivity, pertama onSaveInstanceState untuk menyimpan variabel dan kedua adalah onRestoreInstanceState untuk mengembalikan state. Contoh kodenya adalah sebagai berikut: @Override public void onSaveInstanceState(Bundle savedInstanceState) { //simpan variabel //method ini dipanggil sebelum onStop savedInstanceState.putInt("state_skor", skor); savedInstanceState.putString("state_nama", nama); //jangan lupa panggil superclass super.onSaveInstanceState(savedInstanceState); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { // Restore nilai skor = savedInstanceState.getInt("state_skor"); nama = savedInstanceState.getString("state_nama"); } Jalankan dan perhatikan efeknya (simpan  tampil  rotate (ctrl-F11)  tampil). Maka variabel akan tetap tersimpan. Gambaran berikut memperlihatkan posisi dua method untuk menyimpan state: Diambil dari http://developer.android.com/training/basics/activity-lifecycle/recreating.html
  • 45. versi Mei 2013 45 Layout Manager Untuk meletakan komponen (view) pada layar, android menggunakan layout manager. Karena ukuran layar device Android sangat beragam, tidak ada peletakan posisi widget secara eksak per pixel. Terdapat empat jenis layout manager yang memiliki fungsi masing-masing. LinearLayout, TableLayout, RelativeLayout dan FrameLayout. Berikut akan dibahas lebih rinci untuk setiap layout. RelativeLayout RelativeLayout mengatur posisi secara relatif berdasarkan posisi widget yang lain atau parentnya. Sebagai contoh, dua widget pada gambar di bawah. EditText posisinya relatif terhadap textView nama. Contoh deklarasinya adalah sebagai berikut: Untuk layout_width dan layout_height ada dua pilihan: match_parent (view berusaha sebesar parent) dan wrap_content (view hanya berusaha sebesar content yang berada di dalamnya). Sedangkan padding menyatakan jarak antara pinggir layar dengan komponen.
  • 46. versi Mei 2013 46 Perhatikan penggunaan atribut layout_toRightOf yang menyatakan bahwa EditText berada disebelah kanan label. Sedangkan atribut layout_baseLine digunakan agar TextView dan EditText aligned. Jika layout_baseLine dihapus efeknya akan sebagai berikut (Text View terlalu tinggi posisinya): Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan widget lain adalah: android:layout_above android:layout_below android:layout_toLeftOf android:layout_toRightOf. Untuk mengatur posisi ada tambahan lima atribut: android: layout_alignTop, android:layout_alignBottom, android:layout_alignLeft, android:layout_alignBaseline Contoh jika kita ingin menambahkan button sehingga posisinya sebagai berikut: Maka deklarasi buttonnya adalah sebagai berikut: Artinya button tersebut dibawah dan disebelah kanan EditText. Widget juga dapat diatur berdasarkan gravity android:layout_gravity ada beberapa pilihan untuk gravity ini: left, right, center_horizontal, center_vertical, bottom, top. Gravity ini juga berlaku untuk layout manager yang lain. Berikut adalah contohnya:
  • 47. versi Mei 2013 47 Hasilnya: Silahkan bereksperimen dengan berbagai setting atribut layout. TableLayout Untuk memilih layout manager, selain dengan cara manual dapat juga ditentukan membuat layout (File  New  Other  Android XML Layout File). Saat muncul dialog berikut, pilih Root Element sebagai TableLayout.
  • 48. versi Mei 2013 48 TableLayout meletakan komponen dalam bentuk tabel (baris dan kolom), mirip seperti Table yang digunakan di HTML. Pengguna mendefinisikan baris dengan tag <TableRow> dan sistem secara otomatis mendefinisikan kolomnya. Contoh deklarasi berikut: Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan dua kolom dan dua baris. Kolom 0 Kolom 1
  • 49. versi Mei 2013 49 Misalnya kita ingin agar EditText sampai ke bagian belakang, maka tambahkan android:stretchColumns="1" pada TableLayout. Maka kolom 1 akan terisi penuh. Hasilnya: Untuk menambahkan widget di kolom terntentu, gunakan aandroid:layout_column. Misalnya kita akan menambahkan TextView di kolom 1 (ingat kolom dimulai dari 0). Ini bisa dilakukan dengan menggunakan atribut android:layout_column. Tanpa atribut ini, TextView akan muncul di kolom 0 Hasilnya sebagai berikut:
  • 50. versi Mei 2013 50 Frame Layout Framelayout digunakan untuk menampilkan satu komponen dalam satu layar. Jika ada lebih dari satu widget, maka akan ditampilkan secara bertumpuk, walaupun posisi widget dapat diatur dengan gravity. Kita bisa menambahkan layout lain sebagai child di dalam frame layout. Contoh untuk deklarasi berikut menampilkan dua ImageView (pastikan file image telah disimpan di direktori [project]/res/drawable-hdpi, [project]/res/drawable-ldpi dan [project]/res/drawable-mdpi ) Hasilnya gambar akan bertumpuk seperti ini. Catatan: layout_weight adalah rasio antara view. Misalnya ada dua widget, widget pertama ukurannya harus ¾ layar dan sisanya ¼ layar. Maka set layout_weight widget pertama dengan 3 dan widget kedua dengan 1. Height atau widht perlu diset 0px. TBD contohnya
  • 51. versi Mei 2013 51 LinearLayout Sesuai dengan namanya, linear layout menyimpan widget dalam satu baris atau satu kolom (tergantung orientasinya). Jika orientasinya vertical (android:orientation="vertical") maka hasilnya akan seperti ini Sedangkan jika orientasinya horizontal (android:orientation="horizontal"), maka hasilnya akan seperti ini. Berikut adalah contoh linear layout dengan satu textview dan satu button. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout>
  • 52. versi Mei 2013 52 ScrollView Dengan scrollview, layout seolah-olah memiliki layar yang lebih luas. Pengguna dapat melakukan scroll. Scrollview hanya mempunyai satu child dan umumnya adalah LinearLayout. Scrollview hanya dapat melakukan vertical scrolling, gunakan HorizontalScrollView untuk layout yang dapat discroll secara horizontal. Jangan gunakan Listview bersama layout ini karena listview telah memiliki mekanisme scrolling tersendiri. Berikut adalah contoh scrollview yang menghasilkan layout seperti ini yang dapat discroll. Dua button teratas menggunakan RelativeLayout yang disisipkan dalam ScrollView. Ini adalah contoh penggabungan antara dua layout. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/scroller" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:id="@+id/linearlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" />
  • 53. versi Mei 2013 53 <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/button1" android:text="Button" /> </RelativeLayout> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> </ScrollView> RelativeLayout didalam LinearLayout. Didalamnya ada dua button. Beberapa button agar scroll terlihat.
  • 54. versi Mei 2013 54 Kombinasi Layout Kita bisa mengkombinasikan beberapa layout dalam satu activity. Contoh berikut menggunakan linearlayout yang memiliki dua anak yaitu relativelayout dan tablelayout. Relative layout dengan dua TextView TableLayout dengan tiga kolom dan tiga baris
  • 55. versi Mei 2013 55 ActionBar Actionbar adalah bar yang berada diatas activity yang mulai diperkenalkan sejak Android 3. Action bar memperlihatkan identitas berupa judul dan icon activity, tempat fitur-fitur utama (misalnya search, shared, create dsb), dan dapat digunakan untuk navigasi global. Beberapa contoh action bar: (sumber: 8) Untuk mengimplementasikan ActionBar pada Android dengan versi lebih kecil dari 3 dapat menggunakan library actionbarsherlock.com Dalam aplikasi sebelumnya, sebenarnya kita secara default selalu membuat ActionBar karena minimal SDK diset 11 (Android 3.0). Coba buka MainActvity.java dan lihat Latihan Layout Berdasarkan hasil latihan activity-intent, pada layar2 dan layar3, tambahkan layout yang tepat agar tampilan widget rapi.
  • 56. versi Mei 2013 56 function onCreateOptionMenu. Terlihat fungsi ini mengisi ActionBar dengan isi res/menu/main.xml Coba lihat /res/menu/main.xml Kita akan bahas lebih detil tentang ini pada bagian berikutnya. ActionItem ActionItem berbentuk button atau text yang dapat diakses langsung dari ActionBar. Jika tidak cukup, maka actionitem akan muncul di overflow menu. Buat project baru, pastikan minimal SDK diisi dengan 11 (Android 3.0) Kemudian buka /res/menu/main.xml. Isi dengan item sebagai berikut. Kita menambahkan dua item “Add” dan “Delete” yang akan muncul jika tempatnya cukup (“ifRoom”). Saat dijalankan akan menghasilkan ActionBar sebagai berikut.
  • 57. versi Mei 2013 57 Sekarang kita akan buat aksi kalau “ADD” atau “DELETE” ditekan. Override fungsi onOptionsItemSelected dan cek hasil getItemId(). String Resources Pada kode diatas kata “add” dan “delete” dimasukkan ke dalam kode. Ini bukan praktek yang baik (perhatikan warning pada /main.xml), karena akan menyulitkan jika app akan diporting untuk bahasa lain. Solusinya adalah dengan menggunakan string resources. Pertama-tama, buka /res/values/strings.xml. Perhatikan bahwa secara default telah ada string untuk nama app (app_name) dan lainnya. Tambahkan add dan delete (gambar bawah). Jangan lupa save setelah selesai. Selanjutnya resource dapat diakses dalam file xml dengan “@string/nama_res" sedangkan untuk mengaksesnya dalam source code gunakan R.string.nama_res. Sekarang kita akan mengubah item menu. Buka /res/menu/main.xml ganti kata “add” dan “delete” dengan “@string/add” dan “@string/delete”
  • 58. versi Mei 2013 58 Sedangkan untuk MainActivity.java, ganti dengan R.string.add dan R.string.delete. Icon Umumnya action bar menggunakan icon yang lebih mudah dikenali oleh pengguna. Untuk menambahkan icon, cara yang paling mudah adalah mendownload Android design icon di: http://developer.android.com/design/downloads/index.html Setelah download dan ekstrak, pilih all_icons/holo_dark dan copy icon yang diinginkan (dengan Windows Explorer) ke direktori /res/drawable-hdpi, /res/drawable-mdpi dan /res/drawable-xhdpi. Ingat dalam pembahasan sebelumnya bahwa setiap resoulusi membutuhkan gambar yang terpisah. Setelah itu masuk ke package explorer dan refresh (F5), hasilnya akan seperti ini:
  • 59. versi Mei 2013 59 Sesuai dengan penamaan standard untuk icon ActionBar, rename agar didahului dengan “ic_menu_” Untuk me-rename, klik kanan pada nama file refactor  rename. Semua resolusi secara otomatis akan diganti. Sehingga hasilnya sebagai berikut: Sekarang buka res/menu/main.xml dan tambahkan atribut android:icon Jalankan dan hasilnya akan seperti berikut: Jika kita ingin menambahkan teks disebelah icon, tambahkan nilai “withText” pada android:showAsAction sebagai berikut: Jika dijalankan hasilnya tidak berubah. Mengapa? karena tidak cukup ruang untuk menambahkan teks. Coba ubah orientasi AVD menjadi landscape dengan ctrl-F11 maka
  • 60. versi Mei 2013 60 tulisan akan muncul (gambar bawah). Untuk mengembalikan menjadi portrait tekan ctrl- F12. Selain “ifRoom” dan “withText”, pilihan yang lain adalah “never” agar item hanya muncul di overlflow menu (gambar bawah) Sedangkan “always” akan memaksa item selalu muncul. Gunakan untuk item yang benar- benar sangat penting karena jika tidak mencukupi akan terjadi overlap. Menyimpan Data Android menyediakan beberapa cara untuk menyimpan data: file, relasional database dengan SQLlite dan pasangan key/value yang disebut sistem preferences. Untuk sharing antar aplikasi disediakan mekanisme yang disebut ContentProvider. Shared Preferences Shared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value untuk tipe data primitif (integer, double, string, booelan). SP cocok untuk penggunaan ringan seperti menyimpan setting aplikasi dan kondisi user interface misalnya pada saat activity masuk ke state sleep karena device menerima telepon. Data dalam shared preferences disimpan dalam device android dalam bentuk XML. Ada tiga mode untuk shared preferences (SP) Latihan: Modifikasi latihan activity-intent pada halaman 40, tambahkan action item “delete” dan “edit” saat detil data mahasiswa (layar2)
  • 61. versi Mei 2013 61 MODE_PRIVATE: hanya aplikasi yang membuat SP yang dapat mengakses data MODE_WORLD_READABLE: aplikasi lain boleh membaca MODE_WORLD_WRITEABLE: aplikasi lain boleh membaca sekaligus menulis. Shared Preference objek untuk activity diperoleh melalui method getPreferences(). Kode berikut memperlihatkan cara penggunaan SP. Jangan lupa memanggil commit! Jalankan. Kemudian coba komentari bagian isi data, dan jalankan kembali aplikasi. Dapat dilihat data nama dan umur tersimpan walaupun aplikasi sudah ditutup. Latihan: Buat applikasi yang menyimpan berapa kali aplikasi telah dijalankan. Tampilkan jumlah tersebut.
  • 62. versi Mei 2013 62 SQLite SQLite adalah embedded database (hanya menggunakan sekitar 250KB memori) yang menyediakan fasilitas relational DBMS termasuk SQL. Referensi lengkap SQLite dapat dilihat di http://www.sqlite.org/ SQLite tidak hanya digunakan di Android. Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan shared preference, tidak disediakan fasilitas agar aplikasi dapat membaca database aplikasi lain. Untuk menggunakan SQLite, sangat dianjurkan menggunakan class helper untuk membuka dan menutup database, menginisiasi tabel dst. Helper juga digunakan saat melakukan upgrade struktur database jika suatu saat aplikasi diupdate. Class helper ini diturunkan dari class SQLiteOpenHelper. Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data mahasiswa berupa nama dan nomor telpon. Pertama kita buat class helper terlebih dulu. Buatlah project Android, tambahkan ke dalam project tersebut satu class (ke project explorer, pilih src/nama package; klik kanan  New  Class). Pastikan superclass kelas ini adalah SQLiteOpenHelper. Beri nama class ini OpenHelper. Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jika database diuprade.
  • 63. versi Mei 2013 63 Selanjutnya kita akan membuat class yang melakukan manipulasi terhadap data (insert, ambil data), beri nama DbMahasiswa Source code DbMahasiwa adalah sebagai berikut: public class DbMahasiswa { //class yang menampung record Mahasiswa public static class Mahasiswa { public String nama; public String telepon; } private SQLiteDatabase db; private final Context con; private final OpenHelper dbHelper; public DbMahasiswa (Context c) { con = c; dbHelper = new OpenHelper(con,"",null,0); } public void open() { db = dbHelper.getWritableDatabase(); } public void close() { db.close(); } public long insertMahasiswa(String nama, String noTelp) {
  • 64. versi Mei 2013 64 ContentValues newValues = new ContentValues(); newValues.put("NAMA", nama); newValues.put("TELEPON", noTelp); return db.insert("MAHASISWA", null, newValues); } public Mahasiswa getMahasiswa(String nama) { Cursor cur = null; Mahasiswa M = new Mahasiswa(); //kolom yang diambil String[] cols = new String [] {"ID", "NAMA", "TELEPON"}; //parameter, akan mengganti ? pada NAMA=? String[] param = {nama}; cur = db.query("MAHASISWA",cols,"NAMA=?",param,null,null,null); if (cur.getCount()>0) { //ada data? ambil cur.moveToFirst(); M.nama = cur.getString(1); M.telepon = cur.getString(2); } return M; } } Setelah kita membuat class helper dan class dbMahasiswa, sekarang kita akan memanfaatkan dua kelas tersebut. Kembali ke activity utama yaitu class MainActivity. Tambahkan kode dibagian onCreate sebagai berikut: Selain tipe INTEGER dan TEXT yang digunakan pada contoh diatas, dapat digunakan tipe REAL, BLOB. Semua tipe lain seperti boolean, date harus dimasukkan ke dalam tipe tersebut. SQLite tidak melakukan pengecekan tipe, sehingga bisa saja memasukkan tipe
  • 65. versi Mei 2013 65 Group By, Having, Order By Pada kode sebelumnya dapat dilihat penggunaan db.query untuk mengambil data mahasiswa dengan nama tertentu. Method query menerima tujuh parameter. Parameter pertama adalah nama table, parameter kedua adalah array kolom yang akan diambil (SELECT), parameter ketiga adalah bagian seleksi record (bagian setelah „where‟), parameter keempat adalah isi bagian seleksi. Parameter 5, 6 dan 7 adalah bagian „group by‟, „having‟ dan „order by‟. Contoh penggunaan parameter 5-7 adalah sebagai berikut: jika kita menambahkan field „KELAS‟ pada tabel MAHASISWA dan kita ingin menampilkan jumlah mahasiswa per kelas (contoh misalnya ada kelas A, B, C dst), tapi hanya kelas yang mempunyai anggota >1 dengan kelas terurut descending, maka query-nya adalah sebagai berikut: select kelas, count(*) as jum from mahasiswa group by kelas having jum > 1 order by kelas desc; Maka di dalam program pemanggilan quernya adalah sebagai berikut: RawQuery Selain method query, tersedia juga rawQuery untuk memasukkan langsung query. Sebagai contoh, berikut perbandingan antara query dengan rawQuery group by having order by
  • 66. versi Mei 2013 66 Mana yang lebih baik? beberapa sumber mengatakan query lebih cepat dibandingkan rawQuery dan lebih mudah untuk dibaca. Loop Semua Record Untuk mengambil data semua record, dapat digunakan moveToNext() dalam loop seperti pada contoh berikut alternatif lain yang dapat digunakan untuk loop semua record adalah adalah: Mengisi ListView dengan Record Listview dapat langsung dihubungkan dengan database dan untuk mencegah user interface yang tidak responsif (ANR: Application Not Responding), idealnya data diload di background. Untuk mencapai hal ini dapat digunakan SimpleCursorAdapter, ContentProvider dan Loader. Sayangnya hal ini cukup kompleks (mudah-mudahan akan lebih disederhanakan di API berikutnya). Berikut adalah contoh penggunakan ketiga class tersebut. Pertama buat project baru:
  • 67. versi Mei 2013 67 Seperti dalam contoh sebelumnya, buat class helper yang merupakan turunan dari kelas SQLiteOpenHelper. Catatan: untuk dapat menggunakan cursor adapter, table harus mengandung field _id (dan harus huruf kecil) package edu.upi.cs.yudi.listviewdb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; public class DbHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION =1; private static final String DATABASE_NAME ="dbMhs"; //cursoradapter mewajibkan nama _id //harus _id dengan huruf kecil, JANGAN _ID private static final String TABLE_CREATE = "CREATE TABLE MHS (_id integer primary key autoincrement, " + "nama text);"; public DbHelper(Context context, String name, CursorFactory factory, int version) { super (context,DATABASE_NAME,factory,DATABASE_VERSION); } public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //create database db.execSQL(TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) { //jika database diupgrade, hapus yang lama, buat yang baru db.execSQL("DROP TABLE IF EXISTS MHS");
  • 68. versi Mei 2013 68 onCreate(db); } } Selanjutnya kita akan membuat class Contentprovider untuk mengakses tabel. Class ini merupakan turunan dari ContentProvider (gambar bawah) Untuk tahap pertama hanya insert dan query yang dibuat. Update dan delete akan dibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk widget yang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat di MainActivity nanti. package edu.upi.cs.yudi.listviewdb; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; Catatan: Biasanya Contentprovider dibuat agar data app kita dapat diakses oleh app lain. Tapi class Contentprovider juga dapat digunakan di app sendiri secara private (tidak bisa diakses app lain). Keuntungan content provider adalah: 1. Dapat dieksekusi secara asynchronus, sehingga menghindari error app not responding. 2. Memberikan akses tunggal ke data. 3. Memudahkan hubungan antara view (widget) dengan data melalui ContentObserver milik ContentResolver. 4. Dimanfaatkan untuk rest client app. Kerugian menggunakan contentprovider? relatif rumit.
  • 69. versi Mei 2013 69 public class MhsContentProvider extends ContentProvider { // database private DbHelper database; // konstanta2 dibawah mendefinisikan bagaimana contentprovider ini diakses // contentprovider diakses melalui URI // contoh penggunaa URI ini dapat dilihat di MainActivity private static final int MHS = 1; private static final int MHS_ID = 2; private static final String AUTHORITY = "edu.upi.cs.yudi.listviewdb.contentprovider"; private static final String BASE_PATH = "mhs"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI(AUTHORITY, BASE_PATH, MHS); sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", MHS_ID); } @Override public Uri insert(Uri uri, ContentValues values) { //insert data int uriType = sURIMatcher.match(uri); SQLiteDatabase sqlDB = database.getWritableDatabase(); long id = 0; switch (uriType) { case MHS: id = sqlDB.insert("MHS", null, values); break; default: throw new IllegalArgumentException("URI tdk dikenal: " + uri); } //notifikasi getContext().getContentResolver().notifyChange(uri, null); return Uri.parse(BASE_PATH + "/" + id); } @Override public boolean onCreate() { database = new DbHelper(getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) { //query tabel SQLiteDatabase db = database.getWritableDatabase(); Cursor cur=null; int uriType = sURIMatcher.match(uri); switch (uriType) { case MHS: //ambil semua cur = db.query("MHS",projection,selection,selectionArgs,sortOrder,null,null); break; case MHS_ID: // ambil berdasarkan id … nanti dibuat break; default:
  • 70. versi Mei 2013 70 throw new IllegalArgumentException("URI tidak dikenal: " + uri); } //notifikasi cur.setNotificationUri(getContext().getContentResolver(), uri); return cur; } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { // nanti dibuat return 0; } @Override public int delete(Uri arg0, String arg1, String[] arg2) { // nanti dibuat return 0; } @Override public String getType(Uri arg0) { // nanti dibuat return null; } } Content provider ini harus didaftarkan di AndroidManifest. Buka dan tambahkan di dalam <application>. android:exported=”false” menunjukkan bahwa content provider ini private dan tidak dapat diakses app lain. Sedangkan android:name adalah nama kelas, penggunaan titik pada “.MhsContentProvider” merupakan singkatan dari nama app. Jadi “.MhsContentProvider” artinya sama dengan “edu.upi.cs.yudi.listviewdb.MhsContentProvider” <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="edu.upi.cs.yudi.listviewdb.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:exported="false" android:name=".MhsContentProvider" android:authorities="edu.upi.cs.yudi.listviewdb.contentprovider" > </provider> </application>
  • 71. versi Mei 2013 71 Setelah Helper dan ContentProvider dibuat, selanjutnya kita akan mempersiapkan ListView. Caranya seperti ListView pada contoh sebelumnya. Buka layout/activity_main.xml, drag listview. Selanjutnya buat xml layout baru sebagai isi dari baris di listview (pilih layout, klik kanan  new  Android XML ) Beri nama row.xml, dan tambahkan dua textview. Ganti namanya dengan tvNama dan tvId. Selanjutnya kita akan melengkapi ActivityMain.java. Activity ini mengimplemen LoaderCallback sehingga data akan diload dibackground dan baru diisi ke ListView saat sudah selesai. Pada activity ini akan diinsert dua record kemudian ditampilkan dalam listview. package edu.upi.cs.yudi.listviewdb; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.content.ContentValues; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.app.LoaderManager; //implementes LoaderManager public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> { //adapter untuk listview private SimpleCursorAdapter adapter; private void insertData() {
  • 72. versi Mei 2013 72 //masukkan dua data untuk testing ContentValues values = new ContentValues(); values.put("nama", "rudi"); //perhatikan penggunaan URI untuk mengidentifikasi contentprovider //isi dari MhsContentProvider.CONTENT_URI adalah: // content://edu.upi.cs.yudi.listviewdb.contentprovider/mhs getContentResolver().insert(MhsContentProvider.CONTENT_URI, values); values = new ContentValues(); values.put("nama", "budi"); getContentResolver().insert(MhsContentProvider.CONTENT_URI, values); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.listView1); //testing insert data. Setelah dijalankan sekali, bisa dikomentari insertData(); //harus _id dengan huruf kecil! String[] proj = new String[] { "_id","nama"}; // widget UI yang dipetakan sesuai field diatas (di row.xml) int[] to = new int[] { R.id.tvId, R.id.tvNama }; getLoaderManager().initLoader(0, null, this); //adapter yang digunakan adalah simplecursoradapter adapter = new SimpleCursorAdapter(this, R.layout.row, null, proj,to, 0); lv.setAdapter(adapter); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { //load data ke cursor //harus ada _id dengan huruf kecil! String[] projection = { "_id", "nama" }; CursorLoader cursorLoader = new CursorLoader(this, MhsContentProvider.CONTENT_URI, projection, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cur) { //dipanggil saat cursor sudah terisi, dilakukan //dibackground sehingga user interface tetap responsif //isi adapter dengan cursor yang sudah terisi adapter.swapCursor(cur); } @Override public void onLoaderReset(Loader<Cursor> loader) { //reset, kosongkan adapter.swapCursor(null); } }
  • 73. versi Mei 2013 73 Latihan SQLite1: Buat applikasi untuk menyimpan datamahasiswa (NIM, NAMA, ALAMAT). Buatlah menu untuk menambahkan data dan mencari berdasarkan NIM (NIM diinput oleh user). Latihan SQLite2: Modifikasi latihan activity-intent agar dapat menyimpan ke database. File [cek untuk Android versi >=3.0?] File dapat disimpan baik di dalam device maupun di media penyimpanan (SD card). Secara default, aplikasi tidak dapat mengakses file milik aplikasi lain. Bagi anda yang telah mengenal stream dan file di Java, anda dapat membaca secara cepat bagian ini, karena tidak ada perbedaan antara Java dan Android. Class yang mensupport operasi file disediakan di package java.io.* Stream Pemrosesan file dalam jumlah besar, yang membutuhkan kinerja yang tinggi masih dibutuhkan berbagai bidang. Misalnya aplikasi backend yang mengelola dokumen di perusahaan, aplikasi pengolahan teks, aplikasi pemroses XML, HTML, aplikasi simulasi-simulasi dan sebagainya. Penguasaan stream dan file akan membantu anda untuk memecahkan berbagai masalah Stream adalah aliran data. Bayangkan stream sebagai sungai yang mengalirkan air. Seperti sungai, stream mengalirkan byte-byte data. Pemrosesan input dan output di Java pada prinsipnya menggunakan konsep stream ini. Gambar 1: Input Stream (diambil dari http://download.oracle.com/javase/tutorial)
  • 74. versi Mei 2013 74 Gambar 1: Output Stream (diambil dari http://download.oracle.com/javase/tutorial) Untuk membantu programmer, tersedia banyak class-class untuk memproses stream, bahkan lebih dari 60 kelas! (lihat gambar 3 dan gambar 4). Tentu saja tidak semua kelas tersebut harus digunakan, programmer bisa memilih kelas mana yang dibutuhkan untuk menyelesaikan masalahnya. Persiapan Sebelum memulai, pastikan emulator sudah memiliki SD-Card (Start All Program  Android SDK Tools) Lalu untuk setiap project yang akan mengakses ke SD Card, tambahkan ijin untuk menulis ke media penyimpanan external di AndroidManifest.xml
  • 75. versi Mei 2013 75 File Teks Sebelum mulai, pastikan virtual device telah diset SD-Card dan AndroidManifest telah ditambahkan ijin untuk menulis (baca bagian persiapan) File teks penting untuk menulis data, XML, HTML dan sebagainya. File teks dianggap sebagai stream dari karakter. Untuk menulis ke file teks, cara yang paling mudah adalah dengan menggunakan class PrintWriter. Berikut adalah contoh program yang menulis dua baris ke file teks. Sedangkan untuk membaca, dapat digunakan class Scanner yang dapat membaca baris demi baris. Berikut contoh codenya, letakkan di bawah code atas.
  • 76. versi Mei 2013 76 Objek Stream Java telah menyediakan fasilitas agar objek dapat disimpan ke dalam stream secara otomatis dengan mudah. Class yang digunakan adalah ObjectOutputStream dan ObjectInputStream. Setelah membuat project baru (pastikan AndroidManifest.xml-nya telah ditambahkan ijin menulis ke external!) Sekarang coba kita buat class Mahasiswa sebagai berikut. Tambah class baru (Filenewclass). Perhatikan penggunaan interface java.io.Serializable yang menandakan bahwa class ini dalam disimpan ke dalam stream Latihan: buat file teks berisi <html> <body> Halo </body> </html>
  • 77. versi Mei 2013 77 Codenya sebagai berikut. Perhatikan variabel serialVersionUID untuk menyatakan versi class. Jangan lupa class Mahasiswa ini mengimplementas interface Serializable. Selanjutnya, buat program untuk menulis dua objek mahasiswa ke dalam class. Penulisan objek ke stream sangat mudah, hanya dengan class ObjectOutputStream dan method writeObject. Buatlah code ini di activity Main.
  • 78. versi Mei 2013 78 Sekarang kita lanjutkan ke pembacaan objek yang telah dituliskan. Untuk membaca file berisi objek digunakan class FileInputStream dan ObjectInputStream; Catatan: Perhatikan penggunaan code ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(namaFileOutput)); Pada code diatas Objek FileOuputStream „dibungkus‟ dengan ObjekOutputStream. Ini yang disebut dengan stream layering, yaitu penggunaan kombinasi beberapa class yang memproses stream. Contoh yang lain: pbin = new PushbackInputStream( new BufferedInputStream(new FileInputStream("pegawai.dat")))); Walaupun pada awalnya teknik layering stream ini terlihat sulit, tapi teknik ini sangat bermanfaat untuk mengkombinasikan berbagai fitur yang dibutuhkan.
  • 79. versi Mei 2013 79 Grafik 2D Menggambar di Canvas Dalam contoh pertama kita akan menggunakan Canvas, Paint, Path dan Color untuk menggambar kotak. Koordinat canvas 0,0 berada di kiri atas. Makin ke kanan nilai x semakin besar dan makin kebawah nilai y semakin besar. Setelah membuat project baru, buatlah class yang bernama GraphicsView yang merupakan turunan class View. package com.example.cobagraphicview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.view.View; public class GraphicView extends View { private RectF kotak = new RectF(100,100,200,200); Paint cat= new Paint(); Latihan: Buatlah class User dengan atribut username dan password. Simpan data objek user (minimal 3 user) ke dalam Android menggunakan file teks dan file objek.
  • 80. versi Mei 2013 80 public GraphicView(Context context) { super(context); } protected void onDraw(Canvas c) { cat.setColor(Color.GREEN); c.drawRect(kotak,cat); } } Lalu di-activity utama, tambahkan kode berikut yang men-set contentview dengan class GraphicView. Hasilnya akan seperti ini Canvas, sesuai namanya adalah tempat untuk menggambar bentuk 2D. Dengan canvas, kita dapat menggambar bentuk (lingkaran, kotak, garis, titik), menggambar text dan melakukan operasi translate, scale, rotate. Paint digunakan untuk menyimpan style, warna dan informasi lainnya yang dibutuhkan untuk menggambar. Class Color digunakan untuk merepresentasikan warna. Android menggunakan 4 angka untuk alpha, red, green dan blue (RGB) dengan masing-masing rentang nilai 0 sd 255. Alpha digunakan menyatakan transparansi: alpha 0 artinya transparan 100% . Pada code diatas, kita menggunakan color constant (Color.GREEN). Coba ganti baris tersebut menjadi, silahkan berkesperimen dengan alpha yang lebih kecil.
  • 81. versi Mei 2013 81 cat.setColor(Color.argb(75, 255, 0, 0)); //alphpa,reg,gree,blue Sekarang kita coba fungsi-fungsi lain pada canvas, tambahkan code berikut dalam class Graphicsview package com.example.cobagraphicview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Paint.Style; import android.view.View; public class GraphicView extends View { private RectF kotak = new RectF(100,150,200,200); //x1,y1,x2,y2 private RectF kotak2 = new RectF(200,25,300,75); private RectF kotak3 = new RectF(300,300,400,400); private RectF oval = new RectF(100,200,200,300); //oval akan mengikut rect ini private RectF oval2 = new RectF(100,300,200,400); private Paint cat= new Paint(); public GraphicView(Context context) { super(context); } protected void onDraw(Canvas c) { //gambar kotak cat.setColor(Color.argb(75, 255, 0, 0)); //alpha,red,green,blue c.drawRect(kotak,cat); //gambar lingkarang biru cat.setColor(Color.BLUE); c.drawCircle(50, 50, 30, cat); //x,y,radius //gambar kotak dengan ujung membulat c.drawRoundRect(kotak2, 10, 10, cat); //lokasikotak,x-radius oval, y radius oval //gambar mulai dari posisi 45 derajat sebanyak 90 derajat searah jarum jam //lengkungan akan mengikuti rect oval //paramater ke 4 jika true garis penutup melewati titik pusat //memberikan efek spt pizza yang dipotong. c.drawArc(oval, 45, 90, true,cat); cat.setColor(Color.RED); //jika parameter ke-4 false maka garis akan melewati //ujung ke ujung tanpa harus ke titik pusat //menyebabkan efek spt lingkarang dipotong2 mendatar c.drawArc(oval2, 45, 90, false,cat); //gambar garis c.drawLine(50,500,400,500,cat); //x1,y1,x2,y2 //gambar kotak kosong cat.setColor(Color.GREEN); cat.setStyle(Style.STROKE); cat.setStrokeWidth(5); c.drawRect(kotak3,cat); //gambar titik cat.setColor(Color.BLACK); for (int i=0;i<10;i++) {
  • 82. versi Mei 2013 82 c.drawPoint( (float) Math.random()*500, (float)Math.random()*500, cat); } } Hasilnya akan seperti berikut: } Menulis Teks di Canvas Method drawText dapat digunakan untuk menambahkan teks di canvas, sedangkan Path dan drawTextOnPath dapat digunakan untuk menggambar teks yang mengikuti jalur tertentu. Untuk jelasnya, tambahkan code dibawah pada project sebelumnya. Akan ditampilkan tulisan berwarna merah dan tulisan italic cat.setColor(Color.RED); //diisi dalam maupun outline cat.setStyle(Style.FILL_AND_STROKE); cat.setStrokeWidth(2); cat.setTextSize(35); c.drawText("Hello World", 10, 500, cat); //teks serif dan italic cat.setTypeface(Typeface.create(Typeface.SERIF,Typeface.ITALIC)); c.drawText("ini serif italic", 10, 550, cat); Selanjutnya kita akan membuat lingkarang yang mengikuti suatu jalur menggunakan class Path. Deklarasikan satu objek ini di luar onDraw: Dianjurkan untuk membuat objek diluar method onDraw karena onDraw dapat dipanggil berulang-ulang.
  • 83. versi Mei 2013 83 Selanjutnya tambahkan kode berikut, kode ini akan membuat dua tulisan dengan path berbeda. path1.moveTo(10,85); path1.lineTo(250,150); path1.lineTo(350,300); cat.setTextSize(25); //0,0 artinya tidak ada jarak antara tulisan dgn path (offset) c.drawTextOnPath("tulisan ini mengikuti path", path1, 0, 0, cat); // gambar tulisan melingkar //kosongkan path path1.reset(); //x,y,radius dan berlawan jarumjam (CCW) path1.addCircle(250, 250, 50, Path.Direction.CCW); c.drawTextOnPath("ini mengikuti lingkaran", path1, 0, 0, cat); Hasilnya akan seperti ini: Penting: Perhatikan bahwa layar Android memiliki resolusi berbeda-beda. Sebagai contoh, 100 point di layar dengan resolusi tinggi akan memiliki panjang berbeda dengan layar resolusi rendah. Gunakan Canvas.getWidth() dan Canvas.getHeight untuk menghitung panjang objek yang diinginkan. Misalnya jika kita ingin membuat garis sepanjang setengah layar, gunakan ukuran getWidth() / 2 sehingga pada resolusi apapun, garis akan selalu sepanjang setengah layar.
  • 84. versi Mei 2013 84 Kode berikut akan menambahkan kotak yang mengikuti ukuran layar yang memanfaatkan class Path. int lebar = c.getWidth(); int tinggi = c.getHeight(); int offset=20; //memberikan efek frame cat.setColor(Color.RED); cat.setStyle(Style.STROKE); cat.setStrokeWidth(10); //menggunakan path, bisa juga dengan drawRect path1.reset(); path1.moveTo(0+offset, 0+offset); //kiri atas path1.lineTo(lebar-offset, 0+offset); //kanan atas path1.lineTo(lebar-offset, tinggi-offset); //kanan bawah path1.lineTo(0+offset, tinggi-offset); //kiri bawah path1.lineTo(0+offset, 0+offset); //kembali ke kiri atas c.drawPath(path1, cat); Event Touch Selenjutnya kita akan membuat app yang akan menggambar kotak ditempat pengguna menyentuh layar. Buat project baru dan tambahkan class baru turunan dari class View, beri nama GraphicsView. Berikut adalah isi kelas tersebut yang membersihkan layar dan kemudian menggambar kotak pada koordinat sentuhan jari. package com.example.cobatouch; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class GraphicsView extends View { //posisi sentuh public float posX=-1; Latihan: Buatlah gambar rumah seperti ini, tambahkan warna dan modifikasi sesuai yang anda inginkan
  • 85. versi Mei 2013 85 public float posY=-1; private int offset=25; private Paint cat = new Paint(); public GraphicsView(Context context) { super(context); } @Override protected void onDraw(Canvas c) { //clear screen cat.setColor(Color.BLACK); c.drawRect(0,0,c.getWidth(),c.getHeight(),cat); //gambar kotak diposisi yang disentuh if (posX!=-1) { cat.setColor(Color.YELLOW); c.drawRect(posX-offset,posY-offset,posX+offset,posY+offset,cat); } } } Sedangkan code untuk MainActivity adalah sebagai berikut. MainActivity mengimplements onTouchListener package com.example.cobatouch; import android.os.Bundle; import android.app.Activity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class MainActivity extends Activity implements OnTouchListener{ private GraphicsView gv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gv= new GraphicsView( this); //set listener agar saat graphicview ditouch //maka onTouch di kelas ini akan dipanggil gv.setOnTouchListener(this); setContentView(gv); } @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: //jari menyentuh layar //passing posisi ke graphicsview gv.posX = event.getX(); gv.posY = event.getY(); gv.invalidate(); //draw ulang break; case MotionEvent.ACTION_MOVE: //bergerak break; case MotionEvent.ACTION_UP: //diangkat break;
  • 86. versi Mei 2013 86 case MotionEvent.ACTION_CANCEL: //batal break; default: break; } return true; } } Load Image di Canvas Jika kita ingin meload image (jpg,png) ke dalam canvas, maka file gambar tersebut perlu dimasukkan ke dalam /res/drawable (hdpi,xhdpi dst), baca kembali pembahasan icon dalam Actionbar. Dalam contoh berikut digunakan gambar ic_launcher yang sudah tersedia. Buat class baru bernama GraphicsView turunan dari View: package com.example.cobaloadbitmap; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.view.View; public class GraphicsView extends View { public Bitmap bmpGambar; private Paint cat; public GraphicsView(Context context) { super(context); } protected void onDraw(Canvas c) { c.drawBitmap(bmpGambar,50,50,cat); } } Latihan: Buat app yang menampilkan gambar tank (atau tentara) mush secara random. Pengguna harus mentouch lokasi tank tersebut, dan jika tepat maka tank akan hilang.
  • 87. versi Mei 2013 87 Sedangkan code mainActivity adalah sebagai berikut: package com.example.cobaloadbitmap; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GraphicsView gv = new GraphicsView(this); //load bitmap Resources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher); gv.bmpGambar = bmp; setContentView(gv); } } Hasilnya akan muncul seperti ini TBD: ubah ukuran image “drawable-nodpi” Animasi di Canvas Animasi di canvas cocok digunakan untuk game sederhana seperti game berjenis puzzle yang melibatkan sedikit objek dan tidak memperlukan animasi berat. Canvas juga lebih sederhana dibandingkan dengan OpenGL Animasi dapat dilakukan dengan membersihkan layar dan menggambar objek di tempat yang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek dan jeda antar
  • 88. versi Mei 2013 88 frame. Asyntask melakukan proses dibackground, sehingga app tidak terkunci dan tetap responsif. Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView yang merupakan turunan View seperti pada contoh sebelumnya. Class ini akan membersihkan layar dan menggambar image sesuai posisi. package com.example.cobaanimasibmp; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class GraphicsView extends View{ //posisi bola public float posX=0; public float posY=0; public Bitmap bmpGambar; private Paint cat = new Paint(); public GraphicsView(Context context) { super(context); } @Override protected void onDraw(Canvas c) { //clear screen c.drawColor(Color.WHITE); //gambar bitmap c.drawBitmap(bmpGambar,posX,posY,cat); } } Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask. Kelas ini berperan untuk mengatur posisi objek dan memerintahkan agar canvas didraw ulang setiap posisi berubah. package com.example.cobaanimasibmp; import android.os.AsyncTask; import android.util.Log; public class AnimasiTask extends AsyncTask <Void, Void, Void> { public GraphicsView gv; //tempat animasi digambar @Override protected Void doInBackground(Void... arg0) { // method ini dijalankan di background secara asynchronous for (int i=10;i<600;i=i+20) { //bergerak diagonal gv.posX=i;
  • 89. versi Mei 2013 89 gv.posY=i; //publisgProgress adalah method standard di Asyntask //dipanggil pada saat loop untuk memberikan kesempatan //UI untuk mendraw //contohnya untuk mendraw progressBar //tapi dalam app ini digunakan untuk mendraw image //diposisi baru publishProgress(); //tidur 0.2 detik, agar animasi tdk terlalu cepat try { Thread.sleep((long)(1000*0.2)); } catch (InterruptedException e) { e.printStackTrace(); Log.e("yw","error saat mencoba sleep"+e.getMessage()); } } return null; } @Override protected void onProgressUpdate(Void... progress) { gv.postInvalidate(); //refresh canvas agar menggambar image di posisi baru } } Terakhir, di-activity utama tambahkan code berikut: package com.example.cobaanimasibmp; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Menu; public class MainActivity extends Activity { private GraphicsView gv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gv= new GraphicsView( this); Resources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher); gv.bmpGambar = bmp; setContentView(gv); AnimasiTask at = new AnimasiTask(); at.gv = gv; at.execute(); //jalankan animasi secara async dan dibackground } }
  • 90. versi Mei 2013 90 Sensor Android mendukung berbagai sensor, mulai dari yang umum tersedia seperti accelerometer, magnetometer, GPS sampai barometer, termometer dan pengukur kelembaban. Accelerometer Accelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahan kecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat bahwa benda yang jatuh mengalami percepatan) maupun perubahan dinamik seperti saat device bergerak atau bergetar. Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device. Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah mana benda bergerak dan secepat apa. Penggunaan accelerometer di smartphone/tablet yang paling umum adalah mendeteksi posisi portrait dan landscape. Selain itu telah ada app yang memanfaatkan accelerometer untuk menghitung kecepatan dan jarak lari, membunyikan alarm jika device dipindahkan, game dan sebagainya. Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini mengukur perubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah). Satuannya adalah m/det^2. Gaya gravitasi selalu mempengaruhi. Sehingga jika device diletakkan diam, nilai sumbu z tetap terbaca sekitar 9.8m/det^2. Latihan: Buatlah game sederhana memukul serangga di layar. Program menampilkan serangga di layar yang bergerak, jika pengguna „memukulnya‟ dengan jari, maka pengguna mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misal kotak berubah warna).
  • 91. versi Mei 2013 91 Diambil dari: http://developer.android.com/reference/android/hardware/SensorEvent.html Untuk menggunakan sensor di Android, class yang harus digunakan adalah SensorManager untuk mengetahui apakah device mensupport sensor yang kita inginkan. Kemudian class Sensor untuk mendapatkan data dari sensor dan interface SensorEventListener yang diimplement oleh activity. Buat project baru, tambahkan kode berikut di MainActivity.
  • 92. versi Mei 2013 92 import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mSensor; private TextView tvHasil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvHasil = (TextView) findViewById(R.id.textView1); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ //device memiliki accelerometer,lanjutkan mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } else { //tidak punya sensor accelerometer, tampilkan pesan error } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // kalau akurasi berubah } @Override public void onSensorChanged(SensorEvent event) { double ax=0,ay=0,az=0; // menangkap perubahan nilai sensor //if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){ if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) { ax=event.values[0]; ay=event.values[1]; az=event.values[2]; } //ax,ay,az bisa digunakan tvHasil.setText("x:"+ax+" y:"+ay+" z:"+az); } @Override protected void onPause() { //app kehilangan fokus (misal user menerima telp), lepaskan sensor super.onPause(); mSensorManager.unregisterListener(this); } @Override protected void onResume() { //app kembali super.onResume(); mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); //SENSOR_DELAY_NORMAL:sampling setiap 200,000 microseconds
  • 93. versi Mei 2013 93 //SENSOR_DELAY_GAME: 20,000 microsecond //SENSOR_DELAY_UI: 60,000 microsecond //SENSOR_DELAY_FASTEST: 0 microsecond } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Masalahnya adalah AVD tidak mensupport accelerometer sehingga saat app harus dijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan atau manual melalui APK. Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet dengan komputer melalui kabel USB. Pastikan USB driver telah terinstall. Untuk jenis Nexus, usb driver dapat diinstall melalui SDK manager (Extra  Google USB Driver). Kemudian klik kanan project  Run As  Run Configuration Pilih tab target, lalu pilih launch on all … dengan “Active Devices” Kemudian pada device, jalankan USB Debugging dengan pilihan Setting Developer Options  USB Debugging.