Your SlideShare is downloading. ×

Modul android

7,732
views

Published on

Modul/Tutorial untuk praktikum Android, berbahasa Indonesia, berlisensi creative commons.

Modul/Tutorial untuk praktikum Android, berbahasa Indonesia, berlisensi creative commons.

Published in: Technology

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,732
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1,219
Comments
0
Likes
6
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. versi Mei 2013 1Pengantar Mobile Programming dengan AndroidYudi Wibisono (yudi@upi.edu)Ilmu Komputer, Universitas Pendidikan Indonesia (http://cs.upi.edu)versi (BETA): 22 Mei 2013Periksa versi terakhir di: http://yuliadi.com/ilkomhttp://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 yangsama.Pengantar Modul................................................................................................................. 3Sekilas Android................................................................................................................... 3Fitur-fitur............................................................................................................................. 3Perbedaan dengan Aplikasi Desktop .................................................................................. 4Instalasi SDK (Windows) .................................................................................................. 4Aplikasi Pertama: Hello World........................................................................................... 7Aplikasi Kedua: Hello XXX............................................................................................. 10Widget............................................................................................................................... 15Text View...................................................................................................................... 16Button............................................................................................................................ 16ImageButton dan ImageView ....................................................................................... 17EditText......................................................................................................................... 19CheckBox...................................................................................................................... 19RadioButton.................................................................................................................. 22ListView........................................................................................................................ 23Composite ListView ................................................................................................. 25Penanganan Click pada ListView ............................................................................. 30Dialog................................................................................................................................ 31Toast.............................................................................................................................. 31AlertDialog ................................................................................................................... 31Logging............................................................................................................................. 32Activity dan Intent ............................................................................................................ 34Pertukaran Data antar Activity...................................................................................... 37Mengirimkan data ke activity ................................................................................... 37Menerima data dari actvity yang dipanggil .............................................................. 38Activity Life Cycle ....................................................................................................... 40
  • 2. versi Mei 2013 2Simpan dan Load Activity State ............................................................................... 42Layout Manager................................................................................................................ 45RelativeLayout.............................................................................................................. 45TableLayout .................................................................................................................. 47Frame Layout................................................................................................................ 50LinearLayout................................................................................................................. 51ScrollView .................................................................................................................... 52Kombinasi Layout......................................................................................................... 54ActionBar.......................................................................................................................... 55ActionItem .................................................................................................................... 56String Resources ........................................................................................................... 57Icon ............................................................................................................................... 58Menyimpan Data............................................................................................................... 60Shared Preferences........................................................................................................ 60SQLite........................................................................................................................... 62Group By, Having, Order By.................................................................................... 65RawQuery ................................................................................................................. 65Loop Semua Record.................................................................................................. 66Mengisi ListView dengan Record ............................................................................ 66File .................................................................................................................................... 73Stream ....................................................................................................................... 73Persiapan................................................................................................................... 74File Teks.................................................................................................................... 75Objek Stream ............................................................................................................ 76Grafik 2D .......................................................................................................................... 79Menggambar di Canvas ................................................................................................ 79Menulis Teks di Canvas................................................................................................ 82Event Touch.................................................................................................................. 84Load Image di Canvas .................................................................................................. 86Animasi di Canvas........................................................................................................ 87Sensor................................................................................................................................ 90Accelerometer............................................................................................................... 90Orientasi: Yaw (Azimuth), Pitch & Roll ...................................................................... 94Location API................................................................................................................. 97Koneksi dengan Server ................................................................................................... 102Google Map .................................................................................................................... 104Zoom........................................................................................................................... 106Ubah Posisi ................................................................................................................. 106Menambahkan Layer .................................................................................................. 107TAMBAHAN DAN PERBAIKAN MODUL BERIKUTNYA: .................................... 109
  • 3. versi Mei 2013 3Pengantar ModulModul praktikum ini dibuat untuk mendukung praktikum matakuliah MobileProgramming 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. Referensipaling lengkap dan terbaru dapat dilihat di: http://developer.android.comSebaiknya modul ini dibaca dan dicoba secara berurutan, terutama bagi pemula. Adabeberapa latihan di akhir materi yang sangat dianjurkan untuk dibuat. Latihan inimengukur sejauh mana anda telah memahami materi. Bagi dosen, idealnya memberikansatu atau dua tugas besar (tiap tugas dikerjakan sekitar 2 bulan) yang dibuat untukmengaplikasikan dan mengintegrasikan keseluruhan materi.Sebelum mulai, silahkan buka situs http://yuliadi.com/ilkom untuk memeriksa apakahada update untuk modul ini.Sekilas AndroidAndroid adalah software platform yang open source untuk mobile device. Android berisisistem operasi, middleware dan aplikasi-aplikasi dasar. Basis OS Android adalah kernelLinux 2.6 yang telah dimodifikasi untuk mobile device.Android versi 1.0 dikeluarkan tanggal 23 September 2008. Versi 1.1 adalah versi yangpertama 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 V8JavaScript engine, Wi-Fi hotspot tethering dan suppport Adobe Flash.2.3 (Gingerbread), memperbaiki user interface, soft keyboard, copy/paste featuresdan 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. Integrasiantara 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 yangdigunakan di Android setara dengan J2SE, dan ini merupakan kelebihan utama Android.Fitur-fiturFitur-fitur utama Android yang dapat dimanfaatkan oleh pengembang app sebagaiberikut:Database dengan SQLite.
  • 4. versi Mei 2013 4Menulis dan membaca file di SD card.Integrated browser berbasis WebKit engine2D graphics library; dan OpenGL ES 2.0 untuk 3D graphicsLokasi dan sensor: GPS, compass, gyroscope, barometer, light sensor,accelerometer.Renderscript untuk pemrosesan paralel memanfaatakan CPU dan GPUKamera, Audio capture, Jetplayer, Media support untuk MPEG4, H.264, MP3,AAC, AMR, JPG, PNG, GIFGSM Telephony: fasilitas telepon dan SMS.Connectivity: USB, Bluetooth, NFC, SIP (Session Initiation Protocol, internettelephony khusunya untuk video conference dan instant messaging) dan WiFiMultitouchPerbedaan dengan Aplikasi DesktopWalaupun Java yang digunakan untuk mengembangkan Android app setara dengan J2SEada beberapa berbedaan app Android vs app Desktop yang perlu diperhatikan:Beragamnya ukuran layar dan resolusi.Karakteristik device yang memiliki banyak sensor (kamera, GPS, accelometerdsb), terhubung ke internet dan selalu dibawa pengguna membuat app Androidpunya potensi di bidang baru.Walaupun saat ini prosesor device sudah powerfull, tetapi kemampuan batere danmemori tetap menjadi masalah. Komputasi berat, terutama yang berjalan dibackground 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 (IntegratedDevelopment Environment) dapat dipilih Eclipse, Netbeans atau bahkan langsungdengan command line dan notepad. Tapi saat ini telah tersedia instalasi untuk Windowsyang telah menyediakan semua komponen yang dibutuhkan (ADT Bundle for Windows).Download ADT Bundle ini, dan setelah selesai ekstrak ke tempat yang anda inginkan danlangsung dapat dijalankan karena tidak ada proses instalasi.Salah satu file hasil ekstrak dari ADT Bundle adalah “SDK Manager.exe”, jalankan fileini. Dapat dilihat bahwa versi default API yang terinstall adalah 4.2.2 (API17). Jika andaterkoneksi dengan internet, anda dapat download API versi lain yang dibutuhkan.Selanjutnya kita perlu membuat emulator smartphone android (AVD: Android VirtualDevice). Program yang akan kita buat dikomputer akan dijalankan di emulator ini.
  • 5. versi Mei 2013 5Masih pada SDK Manager, Pilih ToolsManage AVDs. Akan muncul dialog berisidaftar AVD kemudian klik “New”Kita akan buat AVD versi 4.2. (JellyBean) Isi nama, device dan targetLalu isi RAM dengan ukuran kecil terlebih dulu, dan centang “Use Host GPU” (jikakomputer 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 secangkirkopi dan silahkan tunggu sampai layar berikut muncul (jika yang muncul masih tulisan
  • 6. versi Mei 2013 6Android berkelap-kelip, tunggu). Setelah emulator dijalankan, sebaiknya jangan ditutuplagi untuk menghemat waktu.Terutama bagi yang belum memiliki Android, Anda dapat gunakan emulator ini untukmengeksplorasi 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 memilihdirektori tempat source akan diletakkan, lalu akan tampil window welcome sepertigambar dibawah. Close window ini selanjutnya anda siap membuat program pertama.Tip: Jika anda menggunaka prosesor Intel, ada cara untuk mempercepat emulatorAndroid, 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 7Aplikasi Pertama: Hello WorldSesuai tradisi programmer, langkah pertama saat mencoba suatu platform adalahmembuat 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 (dalamurutan yang dibalik), ditambah dengan nama applikasi. Misalkan nama websiteorganisasi 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 API11Android 3.0 (HoneyComb) karena versi ini telah mendukung ActionBar.Selanjutnya pilih next sampai untuk activity pilih “BlankActiviy” dan Next.
  • 8. versi Mei 2013 8Terakhir, 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 dalamformat XML. Dalam project ini secara otomatis dibuat activity_main.xmlPertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untukmengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml untuk melihatformat XML-nya. Komponen user interface dalam Android didefinisikan didalam XML.Jadi anda dapat mengubah elemen tampilan dengan dua cara: melalui graphical layoutatau langsung mengedit file xml-nya.Sekarang coba buka source code. Lihat package explorer, buka src, package dan klikMainActivity.java
  • 9. versi Mei 2013 9Dapat dilihat source code yang dibangkitkan ADTJalankan project dengan mengklik icon run (gambar bawah) atau ctrl-F11 dan pilihAndroid 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 10Selamat! Anda telah menjalankan app pertama anda. Jangan tutup emulator ini, Eclipseselanjutnya akan menggunakan emulator yang sudah terbuka ini sehingga tidak perlumenjalankan yang baru.Aplikasi Kedua: Hello XXXSelanjutnya kita akan memodifikasi program ini dan menambahkan masukan nama dariuser, lalu setelah user menekan tombol, akan keluar “Hello, [nama]. Terimakasih”Pertama, melalui project explorer kembali pilih activity_main.xml yang berada dires/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 dalamform.
  • 11. versi Mei 2013 11Lalu 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, jangantutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang kitaakan menambahkan aksi yang akan dijalankan saat button diklik.Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa yangdiketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap komponen perludiberi nama.Kembali ke activity_main.xml. Klik Button kemudian lihat window properties yangberada di sebelah kanan, ganti Text dengan “Sapa” dan id dengan “bSapa”
  • 12. versi Mei 2013 12Saat id diganti maka ada pesan untuk mengupdate semua kemunculan id, jawab inidengan “Yes”. Kemudian muncul window “Rename Resource” dan jawab ini jugadengan OK. Cara ini akan membuat semua kemunculan id ini di activity_main akanotomatis diganti. Ini akan lebih mudah dibandingkan harus mengganti secara manual filexml.Lakukan hal yang sama untuk textfield, ganti id dengan etNamadan textview, ganti id dengan tvSalam.Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihanmengganti nama id menggunakan property.
  • 13. versi Mei 2013 13Tip: untuk merapikan XML tekan ctrl-shift-F.Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan akandipanggil. Set atribut android.onClik pada button dengan nama method yang akanmenangani event tersebut (bSapaClick).Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java (didirektori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak terupdatejika file xml tidak di-save secara eksplisit.Sekarang kita perlu menambahkan code agar saat tombol diklik app akan mengeluarkanrespon.Melalui package explorer, kembali ke activity utama (MainActivity.java).Kemudian buat satu method baru bSapaClick. Pastikan nama method sama denganyang dicantumkan di activity_main.XML. Nama yang tidak sama akan menyebakanerror saat program dijalankan.
  • 14. versi Mei 2013 14Tambahkan impor class yang dibutuhkan. Salah satu cara yang paling mudah adalahdengan 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, bukakembali activity_main.xml lalu tekan ctrl-S (save)Jalankan program (ctrl-F11), perhatikan tab Console di bagian bawah untuk memonitorproses emulasi. Isi teks dan tekan tombol.Cara ini paling sederhana, tetapi programmer harus memastikan nama method pada XMLsama dengan nama method di program. Jika nama method tidak sama, tidak akan munculkesalahan pada saat program dicompile, tapi akan menyebabkan kesalahan pada saat
  • 15. versi Mei 2013 15runtime (saat button diklik). Alternatif lain adalah dengan menggunakan listener seperticode dibawah.Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu tergantungdari selera programmer dan standard code yang digunakan.WidgetPada modul sebelumnya kita telah menggunakan input box, button dan label. Komponenuser 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 adalahpanjang 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 bertipedouble harus dikonversi terlebih dulu menjadi teks. GunakanString.valueOf(dblLuas) untuk mengkoversi double menjadi teks.
  • 16. versi Mei 2013 16Setiap widget memiliki property atau atribut yang mengatur bagaimana widget ituditampilkan, 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 (scrollsedikit ke bawah, di bagian classes)Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project baru.Text ViewTextView digunakan untuk menampilkan label teks. View ini sudah kita gunakanBeberapa 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 merupakansingkatan dari scaled-pixel yang memperhitungkan kepadatan resolusi dan jugapreferensi ukuran font dari pengguna.ButtonButton merupakan turunan dari TextView sehingga yang berlaku di textView jugaberlaku di button. Tambahan property yang penting adalah onClick
  • 17. versi Mei 2013 17Hasilnya (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 padaresolusi 160 pixel berarti 1 pixel. Jika resolusinya 320 pixel, maka 1 dp = 2 pixeldemikian seterusnya.ImageButton dan ImageViewImageButton adalah turunan dari button, gunakan widget ini jika Anda inginmenggunakan image sebagai pengganti tulisan pada button. Sedangkan ImageView dapatdigunakan untuk menampilkan image.Image yang akan ditampilkan dalam button diletakkan di direktori /res sesuai denganresolusinya/[project]/res/drawable-ldpi/[project]/res/drawable-mdpi/[project]/res/drawable-hdpi/[project]/res/drawable-xhdpi/[project]/res/drawable-xxhdpires merupakan singkatan dari “resource”, file-file yang berada di dalam direktori /resdisebut 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 xhdpiuntuk ekstra high density (320dpi). Sedangkan xxhdpi untuk resolusi 480dpi. Saat inisudah jarang device dengan resolusi ldpi.
  • 18. versi Mei 2013 18Coba buka direktori tersebut, terdapat icon launcher untuk masing-masing resolusi (ic-launcher.png), dapat dilihat ukuran yang berbeda untuk setiap resolusi. Jadi untuk hasilyang maksimal, untuk setiap image yang akan anda gunakan harus disediakan 4 imageuntuk setiap resolusi (mdpi sampai dengan xxhdpi). Hal ini untuk mencegah gambar yangdigunakan terlihat pecah atau terlalu kecil pada device dengan resolusi berbeda.Misalnya kita akan menambah button dan image view. Sebagai sumber gambar kita akanmenggunakan icon standard yang sudah ada direktori drawable. Di window palette, pilihimages & media lalu “Image View” (paling kiri).Pilih ic_launcherCoba lakukan yang sama untuk widget “Image Button” sehingga tampilannya akanseperti iniCoba jalankan dan klik terutama untuk button-nya.
  • 19. versi Mei 2013 19Untuk menambahkan image bersama-sama dengan teks pada button, dapat digunakankomponen button (bukan ImageButton) lalu set atribut drawableLeft dengan image yangdiinginkan.Coba tambah button, dan isi drawableLeft.dan hasilnyaCoba ganti drawableLeft dengan drawableRight, drawableTop atau drawableButtom.EditTextEditText digunakan untuk menerima input dari pengguna. Pada palette telah disediakanberbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan XML yangdihasilkan.CheckBoxUser dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette, Checkboxada di bagian FormWidgets.
  • 20. versi Mei 2013 20Coba tambahkan dua checkboxs lalu set atribut id dan text melalui window property:Sehingga hasilnyaSedangkan contoh program untuk mendapatkan nilai suatu checkbox di check atau tidakadalah 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 ataupunmelalui window property. Jangan lupa atribut onClick:
  • 21. versi Mei 2013 21Tambahkan di activity code method klikHasil sebagai berikut, perhatikan penggunaanisChecked 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?BandungBogorBanjarmasinBontangNilai anda: [ditampilkan setelah tombol periksa nilai diklik]--------------------------------------------------------------------------------Jawaban yang benar adalah “Bandung” dan “Banjarmasin”. Setiap jawabanbenar bernilai 10, tetapi setiap jawaban yang salah akan dikurangi 5. Jadi jikapengguna menjawab “Bandung”, “Bogor” dan “Banjarmasin” dan makapengguna mendapat nilai 20 – 5 = 15. Tampilkan nilai ini.Catatan: input dari method setText adalah teks, sehingga nilai integer harusdikonversi terlebih dulu menjadi teks. Gunakan Integer.toString(intNilai).Periksa Nilaiini button
  • 22. versi Mei 2013 22RadioButtonPada radioButton, hanya satu pilihan yang boleh aktif (mutual exclusive) di dalam satugroup yang disebut radioGroup. Modifikasi program checkbox diatas, tambahkan radiogroup (bukan radiobutton) yang ada di Form WidgetHasilnya:Tambahkan button dan textview, lalu gunakan property untuk mengedit sehinggahasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel, radiobuttondengan rbLaki dan rbPerempuan dan id TextView dengan tvHasilRadio.Tambahkan property onClick pada button dengan nama klikHasilRadioCatatan: Anda dapat mengeset atribut android:orientation pada RadioGroup menjadihorizontal agar radio button tersusun secara mendatar.Sedangkan code saat tombol diklik adalah sebagai berikut.Perhatikan pengunaangetCheckRadioButtonId yang mengambil idRadio yang dipilih oleh pengguna:
  • 23. versi Mei 2013 23ListViewList view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll.Karena ukuran layar smartphone terbatas, listview merupakan salah satu widgetterpenting dan paling sering digunakan untuk menampilkan kelompok informasi.ListView dapat berbentuk sederhana sampai kompleks. Beberapa contohLatihan:Buat soal berikut yang penggunanya hanya dapat memilih tepat satu:--------------------------------------------------------------------------------1. Sebutkan ibu kota propinsi Sulawesi Tenggara?SamarindaKendariPaluMakasarNilai anda: [ditampilkan setelah tombol periksa nilai diklik]--------------------------------------------------------------------------------Jawaban yang benar adalah “Kendari”. Jika pengguna memilih pilihan yangbenar akan mendapat nilai 10, sedangkan jika menjawab salah maka akanmendapat nilai -2Periksa Nilaiini button
  • 24. versi Mei 2013 24Kita akan mulai dengan membuat list sederhana seperti gambar di bawah:Pertama, buat project baru lalu pilih Composite dan tambahkan ListView diactivity_main.xmlGanti id list view dengan “listAngka”Di activity utama, tambahkan code sebagai berikut:Coba jalankan.
  • 25. versi Mei 2013 25Pada code di atas, dibuat adapter berisi string untuk mengisi list. SedangkanR.layout.simple_expandable_list_item1 adalah layout standard yang disediakanAndroid.Bagaimana mengupdate isi listview saat program sedang berjalan?Untuk mengupdate data pada contoh diatas, nilai array dapat langsung diubah lalupanggil method adapter.notifyDataSetChanged()untuk merefresh tampilan. Sebagaicontoh, kita akan membuat button yang saat diklik akan mengubah item pertama:Tambahkan button diatas listviewTambahkan event onClick bernama klikButton dan kode seperti berikut:Composite ListViewListview juga dapat digunakan untuk menampilkan struktur yang lebih rumit. Contohberikut memperlihatkan listview dengan isi yang kita tentukan sendiri.Untuk membuatnya, pertama buat project baru. Tambahkan ListView seperti pada contohsebelumnya. Ganti id dengan listJudul.Kemudian kita akan buat layout untuk setiap baris pada ListView yang berisi judul danketerangan. Pilih project pada project explorer, lalu klik kanan  Android Tools New Resources File (gambar bawah)
  • 26. versi Mei 2013 26Catatan: alternatif lain membuat layout XML, klik kanan project  new  AndroidXML 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 menentukanlayout dari setiap baris pada listview.Pada row.xml yang baru digenerate tambahkan widget LargeText dan TextView (gambarbawah). Ganti Id kedua komponen itu. LargeText dengan tvJudul dan TextViewdengan tvKeterangan.
  • 27. versi Mei 2013 27Pada contoh di atas hanya digunakan dua widget (LargeText dan TextView), tapisebenarnya apapun dapat dimasukkan di dalam layout ini. Misalnya Button, ImageViewdan lainnya. Ini memungkinkan kita membuat ListView dengan isi yang kompleks.Sekarang buat class untuk yang menampung data judul dan keterangan. Pada projectexplorer, pilih /src/[package], klik kanan  new  ClassBeri nama DataListBerikut isi dari DataList. Class ini akan berisi data yang akan muncul di setiap baris.
  • 28. versi Mei 2013 28Selanjutnya kita akan buat adapter untuk list. Fungsinya untuk “mengisi” setiap rowdengan 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 posadalah indeks baris. Perhatikan pengisian tvJudul dan tvKeterangan dengan data sesuaiindeks.
  • 29. versi Mei 2013 29Terakhir, 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 listakan bertambah sesuai dengan nim dan nama. Tip: gunakanadapter.notifyDataSetChanged() untuk merefresh data.
  • 30. versi Mei 2013 30Penanganan Click pada ListViewListview sering digunakan untuk menampilkan data master-detail yang jika di tapbarisnya akan menampilkan detil pada layar terpisah. Listview juga dapat digunakanuntuk menampilkan menu.Untuk menangani tap pada listview, gunakan method setOnItemClickListenerContoh berikut akan menampilkan dialog singkat jika baris ditekan, judul pada baris jugaakan berubah menjadi warna merah. Berdasarkan kode pada contoh listview sebelumnya,tambahkan kode berikut (bagian yang dilingkari). Penjelasan tentang Toast ada di subbab berikutnya.Ada empat parameter untuk onItemClick:Parent AdapterView (view parent yang menampung semua row)View View baris yang ditapPosition Posisi (indeks) dari view pada adapterid Id dari row.
  • 31. versi Mei 2013 31DialogSeringkali app perlu menyampaikan pesan sementara kepada pengguna, misalnya jikamenampilkan informasi, melaporkan kesalahan atau memperlihatkan proses yangmemakan waktu lama.ToastToast digunakan untuk menampilkan pesan yang kemudian akan menghilang dengansendirinya tanpa interaksi dengan pengguna. Fokus juga tetap pada aplikasi dan tidakberpindah ke Toast. Kelebihan Toast adalah mudah untuk dibuat, sedangkankelemahannya adalah pengguna dapat saja tidak melihat pesan yang dikandung Toast.Untuk mencobanya, buat project baru, tambahkan satu button, beri label “Toast” dankode berikut adalah event saat button diklik:AlertDialogJika yang diinginkan adalah dialog yang muncul dan harus ditutup secara manual olehpengguna maka dapat digunakan AlertDialog. AlertDialog dapat menampilkan tigabutton.Tambahkan button pada program sebelumnya, beri label “AlertDialog”. Tambahkancode berikut untuk event onClick.Hasilnya akan seperti ini:
  • 32. versi Mei 2013 32Selain setMessage dan setPositiveButton, dapat digunakan method setTitle, setIconuntuk mengeset judul dan icon message dan SetNeutralButton (button tengah) danSetNegativeButton (button kanan). Berikut contohnyaLoggingFitur 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 bagianMainActivity onCreate tambahkan log sebagai berikut. “yw” adalah tag dan dapat digantidengan string apapun.Buka tab logcat dan jalankan program
  • 33. versi Mei 2013 33Terlihat banyak message di dalam logcat, untuk memfilternya sesuai dengan tag yangkita tentukan sebelumnya, tambahkan filter (gambar bawah). Nama filter dapat diisibebas.Fitur filter yang lain adalah memfilter berdasarkan jenis lognya (verbose sampai denganerror), terutama untuk jenis error.Pada contoh diatas kita menggunakan Log.i (info), selain itu dapat digunakan methodLog.v(), Log.d(), log.w() dan Log.e() untuk verbose, debug, warn dan error.
  • 34. versi Mei 2013 34Tips: untuk tag, dianjurkan menggunakan variabel yang ditempelkan di class activity(code dibawah)public class MainActivity extends Activity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG,"program dimulai");}Activity dan IntentDalam materi sebelumnya, selalu digunakan satu activity. Tentu saja sebuah applikasisering membutuhkan lebih dari satu activity. Activity adalah komponen terkecilpenyusun Android App yang berisi satu kegiatan yang dapat dilakukan oleh pengguna.Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah fasilitasuntuk menghubungkan satu activity ke activity yang lain, baik untuk app yang samamaupun app yang berbeda. Intent juga digunakan untuk notifikasi event misalnya SDcard dimasukkan, SMS masuk dan lain-lain.Untuk lebih memahami activity dan intent, sekarang coba buka salah satu app androidyang telah dibuat sebelumnya, lalu pada project explorer pilih AndroidManifest.xml. FileXML ini berisi property aplikasi, termasuk di dalamnya activity dan intent.Klik xml-nya dibagian bawahLihat tag activity, dapat dilihat ada satu activity dengan property nama dan label.
  • 35. versi Mei 2013 35Selain itu ada tag intent-filter yang digunakan untuk memfilter intent yang dapat dihandleactivity. android.intent.categori.LAUNCHER menyatakan activity ini adalah initialactivity yang dapat dipanggil langsung oleh launcher sedangkan intent.action.MAINmenyatakan activity ini adalah initial activity tanpa data input dan tidak menghasilkanoutput.Sekarang kita akan membuat contoh app yang memiliki dua activity.Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat classbaru: di project explorer klik package, klik kanan  New  Class. Beri nama class iniActivityDua dan pastikan superclass kelas ini adalah android.app.Activity (gambarbawah)Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut namedengan nama class lengkap dengan nama package dan label.Penting: Tanpa menambahkan activity ke dalam AndroidManifest.xml, akan terjadiforce close saat program dijalankan.
  • 36. versi Mei 2013 36Sekarang kembali ke activity utama (MainActivity), tambahkan button diactivity_main.xml, isi atribut onClick dengan clickButton. Buat implementasi methodclickButton 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 yangdisimpan di dalam AndroidManifest.xml akan menjadi title.Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat layout untukactivity 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, pilihroot element LinearLayout (gambar bawah)
  • 37. versi Mei 2013 37Tambahkan widget Large Text ke dalam layout, beri nama tvDua dan save.Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka classActivityDua dan tambahkan kode dibawah dan coba jalankan.Pertukaran Data antar ActivityPada contoh sebelumnya, activity kedua dipanggil tanpa ada data yang dikirimkan dariactivity utama ke maupun data kembali. Sekarang kita akan belajar bagaimana caramengirim dan menerima data antar activity.Mengirimkan data ke activityKita akan memodifikasi contoh pada app sebelumnya (app dengan dua activity).Pada MainActivity, ubah kode sebagai berikut, perhatikan method putExtra untukmenambahkan data yang akan dikirim.Sedangakan di ActivityDua tambah kode sebagai berikut untuk menerima data. MethodonStart ini akan otomatis dipanggil saat activity mulai dijalankan setelah onCreate. Cobajalankan kembali app ini.
  • 38. versi Mei 2013 38Menerima data dari actvity yang dipanggilUntuk mengirimkan dan menerima data dari activity, dapat digunakan methodstartActivityForResult.Sebagai contoh, kita akan membuat activity yang memanggil activity lain, penggunamengisi data pada activity tersebut dan mengirimkannya kembali ke activity utama. Kitaakan memodifikasi program sebelumnya.Catatan: jika anda mau program sebelumnya tidak hilang anda dapat menduplikasiproject dengan mencopy-paste project tersebut pada package explorer.Sekarang kita kembali ke activity utama MainActivity, gunakan method putExtra untukmenambahkan data ke intent. Pada startActivityForResult terdapat parameter angka 99(silahkan ganti dengan angka atau konstanta apapun). Paremeter ini diperlukan karenasatu activity bisa mengirimkan banyak intent dan diperlukan cara untuk membedakanantara satu intent dengan intent yang lain.Method onActivityResult akan dipanggil saat activity yang dipanggil telah selesai.
  • 39. versi Mei 2013 39Selanjutnya kita akan menambahkan widget editText pada activity dua yang dapat dieditoleh pengguna dan hasilnya akan dikirimkan kembali ke activity utama. Bukares/layout/activity_dua.xml. Tambakan satu editText dan satu button. Beri nama etNamadan tambahkan android:onClick="clickButtonActDua" di button.Sekarang kita akan membuat kode di activitydua yang akan mengisi editText dengan datayang dikirim dari activity utama dan setelah button ditekan mengirimkan hasil update keactivity utama. Buka file ActivityDua.java dan tambahkan kode berikut:Jika dijalankan hasilnya sebagai berikut
  • 40. versi Mei 2013 40Activity Life CyclePada contoh sebelumnya, kita telah menggunakan lebih dari satu activity. Setiap activitymemiliki siklus seperti gambar dibawah. Saat pertama kali dijalankan activty akan beradadalam status active. Ketika user pindah app atau menjalankan activity lain maka statusdapat berubah menjadi paused atau stopped. Setelah itu app bisa kembali active (usermembuka 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 otomatisdipaused dan jika activity di-kill oleh Android, maka state game perlu disimpan dandikembalikan. Demikian juga untuk app yang menggunakan sensor, koneksi dengansensor perlu dilepaskan saat app di-pause atau distop.Latihan Activity-IntentMenggunakan listview (layar1), tampilkan daftar nama mahasiswa. Penggunadapat men-tap nama (baris), dan kemudian app akan menampilkan informasiyang lebih detil berisi NIM, NAMA, ALAMAT dan NOHP (layar2). Pada layarinformasi detil (layar2) tersebut ada button “EDIT” yang jika diklik akanmembawa ke layar ketiga yang berisi editText untuk mengupdate data. Hasilupdate akan muncul baik di layar1 dan layar2
  • 41. versi Mei 2013 41Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih terlihatwalaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti menulis ke databasekarena akan memperlambat proses transisi ke activity lain. Umumnya onPause digunakan untuktiga 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 inidapat 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 untukmengembalikan kondisi app seperti semula (kebalikan dari onStop). Selain onResume, untukstate stop ada event lain yang terlibat yaitu onRestart. Hubungan keduanya dapat dilihat padagambar bawahdiambil dari: http://developer.android.com/training/basics/activity-lifecycle/stopping.htmlActive/Running PausedStoppedDestroyedhilang fokus tapi masih visiblesistem kekurangan memorisistem kekurangan memoritidak visible
  • 42. versi Mei 2013 42Dari gambar diatas, dapat dilihat urutan pada dari state stop menuju resumed urutannyaadalah OnRestart()  onStart()  onResume()Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab mengenaisensor.Simpan dan Load Activity StateCoba lihat project yang pernah anda buat sebelumnya, dalam setiap project, di methodonCreate dapat dilihat parameter bertipe Bundle.@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}Parameter ini berisi objek yang menyimpan state activity seperti isi widget sehingga saatapp masuk ke pause/stop dan kemudian kembali, widget terisi kembali secara otomatis.Kita dapat memanfaatkan Bundle ini untuk menyimpan variabel-variabel yang perludikembalikan state-nya pada saat activity aktif kembali dari stop atau destroyed.Contoh berikut akan lebih menjelaskan masalah ini, pertama buatlah app dengan duabutton dan satu textview. Saat button “simpan” diklik maka variabel nama dan skor akanterisi. 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 43Implementasi 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 danmengcreate ulang. Sekarang coba klik tampil (jangan klik simpan), efeknya akan sepertiini:Bayangkan efeknya jika dengan merotate device semua variabel di activity hilang. Tentusaja asumsi pengguna adalah proses rotate tidak akan merubah state dari activity. Ini jugaberlaku misalnya saat pengguna pindah ke activity lain dan kemudian kembali ke activitysemula, mereka akan berharap kondisi activity akan sama seperti sebelum ditinggalkan.Walaupun pada kenyataanya Android dapat mendestroy activity yang ditinggalkantersebut.
  • 44. versi Mei 2013 44Untuk mengatasi ini, kita perlu meng-override dua method di MainActivity, pertamaonSaveInstanceState untuk menyimpan variabel dan kedua adalahonRestoreInstanceState untuk mengembalikan state. Contoh kodenya adalah sebagaiberikut:@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {//simpan variabel//method ini dipanggil sebelum onStopsavedInstanceState.putInt("state_skor", skor);savedInstanceState.putString("state_nama", nama);//jangan lupa panggil superclasssuper.onSaveInstanceState(savedInstanceState);}@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState) {// Restore nilaiskor = savedInstanceState.getInt("state_skor");nama = savedInstanceState.getString("state_nama");}Jalankan dan perhatikan efeknya (simpan  tampil  rotate (ctrl-F11)  tampil). Makavariabel 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 45Layout ManagerUntuk meletakan komponen (view) pada layar, android menggunakan layout manager.Karena ukuran layar device Android sangat beragam, tidak ada peletakan posisi widgetsecara eksak per pixel.Terdapat empat jenis layout manager yang memiliki fungsi masing-masing.LinearLayout, TableLayout, RelativeLayout dan FrameLayout. Berikut akan dibahaslebih rinci untuk setiap layout.RelativeLayoutRelativeLayout mengatur posisi secara relatif berdasarkan posisi widget yang lain atauparentnya. Sebagai contoh, dua widget pada gambar di bawah. EditText posisinya relatifterhadap textView nama.Contoh deklarasinya adalah sebagai berikut:Untuk layout_width dan layout_height ada dua pilihan: match_parent (view berusahasebesar parent) dan wrap_content (view hanya berusaha sebesar content yang berada didalamnya). Sedangkan padding menyatakan jarak antara pinggir layar dengan komponen.
  • 46. versi Mei 2013 46Perhatikan penggunaan atribut layout_toRightOf yang menyatakan bahwa EditTextberada disebelah kanan label. Sedangkan atribut layout_baseLine digunakan agarTextView dan EditText aligned. Jika layout_baseLine dihapus efeknya akan sebagaiberikut (Text View terlalu tinggi posisinya):Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan widget lainadalah:android:layout_aboveandroid:layout_belowandroid:layout_toLeftOfandroid:layout_toRightOf.Untuk mengatur posisi ada tambahan lima atribut: android: layout_alignTop,android:layout_alignBottom, android:layout_alignLeft, android:layout_alignBaselineContoh 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 beberapapilihan 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 47Hasilnya:Silahkan bereksperimen dengan berbagai setting atribut layout.TableLayoutUntuk memilih layout manager, selain dengan cara manual dapat juga ditentukanmembuat layout (File  New  Other  Android XML Layout File). Saat munculdialog berikut, pilih Root Element sebagai TableLayout.
  • 48. versi Mei 2013 48TableLayout meletakan komponen dalam bentuk tabel (baris dan kolom), mirip sepertiTable yang digunakan di HTML. Pengguna mendefinisikan baris dengan tag<TableRow> dan sistem secara otomatis mendefinisikan kolomnya. Contoh deklarasiberikut:Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan dua kolom dandua baris.Kolom 0 Kolom 1
  • 49. versi Mei 2013 49Misalnya kita ingin agar EditText sampai ke bagian belakang, maka tambahkanandroid: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). Inibisa dilakukan dengan menggunakan atribut android:layout_column. Tanpa atribut ini,TextView akan muncul di kolom 0Hasilnya sebagai berikut:
  • 50. versi Mei 2013 50Frame LayoutFramelayout digunakan untuk menampilkan satu komponen dalam satu layar. Jika adalebih dari satu widget, maka akan ditampilkan secara bertumpuk, walaupun posisi widgetdapat diatur dengan gravity. Kita bisa menambahkan layout lain sebagai child di dalamframe layout.Contoh untuk deklarasi berikut menampilkan dua ImageView (pastikan file image telahdisimpan 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, widgetpertama ukurannya harus ¾ layar dan sisanya ¼ layar. Maka set layout_weight widgetpertama dengan 3 dan widget kedua dengan 1. Height atau widht perlu diset 0px.TBD contohnya
  • 51. versi Mei 2013 51LinearLayoutSesuai dengan namanya, linear layout menyimpan widget dalam satu baris atau satukolom (tergantung orientasinya).Jika orientasinya vertical (android:orientation="vertical") maka hasilnya akan seperti iniSedangkan jika orientasinya horizontal (android:orientation="horizontal"), maka hasilnyaakan 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" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Large Text"android:textAppearance="?android:attr/textAppearanceLarge" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /></LinearLayout>
  • 52. versi Mei 2013 52ScrollViewDengan scrollview, layout seolah-olah memiliki layar yang lebih luas. Pengguna dapatmelakukan scroll. Scrollview hanya mempunyai satu child dan umumnya adalahLinearLayout. Scrollview hanya dapat melakukan vertical scrolling, gunakanHorizontalScrollView untuk layout yang dapat discroll secara horizontal.Jangan gunakan Listview bersama layout ini karena listview telah memiliki mekanismescrolling tersendiri.Berikut adalah contoh scrollview yang menghasilkan layout seperti ini yang dapatdiscroll. Dua button teratas menggunakan RelativeLayout yang disisipkan dalamScrollView. 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" ><LinearLayoutandroid:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid: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<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@+id/button1"android:text="Button" /></RelativeLayout><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button7"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button8"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button9"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button10"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /></LinearLayout></ScrollView>RelativeLayout didalamLinearLayout.Didalamnya ada duabutton.Beberapa button agarscroll terlihat.
  • 54. versi Mei 2013 54Kombinasi LayoutKita bisa mengkombinasikan beberapa layout dalam satu activity. Contoh berikutmenggunakan linearlayout yang memiliki dua anak yaitu relativelayout dan tablelayout.Relativelayoutdengan duaTextViewTableLayoutdengan tigakolom dan tigabaris
  • 55. versi Mei 2013 55ActionBarActionbar adalah bar yang berada diatas activity yang mulai diperkenalkan sejak Android3. Action bar memperlihatkan identitas berupa judul dan icon activity, tempat fitur-fiturutama (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 3dapat menggunakan library actionbarsherlock.comDalam aplikasi sebelumnya, sebenarnya kita secara default selalu membuat ActionBarkarena minimal SDK diset 11 (Android 3.0). Coba buka MainActvity.java dan lihatLatihan LayoutBerdasarkan hasil latihan activity-intent, pada layar2 dan layar3, tambahkanlayout yang tepat agar tampilan widget rapi.
  • 56. versi Mei 2013 56function onCreateOptionMenu. Terlihat fungsi ini mengisi ActionBar dengan isires/menu/main.xmlCoba lihat /res/menu/main.xmlKita akan bahas lebih detil tentang ini pada bagian berikutnya.ActionItemActionItem berbentuk button atau text yang dapat diakses langsung dari ActionBar. Jikatidak 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. Kitamenambahkan dua item “Add” dan “Delete” yang akan muncul jika tempatnya cukup(“ifRoom”).Saat dijalankan akan menghasilkan ActionBar sebagai berikut.
  • 57. versi Mei 2013 57Sekarang kita akan buat aksi kalau “ADD” atau “DELETE” ditekan. Override fungsionOptionsItemSelected dan cek hasil getItemId().String ResourcesPada kode diatas kata “add” dan “delete” dimasukkan ke dalam kode. Ini bukan praktekyang baik (perhatikan warning pada /main.xml), karena akan menyulitkan jika app akandiporting untuk bahasa lain. Solusinya adalah dengan menggunakan string resources.Pertama-tama, buka /res/values/strings.xml. Perhatikan bahwa secara default telah adastring untuk nama app (app_name) dan lainnya. Tambahkan add dan delete (gambarbawah). 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 58Sedangkan untuk MainActivity.java, ganti dengan R.string.add dan R.string.delete.IconUmumnya action bar menggunakan icon yang lebih mudah dikenali oleh pengguna.Untuk menambahkan icon, cara yang paling mudah adalah mendownload Android designicon di: http://developer.android.com/design/downloads/index.htmlSetelah 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 resoulusimembutuhkan gambar yang terpisah.Setelah itu masuk ke package explorer dan refresh (F5), hasilnya akan seperti ini:
  • 59. versi Mei 2013 59Sesuai dengan penamaan standard untuk icon ActionBar, rename agar didahului dengan“ic_menu_” Untuk me-rename, klik kanan pada nama file refactor  rename. Semuaresolusi secara otomatis akan diganti. Sehingga hasilnya sebagai berikut:Sekarang buka res/menu/main.xml dan tambahkan atribut android:iconJalankan dan hasilnya akan seperti berikut:Jika kita ingin menambahkan teks disebelah icon, tambahkan nilai “withText” padaandroid:showAsAction sebagai berikut:Jika dijalankan hasilnya tidak berubah. Mengapa? karena tidak cukup ruang untukmenambahkan teks. Coba ubah orientasi AVD menjadi landscape dengan ctrl-F11 maka
  • 60. versi Mei 2013 60tulisan akan muncul (gambar bawah). Untuk mengembalikan menjadi portrait tekan ctrl-F12.Selain “ifRoom” dan “withText”, pilihan yang lain adalah “never” agar item hanyamuncul 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 DataAndroid menyediakan beberapa cara untuk menyimpan data: file, relasional databasedengan SQLlite dan pasangan key/value yang disebut sistem preferences. Untuk sharingantar aplikasi disediakan mekanisme yang disebut ContentProvider.Shared PreferencesShared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value untuktipe data primitif (integer, double, string, booelan). SP cocok untuk penggunaan ringanseperti menyimpan setting aplikasi dan kondisi user interface misalnya pada saat activitymasuk 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 61MODE_PRIVATE: hanya aplikasi yang membuat SP yang dapat mengakses dataMODE_WORLD_READABLE: aplikasi lain boleh membacaMODE_WORLD_WRITEABLE: aplikasi lain boleh membaca sekaligus menulis.Shared Preference objek untuk activity diperoleh melalui method getPreferences(). Kodeberikut 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. Tampilkanjumlah tersebut.
  • 62. versi Mei 2013 62SQLiteSQLite adalah embedded database (hanya menggunakan sekitar 250KB memori) yangmenyediakan fasilitas relational DBMS termasuk SQL. Referensi lengkap SQLite dapatdilihat di http://www.sqlite.org/ SQLite tidak hanya digunakan di Android.Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan sharedpreference, tidak disediakan fasilitas agar aplikasi dapat membaca database aplikasi lain.Untuk menggunakan SQLite, sangat dianjurkan menggunakan class helper untukmembuka dan menutup database, menginisiasi tabel dst. Helper juga digunakan saatmelakukan upgrade struktur database jika suatu saat aplikasi diupdate. Class helper iniditurunkan dari class SQLiteOpenHelper.Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data mahasiswaberupa nama dan nomor telpon. Pertama kita buat class helper terlebih dulu. Buatlahproject Android, tambahkan ke dalam project tersebut satu class (ke project explorer,pilih src/nama package; klik kanan  New  Class). Pastikan superclass kelas iniadalah SQLiteOpenHelper. Beri nama class ini OpenHelper.Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jikadatabase diuprade.
  • 63. versi Mei 2013 63Selanjutnya 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 Mahasiswapublic 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 64ContentValues 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 diambilString[] 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? ambilcur.moveToFirst();M.nama = cur.getString(1);M.telepon = cur.getString(2);}return M;}}Setelah kita membuat class helper dan class dbMahasiswa, sekarang kita akanmemanfaatkan 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 digunakantipe REAL, BLOB. Semua tipe lain seperti boolean, date harus dimasukkan ke dalamtipe tersebut. SQLite tidak melakukan pengecekan tipe, sehingga bisa saja memasukkantipe
  • 65. versi Mei 2013 65Group By, Having, Order ByPada kode sebelumnya dapat dilihat penggunaan db.query untuk mengambil datamahasiswa dengan nama tertentu.Method query menerima tujuh parameter. Parameter pertama adalah nama table,parameter kedua adalah array kolom yang akan diambil (SELECT), parameter ketigaadalah bagian seleksi record (bagian setelah „where‟), parameter keempat adalah isibagian 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 perkelas (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 mahasiswagroup by kelashaving jum > 1order by kelas desc;Maka di dalam program pemanggilan quernya adalah sebagai berikut:RawQuerySelain method query, tersedia juga rawQuery untuk memasukkan langsung query.Sebagai contoh, berikut perbandingan antara query dengan rawQuerygroup byhaving order by
  • 66. versi Mei 2013 66Mana yang lebih baik? beberapa sumber mengatakan query lebih cepat dibandingkanrawQuery dan lebih mudah untuk dibaca.Loop Semua RecordUntuk mengambil data semua record, dapat digunakan moveToNext() dalam loopseperti pada contoh berikutalternatif lain yang dapat digunakan untuk loop semua record adalah adalah:Mengisi ListView dengan RecordListview dapat langsung dihubungkan dengan database dan untuk mencegah userinterface yang tidak responsif (ANR: Application Not Responding), idealnya data diloaddi background.Untuk mencapai hal ini dapat digunakan SimpleCursorAdapter, ContentProvider danLoader. Sayangnya hal ini cukup kompleks (mudah-mudahan akan lebih disederhanakandi API berikutnya). Berikut adalah contoh penggunakan ketiga class tersebut.Pertama buat project baru:
  • 67. versi Mei 2013 67Seperti dalam contoh sebelumnya, buat class helper yang merupakan turunan dari kelasSQLiteOpenHelper.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 _IDprivate 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);}@Overridepublic void onCreate(SQLiteDatabase db) {//create databasedb.execSQL(TABLE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {//jika database diupgrade, hapus yang lama, buat yang barudb.execSQL("DROP TABLE IF EXISTS MHS");
  • 68. versi Mei 2013 68onCreate(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 akandibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk widgetyang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat di MainActivitynanti.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 olehapp lain. Tapi class Contentprovider juga dapat digunakan di appsendiri secara private (tidak bisa diakses app lain). Keuntungan contentprovider adalah:1. Dapat dieksekusi secara asynchronus, sehingga menghindarierror app not responding.2. Memberikan akses tunggal ke data.3. Memudahkan hubungan antara view (widget) dengan datamelalui ContentObserver milik ContentResolver.4. Dimanfaatkan untuk rest client app.Kerugian menggunakan contentprovider? relatif rumit.
  • 69. versi Mei 2013 69public class MhsContentProvider extends ContentProvider {// databaseprivate DbHelper database;// konstanta2 dibawah mendefinisikan bagaimana contentprovider ini diakses// contentprovider diakses melalui URI// contoh penggunaa URI ini dapat dilihat di MainActivityprivate 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);}@Overridepublic Uri insert(Uri uri, ContentValues values) {//insert dataint 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);}//notifikasigetContext().getContentResolver().notifyChange(uri, null);return Uri.parse(BASE_PATH + "/" + id);}@Overridepublic boolean onCreate() {database = new DbHelper(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs,String sortOrder) {//query tabelSQLiteDatabase db = database.getWritableDatabase();Cursor cur=null;int uriType = sURIMatcher.match(uri);switch (uriType) {case MHS://ambil semuacur = db.query("MHS",projection,selection,selectionArgs,sortOrder,null,null);break;case MHS_ID:// ambil berdasarkan id … nanti dibuatbreak;default:
  • 70. versi Mei 2013 70throw new IllegalArgumentException("URI tidak dikenal: " + uri);}//notifikasicur.setNotificationUri(getContext().getContentResolver(), uri);return cur;}@Overridepublic int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {// nanti dibuatreturn 0;}@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {// nanti dibuatreturn 0;}@Overridepublic String getType(Uri arg0) {// nanti dibuatreturn null;}}Content provider ini harus didaftarkan di AndroidManifest. Buka dan tambahkan didalam <application>. android:exported=”false” menunjukkan bahwa content provider iniprivate dan tidak dapat diakses app lain. Sedangkan android:name adalah nama kelas,penggunaan titik pada “.MhsContentProvider” merupakan singkatan dari namaapp. Jadi “.MhsContentProvider” artinya sama dengan“edu.upi.cs.yudi.listviewdb.MhsContentProvider”<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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><providerandroid:exported="false"android:name=".MhsContentProvider"android:authorities="edu.upi.cs.yudi.listviewdb.contentprovider" ></provider></application>
  • 71. versi Mei 2013 71Setelah Helper dan ContentProvider dibuat, selanjutnya kita akan mempersiapkanListView. Caranya seperti ListView pada contoh sebelumnya. Bukalayout/activity_main.xml, drag listview.Selanjutnya buat xml layout baru sebagai isi dari baris di listview (pilih layout, klikkanan  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 mengimplemenLoaderCallback sehingga data akan diload dibackground dan baru diisi ke ListView saatsudah selesai. Pada activity ini akan diinsert dua record kemudian ditampilkan dalamlistview.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 LoaderManagerpublic class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {//adapter untuk listviewprivate SimpleCursorAdapter adapter;private void insertData() {
  • 72. versi Mei 2013 72//masukkan dua data untuk testingContentValues 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/mhsgetContentResolver().insert(MhsContentProvider.CONTENT_URI, values);values = new ContentValues();values.put("nama", "budi");getContentResolver().insert(MhsContentProvider.CONTENT_URI, values);}@Overrideprotected 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 dikomentariinsertData();//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 simplecursoradapteradapter = new SimpleCursorAdapter(this, R.layout.row, null, proj,to, 0);lv.setAdapter(adapter);}@Overridepublic 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;}@Overridepublic 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 terisiadapter.swapCursor(cur);}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {//reset, kosongkanadapter.swapCursor(null);}}
  • 73. versi Mei 2013 73Latihan SQLite1:Buat applikasi untuk menyimpan datamahasiswa (NIM, NAMA, ALAMAT). Buatlahmenu 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 yangtelah 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 filedisediakan di package java.io.*StreamPemrosesan file dalam jumlah besar, yang membutuhkan kinerja yang tinggi masihdibutuhkan berbagai bidang. Misalnya aplikasi backend yang mengelola dokumen diperusahaan, aplikasi pengolahan teks, aplikasi pemroses XML, HTML, aplikasisimulasi-simulasi dan sebagainya. Penguasaan stream dan file akan membantu andauntuk memecahkan berbagai masalahStream adalah aliran data. Bayangkan stream sebagai sungai yang mengalirkan air.Seperti sungai, stream mengalirkan byte-byte data. Pemrosesan input dan output di Javapada prinsipnya menggunakan konsep stream ini.Gambar 1: Input Stream (diambil dari http://download.oracle.com/javase/tutorial)
  • 74. versi Mei 2013 74Gambar 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 kelastersebut harus digunakan, programmer bisa memilih kelas mana yang dibutuhkan untukmenyelesaikan masalahnya.PersiapanSebelum 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 untukmenulis ke media penyimpanan external di AndroidManifest.xml
  • 75. versi Mei 2013 75File TeksSebelum mulai, pastikan virtual device telah diset SD-Card dan AndroidManifest telahditambahkan ijin untuk menulis (baca bagian persiapan)File teks penting untuk menulis data, XML, HTML dan sebagainya. File teks dianggapsebagai stream dari karakter. Untuk menulis ke file teks, cara yang paling mudah adalahdengan menggunakan class PrintWriter. Berikut adalah contoh program yang menulisdua baris ke file teks.Sedangkan untuk membaca, dapat digunakan class Scanner yang dapat membaca barisdemi baris. Berikut contoh codenya, letakkan di bawah code atas.
  • 76. versi Mei 2013 76Objek StreamJava telah menyediakan fasilitas agar objek dapat disimpan ke dalam stream secaraotomatis dengan mudah. Class yang digunakan adalah ObjectOutputStream danObjectInputStream.Setelah membuat project baru (pastikan AndroidManifest.xml-nya telah ditambahkan ijinmenulis ke external!) Sekarang coba kita buat class Mahasiswa sebagai berikut.Tambah class baru (Filenewclass). Perhatikan penggunaan interfacejava.io.Serializable yang menandakan bahwa class ini dalam disimpan ke dalam streamLatihan: buat file teks berisi<html><body> Halo </body></html>
  • 77. versi Mei 2013 77Codenya sebagai berikut. Perhatikan variabel serialVersionUID untuk menyatakan versiclass. Jangan lupa class Mahasiswa ini mengimplementas interface Serializable.Selanjutnya, buat program untuk menulis dua objek mahasiswa ke dalam class. Penulisanobjek ke stream sangat mudah, hanya dengan class ObjectOutputStream dan methodwriteObject. Buatlah code ini di activity Main.
  • 78. versi Mei 2013 78Sekarang kita lanjutkan ke pembacaan objek yang telah dituliskan. Untuk membaca fileberisi objek digunakan class FileInputStream dan ObjectInputStream;Catatan:Perhatikan penggunaan codeObjectOutputStream out =new ObjectOutputStream (new FileOutputStream(namaFileOutput));Pada code diatas Objek FileOuputStream „dibungkus‟ dengan ObjekOutputStream. Iniyang disebut dengan stream layering, yaitu penggunaan kombinasi beberapa classyang 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 sangatbermanfaat untuk mengkombinasikan berbagai fitur yang dibutuhkan.
  • 79. versi Mei 2013 79Grafik 2DMenggambar di CanvasDalam contoh pertama kita akan menggunakan Canvas, Paint, Path dan Color untukmenggambar kotak. Koordinat canvas 0,0 berada di kiri atas. Makin ke kanan nilai xsemakin besar dan makin kebawah nilai y semakin besar.Setelah membuat project baru, buatlah class yang bernama GraphicsView yangmerupakan 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 objekuser (minimal 3 user) ke dalam Android menggunakan file teks dan file objek.
  • 80. versi Mei 2013 80public 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 classGraphicView.Hasilnya akan seperti iniCanvas, sesuai namanya adalah tempat untuk menggambar bentuk 2D. Dengan canvas,kita dapat menggambar bentuk (lingkaran, kotak, garis, titik), menggambar text danmelakukan operasi translate, scale, rotate.Paint digunakan untuk menyimpan style, warna dan informasi lainnya yang dibutuhkanuntuk menggambar.Class Color digunakan untuk merepresentasikan warna. Android menggunakan 4 angkauntuk alpha, red, green dan blue (RGB) dengan masing-masing rentang nilai 0 sd 255.Alpha digunakan menyatakan transparansi: alpha 0 artinya transparan 100% . Pada codediatas, kita menggunakan color constant (Color.GREEN). Coba ganti baris tersebutmenjadi, silahkan berkesperimen dengan alpha yang lebih kecil.
  • 81. versi Mei 2013 81cat.setColor(Color.argb(75, 255, 0, 0)); //alphpa,reg,gree,blueSekarang kita coba fungsi-fungsi lain pada canvas, tambahkan code berikut dalam classGraphicsviewpackage 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,y2private 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 iniprivate 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 kotakcat.setColor(Color.argb(75, 255, 0, 0)); //alpha,red,green,bluec.drawRect(kotak,cat);//gambar lingkarang birucat.setColor(Color.BLUE);c.drawCircle(50, 50, 30, cat); //x,y,radius//gambar kotak dengan ujung membulatc.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 mendatarc.drawArc(oval2, 45, 90, false,cat);//gambar garisc.drawLine(50,500,400,500,cat); //x1,y1,x2,y2//gambar kotak kosongcat.setColor(Color.GREEN);cat.setStyle(Style.STROKE);cat.setStrokeWidth(5);c.drawRect(kotak3,cat);//gambar titikcat.setColor(Color.BLACK);for (int i=0;i<10;i++) {
  • 82. versi Mei 2013 82c.drawPoint( (float) Math.random()*500, (float)Math.random()*500, cat);}}Hasilnya akan seperti berikut:}Menulis Teks di CanvasMethod drawText dapat digunakan untuk menambahkan teks di canvas, sedangkan Pathdan drawTextOnPath dapat digunakan untuk menggambar teks yang mengikuti jalurtertentu. Untuk jelasnya, tambahkan code dibawah pada project sebelumnya. Akanditampilkan tulisan berwarna merah dan tulisan italiccat.setColor(Color.RED);//diisi dalam maupun outlinecat.setStyle(Style.FILL_AND_STROKE);cat.setStrokeWidth(2);cat.setTextSize(35);c.drawText("Hello World", 10, 500, cat);//teks serif dan italiccat.setTypeface(Typeface.create(Typeface.SERIF,Typeface.ITALIC));c.drawText("ini serif italic", 10, 550, cat);Selanjutnya kita akan membuat lingkarang yang mengikuti suatu jalur menggunakanclass Path. Deklarasikan satu objek ini di luar onDraw:Dianjurkan untuk membuat objek diluar method onDraw karena onDraw dapat dipanggilberulang-ulang.
  • 83. versi Mei 2013 83Selanjutnya tambahkan kode berikut, kode ini akan membuat dua tulisan dengan pathberbeda.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 pathpath1.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. Sebagaicontoh, 100 point di layar dengan resolusi tinggi akan memiliki panjang berbeda denganlayar resolusi rendah. Gunakan Canvas.getWidth() dan Canvas.getHeight untukmenghitung panjang objek yang diinginkan. Misalnya jika kita ingin membuat garissepanjang setengah layar, gunakan ukuran getWidth() / 2 sehingga pada resolusi apapun,garis akan selalu sepanjang setengah layar.
  • 84. versi Mei 2013 84Kode berikut akan menambahkan kotak yang mengikuti ukuran layar yangmemanfaatkan class Path.int lebar = c.getWidth();int tinggi = c.getHeight();int offset=20; //memberikan efek framecat.setColor(Color.RED);cat.setStyle(Style.STROKE);cat.setStrokeWidth(10);//menggunakan path, bisa juga dengan drawRectpath1.reset();path1.moveTo(0+offset, 0+offset); //kiri ataspath1.lineTo(lebar-offset, 0+offset); //kanan ataspath1.lineTo(lebar-offset, tinggi-offset); //kanan bawahpath1.lineTo(0+offset, tinggi-offset); //kiri bawahpath1.lineTo(0+offset, 0+offset); //kembali ke kiri atasc.drawPath(path1, cat);Event TouchSelenjutnya kita akan membuat app yang akan menggambar kotak ditempat penggunamenyentuh layar. Buat project baru dan tambahkan class baru turunan dari class View,beri nama GraphicsView. Berikut adalah isi kelas tersebut yang membersihkan layar dankemudian 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 sentuhpublic float posX=-1;Latihan:Buatlah gambar rumah seperti ini, tambahkan warna dan modifikasi sesuai yanganda inginkan
  • 85. versi Mei 2013 85public float posY=-1;private int offset=25;private Paint cat = new Paint();public GraphicsView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas c) {//clear screencat.setColor(Color.BLACK);c.drawRect(0,0,c.getWidth(),c.getHeight(),cat);//gambar kotak diposisi yang disentuhif (posX!=-1) {cat.setColor(Color.YELLOW);c.drawRect(posX-offset,posY-offset,posX+offset,posY+offset,cat);}}}Sedangkan code untuk MainActivity adalah sebagai berikut. MainActivitymengimplements onTouchListenerpackage 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);gv= new GraphicsView( this);//set listener agar saat graphicview ditouch//maka onTouch di kelas ini akan dipanggilgv.setOnTouchListener(this);setContentView(gv);}@Overridepublic boolean onTouch(View v, MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN: //jari menyentuh layar//passing posisi ke graphicsviewgv.posX = event.getX();gv.posY = event.getY();gv.invalidate(); //draw ulangbreak;case MotionEvent.ACTION_MOVE: //bergerakbreak;case MotionEvent.ACTION_UP: //diangkatbreak;
  • 86. versi Mei 2013 86case MotionEvent.ACTION_CANCEL: //batalbreak;default:break;}return true;}}Load Image di CanvasJika kita ingin meload image (jpg,png) ke dalam canvas, maka file gambar tersebut perludimasukkan ke dalam /res/drawable (hdpi,xhdpi dst), baca kembali pembahasan icondalam Actionbar. Dalam contoh berikut digunakan gambar ic_launcher yang sudahtersedia.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 akanhilang.
  • 87. versi Mei 2013 87Sedangkan 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GraphicsView gv = new GraphicsView(this);//load bitmapResources res = getResources();Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);gv.bmpGambar = bmp;setContentView(gv);}}Hasilnya akan muncul seperti iniTBD:ubah ukuran image“drawable-nodpi”Animasi di CanvasAnimasi di canvas cocok digunakan untuk game sederhana seperti game berjenis puzzleyang melibatkan sedikit objek dan tidak memperlukan animasi berat. Canvas juga lebihsederhana dibandingkan dengan OpenGLAnimasi dapat dilakukan dengan membersihkan layar dan menggambar objek di tempatyang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek dan jeda antar
  • 88. versi Mei 2013 88frame. Asyntask melakukan proses dibackground, sehingga app tidak terkunci dan tetapresponsif.Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView yangmerupakan turunan View seperti pada contoh sebelumnya. Class ini akan membersihkanlayar 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 bolapublic float posX=0;public float posY=0;public Bitmap bmpGambar;private Paint cat = new Paint();public GraphicsView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas c) {//clear screenc.drawColor(Color.WHITE);//gambar bitmapc.drawBitmap(bmpGambar,posX,posY,cat);}}Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask. Kelas iniberperan untuk mengatur posisi objek dan memerintahkan agar canvas didraw ulangsetiap 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@Overrideprotected Void doInBackground(Void... arg0) {// method ini dijalankan di background secara asynchronousfor (int i=10;i<600;i=i+20) {//bergerak diagonalgv.posX=i;
  • 89. versi Mei 2013 89gv.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 barupublishProgress();//tidur 0.2 detik, agar animasi tdk terlalu cepattry {Thread.sleep((long)(1000*0.2));} catch (InterruptedException e) {e.printStackTrace();Log.e("yw","error saat mencoba sleep"+e.getMessage());}}return null;}@Overrideprotected 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;@Overrideprotected 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 90SensorAndroid mendukung berbagai sensor, mulai dari yang umum tersedia sepertiaccelerometer, magnetometer, GPS sampai barometer, termometer dan pengukurkelembaban.AccelerometerAccelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahankecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat bahwabenda yang jatuh mengalami percepatan) maupun perubahan dinamik seperti saat devicebergerak atau bergetar.Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device.Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah manabenda bergerak dan secepat apa.Penggunaan accelerometer di smartphone/tablet yang paling umum adalah mendeteksiposisi portrait dan landscape. Selain itu telah ada app yang memanfaatkan accelerometeruntuk menghitung kecepatan dan jarak lari, membunyikan alarm jika device dipindahkan,game dan sebagainya.Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini mengukurperubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah). Satuannya adalahm/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 menampilkanserangga di layar yang bergerak, jika pengguna „memukulnya‟ dengan jari, makapengguna mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misalkotak berubah warna).
  • 91. versi Mei 2013 91Diambil dari: http://developer.android.com/reference/android/hardware/SensorEvent.htmlUntuk menggunakan sensor di Android, class yang harus digunakan adalahSensorManager untuk mengetahui apakah device mensupport sensor yang kita inginkan.Kemudian class Sensor untuk mendapatkan data dari sensor dan interfaceSensorEventListener yang diimplement oleh activity.Buat project baru, tambahkan kode berikut di MainActivity.
  • 92. versi Mei 2013 92import 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;@Overrideprotected 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,lanjutkanmSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_NORMAL);}else {//tidak punya sensor accelerometer, tampilkan pesan error}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// kalau akurasi berubah}@Overridepublic 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 digunakantvHasil.setText("x:"+ax+" y:"+ay+" z:"+az);}@Overrideprotected void onPause() {//app kehilangan fokus (misal user menerima telp), lepaskan sensorsuper.onPause();mSensorManager.unregisterListener(this);}@Overrideprotected void onResume() {//app kembalisuper.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}@Overridepublic 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 harusdijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan ataumanual melalui APK.Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet dengankomputer 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 ConfigurationPilih tab target, lalu pilih launch on all … dengan “Active Devices”Kemudian pada device, jalankan USB Debugging dengan pilihan Setting DeveloperOptions  USB Debugging.
  • 94. versi Mei 2013 94Catatan: Jika menu Developer Option tidak muncul pada Android versi 4.2.*, makauntuk mengaktifkannya pilih settings  About Phone, lalu tap “Build Number”sebanyak tujuh kali.Orientasi: Yaw (Azimuth), Pitch & RollDengan mengkombinasikan sensor accelerometer dan magnetometer maka dapatdiperoleh pitch, roll dan yaw. Khusus untuk yaw, posisi yang didapat sesuai denganmedan magnet bumi sehingga dapat digunakan sebagai kompas. Ini sebabnya posisi yawsering disebut disebut azimuth.Gambar berikut memperlihatkan dengan jelas apa yang disebut yaw, pitch dan roll.Ketiga informasi ini (azimuth, roll, pitch) dapat dimanfaaatkan untuk banyak hal.Azimuth dapat digunakan untuk kompas dan dikombinasikan dengan GPS bermanfaatuntuk augmented reality. Dengan GPS kita bisa mengetahui posisi device, tapi kita tidakmengetahui ke arah mana device menghadap. Tetapi jika GPS dikombinasikan denganinformasi azimuth dan pitch maka dapat diketahui ke arah mana device menghadap. Rolldan pitch juga dapat digunakan untuk mengontrol game.
  • 95. versi Mei 2013 95Contoh Augmented Reality(foto: nilsmengedoht http://www.flickr.com/photos/nilsmengedoht/5109833017/)Berikut adalah contoh kode untuk mendapatkan tiga orientasi tersebut, penjelasan ada didalam kode. Pertama, tambahkan tiga Large textview pada layout, beri nama tvAzimuth,tvPitch dan tvRoll.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.view.Menu;import android.widget.TextView;public class MainActivity extends Activity implements SensorEventListener {private SensorManager mSensorManager;private Sensor accel;private Sensor magneto;private TextView tvAzimuth,tvPitch,tvRoll;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
  • 96. versi Mei 2013 96mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){//device memiliki accelerometer,lanjutkanaccel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);magneto = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);//register listenermSensorManager.registerListener(this, accel,SensorManager.SENSOR_DELAY_NORMAL);mSensorManager.registerListener(this, magneto,SensorManager.SENSOR_DELAY_NORMAL);tvAzimuth = (TextView) findViewById(R.id.tvAzimuth);tvPitch = (TextView) findViewById(R.id.tvPitch);tvRoll = (TextView) findViewById(R.id.tvRoll);}else {//tidak punya sensor , tampilkan pesan error}}float[] mGravity;float[] mGeomagnetic;float azimuth;float pitch;float roll;public void onSensorChanged(SensorEvent event) {//menggunakan clone, agar persis samaif (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)mGravity = event.values.clone();;if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)mGeomagnetic = event.values.clone();;if (mGravity != null && mGeomagnetic != null) {float R[] = new float[9];float I[] = new float[9];//ambil rotationmatrixboolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);if (success) {float orientation[] = new float[3];SensorManager.getOrientation(R, orientation);// orientation akan terisi: azimut, pitch and roll// orieantation[0]:azimuth; orieantation[1]:pitch orieantation[2]:roll// azimuth adalah arah utara-selatan-timur-barat//dengan Math.toDegreee hasilnya -180 sd 180azimuth = (float)Math.toDegrees((double)orientation[0]);//dikonversi jadi 0 sd 360// 0=Utara, 90=Timur, 180=Selatan, 270=Baratazimuth = (azimuth + 360) % 360;//print dua angka belakang koma, agar mudah dibacatvAzimuth.setText("Azimuth="+String.format("%6.2f",azimuth));//pitch adalah rotasi kedepan & belakang//bayangkan pesawat yg sedang dogfight dikejar musuh//kemudian naik berputar sehingga berada di belakang musuhnyapitch = (float) Math.toDegrees((double)orientation[1]);pitch = (pitch + 360) % 360;tvPitch.setText("Pitch="+String.format("%6.2f",pitch));
  • 97. versi Mei 2013 97//roll adalah rotasi ke kiri dan kekanan//bayangkan pesawat yg sedang berbelok kekiri dan ke kananroll = (float) Math.toDegrees((double)orientation[2]);roll = (roll+ 360) % 360;tvRoll.setText("roll="+String.format("%6.2f",roll));}}}@Overrideprotected void onPause() {//app kehilangan fokus (misal user menerima telp),//lepaskan listener sensorsuper.onPause();mSensorManager.unregisterListener(this);}@Overrideprotected void onResume() {//app kembali, daftarkan lagi listenersuper.onResume();mSensorManager.registerListener(this, accel,SensorManager.SENSOR_DELAY_NORMAL);mSensorManager.registerListener(this, magneto,SensorManager.SENSOR_DELAY_NORMAL);}@Overridepublic void onAccuracyChanged(Sensor arg0, int arg1) {// TODO Auto-generated method stub}}Jalankan di device dan coba lakukan gerakan pitch, roll dan yaw dan perhatikan angkayang didapat.Catatan: Penjelasan rinci tentang rotationmatrix dapat diperoleh di:http://gentlenav.googlecode.com/files/DCMDraft2.pdfLocation APIDengan GPS (Global Positioning Service), suatu device dapat diketahui posisigeolokasinya. GPS menggunakan 24 satelit yang memancarkan sinyal secara bersamaan.Sinyal berisi waktu kirim dan posisi satelit. Device akan menerima sinyal satelit itusecara pasif (device tidak memancarkan sinyal, hanya menerima). Berdasarkankecepatan sinyal sampai ke device maka dapat ditentukan jarak antara device dengansatelit. Minimal diperlukan 4 satelit berbeda untuk menentukan lokasi. Selain GPS, Rusiamengembangkan sistem serupa yang disebut GLONASS dan Eropa mengembangkanGalileo.Hampir semua device Android mendukung GPS dan sebagian mendukung kombinasiGPS + GLONASS. Selain itu Android mendukung penentuan lokasi berbasis network
  • 98. versi Mei 2013 98yang memanfaatkan cell tower dan wifi. GPS lebih akurat dibandingkan network locationprovider, tetapi membutuhkan waktu lebih lama, akses ke langit dan lebih boros batere.Android menyediakan location API yang mengatur provider lokasi (GPS, network ataupasif).Kita akan mencoba membuat aplikasi sederhana yang memanfaatkan lokasi. Untuk lebihmemahami proses pengambilan lokasi, jalankan app langsung pada device (lihat subbabaccelerometer untuk caranya).Buat project baru. Edit AndroidManifest.xml karena app membutuhkan ijin dari useruntuk mengakses lokasi. Gunakan ACCESS_COARSE_LOCATION untuk lokasiberdasarkan network dan ACCESS_FINE_LOCATION untuk lokasi berdasarkan GPS.Jika kita menggunakan FINE_LOCATION maka tidak perlu lagi memintaCOARSE_LOCATION karena otomatis akan masuk.Untuk mengambil lokasi, kita akan activity yang meng-implement LocationListener dankemudian dipassing ke LocationManager.Pertama tambahkan tiga textview dalam activity_main.xml. Ganti id dengan tvStatus,tvLat dan tvLng.Berikut adalah code untuk class MainActivity, perhatikan comment yang ada. Jalankanlangsung di-device.import android.location.Criteria;
  • 99. versi Mei 2013 99import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.text.format.Time;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity implements LocationListener {TextView tvLat;TextView tvLng;TextView tvStatus;double lat;double lng;long minTime;float minDistance;String locProvider;LocationManager locMgr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvStatus = (TextView) findViewById(R.id.tvStatus);tvLat = (TextView) findViewById(R.id.tvLat);tvLng = (TextView) findViewById(R.id.tvLng);// ambil location managerlocMgr = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);//ambil lokasi terakhir berdasarkan network agar cepat//user dapat kesal jika diawal menunggu terlalu lama app mendapatkan lokasitvStatus.setText("ambil lokasi terakhir berdasarkan network");locProvider = LocationManager.NETWORK_PROVIDER;Location lastKnownLocation = locMgr.getLastKnownLocation(locProvider);lat = lastKnownLocation.getLatitude();lng = lastKnownLocation.getLongitude();tvLat.setText(String.valueOf(lat));tvLng.setText(String.valueOf(lng));//sambil user melakukan aktivitas2 (misalnya)//maka ambil lokasi yang lebih akurat dan terus mendengarkan//perubahan lokasi device//selanjutnya plih provider yang tinggi akurasinya//dengan mengeset Criteria, tapi ingat semakin tinggi//akurasi maka semakin boros menggunakan batereCriteria cr = new Criteria();cr.setAccuracy(Criteria.ACCURACY_FINE);//contoh penggunaan criteria yang lain://akurasi relatif rendah, tapi paling hemat batere//cr.setAccuracy(Criteria.ACCURACY_COARSE);//cr.setPowerRequirement(Criteria.POWER_LOW);
  • 100. versi Mei 2013 100//berdasarkan kriteria, sistem akan memberikan//provider yang paling tepatlocProvider = locMgr.getBestProvider(cr, false);//1 menit: waktu refresh lokasi dalam milidetik (1*60*1000)//pilih selama mungkin untuk menghemat batere tapi//user masih bisa menerima//long minTime = 1 * 60 * 1000;minTime = 5 * 1000; //lima detik//posisi pergeseran dalam meter//lokasi akan diupdate jika telah melewati batas distanceminDistance = 1;//onResume akan dipanggil dan mulai mendengarkan pergantian lokasi}@Overrideprotected void onResume() {//mulai mendengarkan dari awal dan juga saat dibangunkan dari pausesuper.onResume();locMgr.requestLocationUpdates(locProvider, minTime, minDistance, this);}@Overrideprotected void onPause() {//lepaskan listener, agar tidak memakan resources saat dipausesuper.onPause();locMgr.removeUpdates(this);}@Overridepublic void onLocationChanged(Location loc) {//dipanggil saat lokasi berubah atau waktu refershlat = loc.getLatitude();lng = loc.getLongitude();tvLat.setText(String.valueOf(lat));tvLng.setText(String.valueOf(lng));Time now = new Time();now.setToNow();tvStatus.setText("Direfresh berdasarkan: "+locProvider+" Waktu: "+now.hour+":"+now.minute+":"+now.second);}@Overridepublic void onProviderDisabled(String provider) {}@Overridepublic void onProviderEnabled(String provider) {}
  • 101. versi Mei 2013 101@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic 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;}}Jika dijalankan maka pada saat awal lokasi akan diisi dengan cepat berdasarkan dataterakhir (network). Perhatikan icon GPS di kiri atas yang menyatakan GPS diaktifkan.Setelah beberapa saat (bawa device ke dekat jendela atau ruang terbuka). Maka akanmuncul lokasi berdasarkan GPS yang diupdate setiap 5 detik. Jika anda berada di dalamruangan tertutup, maka layar dibawah tidak akan pernah muncul karena lokasi GPS tidakpernah didapatkan:TBD: caching lokasi (http://developer.android.com/guide/topics/location/strategies.html).Tip: Untuk mendapatkan lokasi berdasarkan GSM, pastikan uncheck Settings ->Applications -> Development -> Allow mock locationsLatihan:Buatlah app yang menyimpan data lokasi latitude, longitude, dan dataaccelerometer (x,y,z) untuk suatu perjalanan dengan kendaraan (motor/mobil).Simpan data tersebut beserta waktu pengambilan data ke dalam database.
  • 102. versi Mei 2013 102Koneksi dengan ServerAda beberapa alasan diperlukan koneksi dengan server diantaranya:1. Device memiliki beberapa keterbatasan (komputasi, space). Server dapatdigunakan untuk memproses data dan hasilnya saja yang akan digunakan didevice.2. Sinkronisasi data. Pengguna dapat mengambil data terkini atau mengupload datatambahan.Sebelum memulai, pastikan emulator telah terhubung dengan internet, jalankan browserdan coba buka salah satu website.Jika tidak terhubung dengan internet, dapat digunakan server local seperti Apache atauPhpMyAdmin.PENTING: Tambahkan di AndroidManifest permission untuk koneksi internet.Tanpa menambahkan ini, program anda tidak akan berjalan!Letakkan permission ini di atas application (gambar bawah)Buat project baru dan tulis code berikut:
  • 103. versi Mei 2013 103Tambahkan class GetDataTask yang merupakan turunan dari Asynctask sebagai berikut.Ganti isi variabel url jika Anda menggunakan localhost:
  • 104. versi Mei 2013 104Google MapTBD: Cek ulang apa masih valid codenyaGoogle Map adalah fitur yang disediakan oleh Google, dan bukan standard Android.Sebelum memulai, pastikan Google API sudah terinstall untuk platform target dan AVDuntuk Google API juga sudah ada. Jika belum, silahkan update terlebih dulu.Catatan:Baca ini http://stackoverflow.com/questions/7841494/cannot-find-google-apis-for-android-sdk jika GoogleAPI tidak ditemukan di Android SDK.Diperlukan key yang didapat dari Google untuk menggunakan fasilitas ini.Baca terlebih dulu https://developers.google.com/maps/documentation/android/mapkeyKita akan membuat mapkey sementara yang dapat digunakan selama pengembangan.Pertama-tama cari lokasi keystore untuk debug.Dalam Eclipse, pilih Window  Preferences  klik Android, klik Build. Catat nilai“default debug keystore”.Sebagai contoh, dari gambar diatas lokasi keystore adalah dic:Usersuser.androiddebug.keystoreKemudian cari posisi keytool di JDK Java. Biasanya terdapat di:c:Program FilesJavajdk1.7.0binLalu gunakan Start  cmd, jalankan keytool dengan sintaks sebagai berikut. Sesuaikanlokasi debug.keystore dengan yang ada di komputer anda. Ingat, saat ditanya passwordketikkan „android‟ (tanpa tandapetik).
  • 105. versi Mei 2013 105keytool -v -list -keystore C:Usersuser.androiddebug.keystoreEnter keystore password: [ketik android]Hasilnya akan seperti berikut, ambil hanya nilai MD5 saja.Dengan nilai certificate fingerprint MD5, kita dapat memperoleh mapkey melalui: (andaharus memiliki account Google terlebih dulu)https://developers.google.com/android/maps-api-signupMasukan fingerprint, klik generate API Key, maka didapatlah API key untuk mengaksespeta.Selanjutnya buat project baru Android. Saat menentukan target, pilih Google API.Artinya selain splatform standard, ditambahkan Google APILangkah pertama adalah merubah manifest.xml, tambahkan ijin untuk mengaksesinternet dan lokasi dan menggunakan library google maps. Pastikan <uses-library ..> ada didalam <application> .
  • 106. versi Mei 2013 106Selanjutnya isi main.xml dengan code sebagai berikut, ganti isi apiKey dengan key yangtelah diperoleh dari google sebelumnya:Di activity utama, tambahkan kode berikut, perhatikan bahwa activity diturunkan dariMapActivity.Saat program dijalankan, seharusnya akan tampil peta dunia.ZoomMenambahkan zoom sangat mudah, tambahkan dua baris berikut ke dalam onCreate.Ubah PosisiUntuk mengganti posisi peta, dapat digunakan method setCenter() dengan parameterGeoPoint. GeoPoint menyimpan posisi latitude dan longitude dalam integer untukmenghemat memori dan mempercepat proses. Oleh karena itu koordinat perlu dikali 1E6terlebih dulu. Sedangkan untuk mengatur zoom, dapat digunakan method setZoom.Tambahkan code berikut pada onCreate:
  • 107. versi Mei 2013 107Menambahkan LayerUntuk menambahkan layer berupa point di peta, dapat digunakan class ItemizedOverlay.Class ini berisi informasi objek yang akan ditambahkan dipeta dan aksi jika objektersebut ditap.Tambahkan class baru di project peta kita, beri nama PointsOverlay yang merupakanturunan dari ItemizedOverlay.Tambahkan kode berikut
  • 108. versi Mei 2013 108Kemudian di oncreate activity utama, tambahkan kode berikut, set zoom level ke 16.
  • 109. versi Mei 2013 109TAMBAHAN DAN PERBAIKAN MODUL BERIKUTNYA:FragmentAsyncTask  dibahas di animasi, tapi perlu yang lebih generikServiceNotificationNavigationBaro ShareActionProvidero Dropdown NavigatorSQLite Update dan Deleteo delete, update, select satu recordKoneksi dengan BlueToothAnimasi canvas berbasis tileo drag drop objek

×