Oleh :
PUJIANTO, S.Kom
FAKULTAS TEKNOLOGI INFORMASI UNIVERSITAS BUDI LUHUR
JAKARTA 2012
i
KATA PENGANTAR
Assalamu’alaikum warahmatullahi wabarakatuh. Alhamdulillahirabbilalamin, banyak nikmat yang Allah berikan, tetapi sedikit sekali yang kita ingat. Segala puji hanya layak untuk Allah Tuhan seru sekalian alam atas segala berkat, rahmat, taufik, serta hidayah-Nya yang tiada terkira besarnya, sehingga penulis dapat menyelesaikan modul pembelajaran perkuliahan dengan judul ”MOBILE PROGRAMMING”. Dalam penyusunannya, penulis memperoleh banyak bantuan dari berbagai pihak, karena itu penulis mengucapkan terima kasih yang sebesar-besarnya kepada: Kedua orang tua dan segenap keluarga besar penulis yang telah memberikan dukungan, kasih, dan kepercayaan yang begitu besar. Dari sanalah semua kesuksesan ini berawal, semoga semua ini bisa memberikan sedikit kebahagiaan dan menuntun pada langkah yang lebih baik lagi. Meskipun penulis berharap isi dari modul ini bebas dari kekurangan dan kesalahan, namun selalu ada yang kurang. Oleh karena itu, penulis mengharapkan kritik dan saran yang membangun agar skripsi ini dapat lebih baik lagi. Akhir kata penulis berharap agar makalah ini bermanfaat bagi semua pembaca.
Jakarta, 12 Oct 2012
ii
LEMBAR PENGESAHAN MODUL PRAKTIKUM FAKULTAS TEKNOLOGI INFORMASI
UNIVERSITAS BUDI LUHUR
Mata Kuliah : Pemrograman Android Penyusun : Pujianto, S.Kom
Jakarta, tgl bln thn
Dekan Ketua Program Studi
Fakultas Teknologi Informasi Sistem Komputer
iii
DAFTAR ISI
Halaman
KATA PENGANTAR ... ii
UNIVERSITAS BUDI LUHUR ... ii
DAFTAR ISI ... iii
Pertemuan 1 ... 1
Dasar Pemrograman Android ... 1
Pertemuan 2 ... 10
APLIKASI PERTAMA : Hello World ... 10
Pertemuan 3 ... 22
WIDGET ... 22
Pertemuan 4 ... 39
Dialog ... 39
Pertemuan 5 ... 49
Activity dan Intent... 49
Pertemuan 6 ... 59
Layout Manager ... 59
Pertemuan 7 ... 73
Action Bar ... 73
Pertemuan 8 ... 80
Ujian Tengah Semester ... 80
Pertemuan 9 ... 81
Penyimpanan Data ... 81
Pertemuan 10 ... 101
File ... 101
Pertemuan 11 ... 109
Membuat Aplikasi Client Server Project ... 109
Pertemuan 12 ... 129 Grafik 2D ... 129 Pertemuan 13 ... 144 Sensor ... 144 Pertemuan 14 ... 160 Google Map ... 160
iv Pertemuan 15 ... 169 Sms Gateway ... 169 DAFTAR PUSTAKA ... 177
1
Pertemuan 1
Dasar Pemrograman Android
1. Dasar Pemrograman Android
Membangun Aplikasi Android sangat mudah, default untuk bahasa pemrograman yang digunakan oleh Android adalah java. Tidak semua fitur java yang ada digunakan akan tetapi sebagian dari java yang sering disebut dengan Dalvik Virtual Machine. Beberapa bagian kecil dari Android:
A. Activity
Activity merupakan container untuk User Interface (UI). Sebuah Aplikasi Android terbangun dari satu atau beberapa Activity
B. Intents
Intent merupakan sistem pesan utama yang menjalankan Android. Intent terdiri dari Action yang harus dijalankan (Tampil, Ubah, Dial, dll) dan Data. Intent digunakan untuk memulai aktivitas dan komunikasi antar bagian dari sistem Android.
Suatu aplikasi dapat mengirimkan atau menerima intent 1) Mengirim Pesan dengan Intent
Ketika suatu aplikasi mengirimkan suatu intent, aplikasi mengirimkan pesan memberitahukan Android untuk menjalankan sesuatu. Misal: memberitahukan Android untuk menjalankan suatu Activity dari aplikasi atau menjalankan aplikasi lain.
2) Mendaftarkan Intent Receiver
Mengirimkan pesan dengan Intent bukan berarti sesuatu selanjutnya akan terjadi secara otomatis. Aplikasi harus mendaftarkan intent receiver yang memperhatikan intent dan memberitahukan Android apa yang harus dilakukan.
C. Cursorless Controls
Perangkat Android menggunakan jari pengguna sebagai input. D. Views dan Widgets
2 View merupakan elemen dasar UI (User Interface). Beberapa contoh view antara lain: : (1) ContextMenu, (2) Menu, (3) View, (4) SurfaceView.
Widgets adalah elemen UI yang lebih canggih. Merupakan control untuk interaksi antara sistem dengan pengguna. Beberapa contoh Widgets antara lain: (1) Button, (2) CheckBox, (3) DatePicker, (4) DigitalClock, (5) Gallery, (6) FrameLayout, (7) ImageView, (8) RelativeLayout, (9) PopupWindow.
E. Asynchronous Calls
Android memiliki sebuah class yang AsyncTask yang memungkin aplikasi menjalan beberapa operasi pada waktu yang bersamaan, tanpa harus mengatur bagaimana thread berjalan secara khusus. Network Communication (Internet), Media Processing, dan berbagai proses lain yang mengharuskan pengguna menunggu.
F. Background Service
Services merupakan aplikasi yang berjalan di belakang dan tidak terlalu penting memiliki UI.
2. Fitur Perangkat Keras Android
Perangkat Android memiliki beberapa fitur perangkat keras didalamnya, yang dapat dimanfaatkan developerdalam membangun aplikasi.
A. Touchscreen
Perangkat Android memiliki fitur layar sentuh (touchscreen) yang memberikan beberapa kemungkinanan bagi pengguna untuk berinteraksi dengan aplikasi dengan menggunakan jari. Pengguna dapat melakukan swipe, flip, drag, dan pinch untuk zoom. Android juga mendukung multitouch yang berarti keseluruhan layar dapat disentuh dengan satu atau lebih jari pada saat yang bersamaan.
3 Sistem operasi Android mendukung GPS yang memungkinkan developer untuk mengakses lokasi pengguna. Contoh aplikasi yang memanfaatkan GPS adalah Aplikasi Peta (Map) yang menunjukkan lokasi pengguna dan memberikan petunjuk untuk menuju suatu lokasi. C. Accelerometer
Android mendukung Accelerometer, yaitu perangkat yang digunakan untuk mengukur percepatan. Accelerometer dapat memberitahukan apabila suatu Perangkat Android bergerak, atau terguncang, atau berbalik arah posisinya.
D. SD Card
Android memiliki fitur yang memungkinkan pengguna atau aplikasi untuk mengakses (menyimpan atau membuka) file pada SD Card. SD Cardmerupakan media penyimpanan medium yang digunakan Perangkat Android dan beberapa perangkat mobile lain non Android sebagai media penyimpanan.
3. Fitur Perangkat Lunak Android
Android memiliki banyak fitur perangkat lunak yang dapat digunakan oleh developer dalam mengembangkan aplikasi. Beberapa fitur populer yangakan dijabarkan disini.
A. Internet
Kemampuan akses internet pada Android memberikan banyak keunggulan. Berbagai informasi secara real-time dapat diperoleh dengan mudah dengan internet. Contoh, sebagai pengguna, dapat menggunakan internet untuk melihat jadwal pemutaran film bioskop, cuaca suatu area, jadwal penerbangan dan lainnya. Sebagai developer, dapat menggunakan internet untuk akses secara real-time kepada data, updatedata. Developer juga dapat menggunakan internet untuk menyimpan berbagai asset untuk kemudian digunakan suatu aplikasi, seperti dilakukan Pandoradan YouTube. Dengan internet dapat dibangun model aplikasi yang disebut client-server computing. Contoh lain, aplikasi peta, mengakses data peta dan GPS dari web server.
4 B. Audio dan Video Support
Sistem operasi Android memungkinkan developer menyertakan audio dan video dalam aplikasi dengan mudah. Berbagai standar format audio dan video didukung.
C. Contact
Android memungkinkan akses ke contacs yang tersimpan dapat Perangkat Android. Developer dapat menggunakan fitur ini untuk menampilkan contacts dalam cara baru yang berbeda. Hal lain yang dapat dilakukan adalah membangun aplikasi yang menggabungkan antara contacts dengan GPS, yang memberikan notifikasi kepada pengguna jika pengguna berada di dekat alamat satu contactyang ada. D. Security
Android memungkinkan aplikasi untuk melakukan banyak hal. Akan tetapi Android juga menyiapkan mekanisme keamanan berupa permission berkaitan dengan beberapa tugas. Contoh: Download image dan menyimpannya di SD Card, maka harus disetujui terlebih dahulu permission untuk mengakses SD Card.
E. Google APIs
Sistem operasi Android memungkinkan dengan tidak terbatas membuat panggilan telepon, mengorganisasi contacts atau meng-install aplikasi. Developer dapat mengintegrasikan peta (map) ke dalam suatu aplikasi dengan menggunakan Maps API yang mengandung Map Widgets. Berbagai fitur dapat ditambahkan dengan Maps API, antara lain: (1) Menampilkan suatu lokasi di peta, (2) Mendapatkan panduan navigasi, (3) Komunikasi data antara aplikasi dengan clouds.
4. Instalasi Eclipse
Untuk membuat program android, ada beberapa program yang harus di instal Antara lain:
5 Untuk mendapatkan Java SDK terbaru, anda dapat mendownload di http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
B. SDK ADT Bundle for Windows
Download SDK ADT Bundle for Windows di http://developer.android.com/sdk/index.html. Setelah Download ekstrak file tersebut, seperti terlihat pada gambar dibawah ini.
Didalam folder tersebut terdapat 2 folder :
Untuk membuat project aplikasi android jalankan eclipse.exe terlebih daluhu yang ada dalam folder eclipse dengan cara double click.
6 Lalu akan tampil Workspace Launcher, pilih folder yang berfungsi sebagai tempat project android.
7
5. Mebuat Virtual Device Manager
Buat virtual device terlebih dahulu sebelum menjalankan project android. Berikut ini cara-cara AVD (Android Virtual Device)
A. Pilih Menu AVD
8 C. Setting konfigurasi seperti terlihat pada gambar, lalu Ok.
D. Untuk menjalankan AVD, pilih AVD yang telah kita buat lalu Start
9 F. Tampilan Emulator Android akan muncul, tunggu beberapa waktu.
10
Pertemuan 2
APLIKASI PERTAMA : Hello World
Latihan pertama yang akan kita pelajari adalah membuat aplikasi Hello World. Untuk memulai, jalankan Eclipse, pilih File New Android Application Project.
Isi seperti gambar dibawah, jangan lupa ganti nama package. Package name harus unik, aturan yang biasa digunakan adalah menggunakan nama website organisasi anda (dalam urutan yang dibalik), ditambah dengan nama applikasi. Misalkan nama website organisasi anda adalah puji.com, maka nama package adalah: com.puji.namapp. Jika nama web organisasinya budiluhur.ac.id, maka nama packagenya: id.ac.budiluhur.puji.namaapp.
Selanjutnya pilih next sampai untuk activity pilih “New Android Applicatoin” dan Next.
11 Selanjutnya pilih next sampai untuk “Configure Launcer Icon” dan Next.
Selanjutnya pilih next sampai untuk “Create Activity” Pilih “Blank Activity” dan Next.
12 Terakhir Finish
Sekarang coba kita lihat apa yang dihasilkan secara otomatis.
Komponen user interface untuk app Android disimpan di direktori /res/layout dalam format XML. Dalam project ini secara otomatis dibuat activity_main.xml Pertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untuk mengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml untuk melihat format XML-nya. Komponen user interface dalam Android didefinisikan didalam XML. Jadi anda dapat mengubah elemen
13 tampilan dengan dua cara: melalui graphical layout atau langsung mengedit file xml-nya.
14 Sekarang coba buka source code. Lihat package explorer, buka src, package dan klik MainActivity.java
Dapat dilihat file yang otomatis di bangkitkan ADT
Jalankan project android dengan cara : klik kanan project HelloWorld->Run
15 Selamat! Anda telah menjalankan app pertama anda. Jangan tutup emulator ini, Eclipse selanjutnya akan menggunakan emulator yang sudah terbuka ini sehingga tidak perlu menjalankan yang baru.
Memodifikasi Project HelloWorld
Selanjutnya kita akan memodifikasi program ini dan menambahkan masukan nama dari user, lalu setelah user menekan tombol, akan keluar “Hello, [nama]. Terimakasih”
Pertama, melalui project explorer kembali pilih activity_main.xml yang berada di res/layout (gambar bawah).
Pilih tab “Graphical Layout”
Komponen-komponen user interface yang berada di bagian kiri, sering disebut “widget” atau “view”.
16 Pertama pilih widget TextField, pilih yang paling atas (plain text), lalu drag ke dalam form.
Lalu drag button di Form Widget, dan letakkan disebelah kanan text field.
Terakhir, drag teks “hello world” dari tengah ke dekat button. Jika posisi menjadi ‘berantakan’ jangan khawatir, atur ulang sehingga posisinya seperti dibawah.
17 Coba run untuk melihat hasil tampilan dari program ini. Jangan lupa, jangan
tutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang
kita akan menambahkan aksi yang akan dijalankan saat button diklik.
Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa yang diketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap komponen perlu diberi nama.
Kembali ke activity_main.xml. Klik Button kemudian lihat window properties yang berada di sebelah kanan, ganti Text dengan “OK” dan id dengan “buttonOk”
18 Lakukan hal yang sama untuk textfield, ganti id dengan txtNama
dan textview, ganti id dengan viewNama.
Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihan mengganti nama id menggunakan property.
19 Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan akan dipanggil. Set atribut android.onClik pada button dengan nama method yang akan menangani event tersebut (actionTampil).
Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java
(di direktori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak terupdate jika file xml tidak di-save secara eksplisit.
Sekarang kita perlu menambahkan code agar saat tombol diklik app akan mengeluarkan respon.
Melalui package explorer, kembali ke activity utama (MainActivity.java).
Kemudian buat satu method baru “actionTampil”. Pastikan nama
method sama dengan yang dicantumkan di activity_main.XML. Nama yang
20 Jalankan program, perhatikan tab Console di bagian bawah untuk memonitor proses emulasi. Isi teks dan tekan tombol.
Cara ini paling sederhana, tetapi programmer harus memastikan nama method pada XML sama dengan nama method di program. Jika nama method tidak sama, tidak akan muncul kesalahan pada saat program dicompile, tapi akan menyebabkan kesalahan pada saat runtime (saat button diklik). Alternatif lain adalah dengan menggunakan listener seperti code dibawah
Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu tergantung dari selera programmer dan standard code yang digunakan.
Tip: Jika id tidak dikenali seperti R.id.txtNama, R.id.viewNama dan seterusnya, buka kembali activity_main.xml lalu tekan ctrl-S (save)
21 Latihan:
Buatlah program untuk menghitung luas sebuah persegi panjang. Input adalah panjang dan lebar (dua edit text). Output adalah luasnya (panjang kali lebar). Gunakan method berikut untuk mengubah tipe string ke double.
Catatan: input dari method setText bertipe teks, sehingga nilai luas yang bertipe double harus dikonversi terlebih dulu menjadi teks. Gunakan String.valueOf(dblLuas) untuk mengkoversi double menjadi teks.
22
Pertemuan 3 WIDGET
Pada modul sebelumnya kita telah menggunakan input box, button dan label. Komponen user interface ini disebut widget. Beberapa widget dasar adalah: TextView, Button, Image, EditText, CheckBox, RadioButton, ListView.
Setiap widget memiliki property atau atribut yang mengatur bagaimana widget itu ditampilkan, seperti tinggi dan lebar widget. Property ini dapat diset melalui xml layout, property editor atau melalui program. Beberapa widget memiliki beberapa event yang ter-trigger berdasarkan aksi dari pengguna, misalnya event click pada button.
Detil property dan event untuk setiap widget dapat dilihat di:
http://developer.android.com/reference/android/widget/package-summary.html (scroll sedikit ke bawah, di bagian classes)
Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project baru.
A. Text View
TextView digunakan untuk menampilkan label teks. View ini sudah kita gunakan Beberapa contoh property dari TextView adalah android:textSize, android:textStyle, android:textColor. Coba tambahkan textview standard dengan atribut dibawah.
Hasil :
Catatan: pada atribut textSize, direkomendasikan menggunakan ukuran sp. sp merupakan singkatan dari scaled-pixel yang memperhitungkan kepadatan resolusi dan juga preferensi ukuran font dari pengguna.
B. Button
Button merupakan turunan dari TextView sehingga yang berlaku di textView juga berlaku di button. Tambahan property yang penting adalah onClick
23 Hasil :
C. ImageButton dan ImageView
ImageButton adalah turunan dari button, gunakan widget ini jika Anda ingin menggunakan image sebagai pengganti tulisan pada button. Sedangkan ImageView dapat digunakan untuk menampilkan image. Image yang akan ditampilkan dalam button diletakkan di direktori /res sesuai dengan resolusinya
/[project]/res/drawable-ldpi /[project]/res/drawable-mdpi /[project]/res/drawable-hdpi /[project]/res/drawable-xhdpi /[project]/res/drawable-xxhdpi
res merupakan singkatan dari “resource”, file-file yang berada di dalam direktori /res disebut dengan project resources.
ldpi digunakan untuk untuk device dengan layar low density atau resolusi rendah 120dpi (dot per inch), mdpi untuk medium (160dpi) , hdpi untuk high density (240dpi) dan xhdpi untuk ekstra high density (320dpi). Sedangkan xxhdpi untuk resolusi 480dpi. Saat ini sudah jarang device dengan resolusi ldpi.
Coba buka direktori tersebut, terdapat icon launcher untuk masing-masing resolusi (ic-launcher.png), dapat dilihat ukuran yang berbeda untuk setiap resolusi. Jadi untuk hasil yang maksimal, untuk setiap image yang akan anda gunakan harus disediakan 4 image untuk setiap resolusi (mdpi sampai dengan xxhdpi). Hal ini untuk mencegah gambar yang digunakan terlihat pecah atau terlalu kecil pada device dengan resolusi berbeda.
24 Misalnya kita akan menambah button dan image view. Sebagai sumber gambar kita akan menggunakan icon standard yang sudah ada direktori drawable. Di window palette, pilih images & media lalu “Image View” (paling kiri)
Pilih ic_launcher
Coba lakukan yang sama untuk widget “Image Button” sehingga tampilannya akan seperti ini
Coba jalankan dan klik terutama untuk button-nya.
Untuk menambahkan image bersama-sama dengan teks pada button, dapat digunakan komponen button (bukan ImageButton) lalu set atribut drawableLeft dengan image yang diinginkan. Coba tambah button, dan isi drawableLeft.
25 Hasilnya :
Coba ganti drawableLeft dengan drawableRight, drawableTop atau drawableButtom.
D. EditText
EditText digunakan untuk menerima input dari pengguna. Pada palette telah disediakan berbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan XML yang dihasilkan.
E. Spinner
Spinner digunakan untuk menampilkan pilihan seperti combo box. Pada palette telah disediakan, silahkan dicoba dan perhatikan XML yang dihasilkan.
Buat spinner id diganti dengan spinnerAgama. Tambahkan code program pada MainActivity.java seperti gambar di bawah ini
26 Hasil :
F. CheckBox
User dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette, Checkbox ada di bagian FormWidgets.
Coba tambahkan dua checkboxs lalu set atribut id dan text melalui window property. Tambahkan Button dan TextView di form untuk menampilkan hasil pilihan user. Sehingga tampilannya akan seperti ini.
Sedangkan XML-nya akan seperti ini, anda dapat langsung mengedit file XML ataupun melalui window property. Jangan lupa atribut onClick:
27 Tambahkan di activity code method “actoinHasil” sebagai berikut, perhatikan penggunaan isChecked untuk mengambil nilai apakah user meng-check pilihan:
28
G. RadioButton
Pada radioButton, hanya satu pilihan yang boleh aktif (mutual exclusive) di dalam satu group yang disebut radioGroup. Modifikasi program checkbox diatas, tambahkan radio group (bukan radiobutton) yang ada di Form Widget
Hasilnya:
Tambahkan button dan textview, lalu gunakan property untuk mengedit sehingga hasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel, radiobutton dengan rbLaki dan rbPerempuan dan id TextView dengan Latihan CheckBox:
Buat soal berikut yang penggunanya dapat memilih lebih dari satu: --- 1. Manakah kota dibawah ini yang merupakan ibu kota propinsi?
Bandung Bogor Banjarmasin Bontang
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik] ---
Jawaban yang benar adalah “Bandung” dan “Banjarmasin”. Setiap jawaban benar bernilai 10, tetapi setiap jawaban yang salah akan dikurangi 5. Jadi jika pengguna menjawab “Bandung”, “Bogor” dan “Banjarmasin” dan maka pengguna mendapat nilai 20 – 5 = 15. Tampilkan nilai ini.
Catatan: input dari method setText adalah teks, sehingga nilai integer harus dikonversi terlebih dulu menjadi teks. Gunakan Integer.toString(intNilai).
Periksa Nilai
29 tvHasilRadio. Tambahkan property onClick pada button dengan nama klikHasilRadio
Sedangkan code saat tombol diklik adalah sebagai berikut.Perhatikan pengunaan getCheckRadioButtonId yang mengambil idRadio yang dipilih oleh pengguna:
Catatan: Anda dapat mengeset atribut android:orientation pada RadioGroup menjadi horizontal agar radio button tersusun secara mendatar.
Latihan:
Buat soal berikut yang penggunanya hanya dapat memilih tepat satu: --- 1. Sebutkan ibu kota propinsi Sulawesi Tenggara?
Samarinda Kendari Palu Makasar
Nilai anda: [ditampilkan setelah tombol periksa nilai diklik] ---
Jawaban yang benar adalah “Kendari”. Jika pengguna memilih pilihan yang benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan mendapat nilai -2
Periksa Nilai
30
H. ListView
List view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll. Karena ukuran layar smartphone terbatas, listview merupakan salah satu widget terpenting dan paling sering digunakan untuk menampilkan kelompok informasi.
ListView dapat berbentuk sederhana sampai kompleks. Beberapa contoh
Kita akan mulai dengan membuat list sederhana seperti gambar di bawah:
Pertama, buat project baru lalu pilih Composite dan tambahkan ListView diactivity_main.xml
31 Ganti id list view dengan “listAngka”
Di activity utama “MainActivity.java”, tambahkan code sebagai berikut:
32 Pada code di atas, dibuat adapter berisi string untuk mengisi list. Sedangkan R.layout.simple_expandable_list_item1 adalah layout standard yang disediakan Android.
Bagaimana mengupdate isi listview saat program sedang berjalan?
Untuk mengupdate data pada contoh diatas, nilai array dapat langsung diubah lalu panggil method adapter.notifyDataSetChanged()untuk merefresh tampilan. Sebagai contoh, kita akan membuat button yang saat diklik akan mengubah item pertama:
Tambahkan button diatas listview
Tambahkan event onClick bernama “actionButton” dan kode pada MainActivity.java seperti berikut:
33
I. Composite ListView
Listview juga dapat digunakan untuk menampilkan struktur yang lebih rumit. Contoh berikut memperlihatkan listview dengan isi yang kita tentukan sendiri.
Untuk membuatnya, pertama buat project baru. Tambahkan ListView seperti pada contoh sebelumnya. Ganti id dengan listJudul.
Kemudian kita akan buat layout untuk setiap baris pada ListView yang berisi judul dan keterangan. Pilih project pada project explorer, lalu klik kanan Android Tools New Resources File
34 Catatan: alternatif lain membuat layout XML, klik kanan project new Android XML File.
Pilih resource type “Layout”. Beri nama file row.xml, pilih root element LinearLayout, XML akan dibuat di dalam direktori /res/layout. File row.xml ini akan menentukan layout dari setiap baris pada listview.
Pada row.xml yang baru digenerate tambahkan widget LargeText dan TextView (gambar bawah). Ganti Id kedua komponen itu. LargeText dengan tvJudul dan TextView dengan tvKeterangan.
Pada contoh di atas hanya digunakan dua widget (LargeText dan TextView), tapi sebenarnya apapun dapat dimasukkan di dalam layout ini. Misalnya Button, ImageView dan lainnya. Ini memungkinkan kita membuat ListView dengan isi yang kompleks.
Sekarang buat class untuk yang menampung data judul dan keterangan. Pada project explorer, pilih /src/[package], klik kanan new Class
35 Beri nama “DataList”
Berikut isi dari DataList. Class ini akan berisi data yang akan muncul di setiap baris.
Selanjutnya kita akan buat adapter untuk list. Fungsinya untuk “mengisi” setiap row dengan isi objek DataList.
Buat class dengan cara yang sama dengan sebelumnya (klik /src/[package], klik kanan, new class), beri nama DataAdapter, jadikan class ini turunan dari kelas ArrayAdapter.
Klik browse di dialog saat membuat class di bagian superclass (gambar bawahh)
Ketik Array…, maka akan muncul ArrayAdapter, pilih item tersebut (gambar bawah)
36 Isi class DataAdapter adalah sebagai berikut. Pada method getView, parameter pos adalah indeks baris. Perhatikan pengisian tvJudul dan tvKeterangan dengan data sesuai indeks.
Terakhir, di activity utama (MainActivity.java) tambahkan kode berikut:
37 Jika dijalankan, hasilnya akan seperti ini:
Latihan:
Buat program dengan tampilan seperti berikut, saat tombol diklik, maka isi list akan bertambah sesuai dengan nim dan nama. Tip: gunakan
38
Pengangan Click pada List View
Listview sering digunakan untuk menampilkan data master-detail yang jika di tap barisnya akan menampilkan detil pada layar terpisah. Listview juga dapat digunakan untuk menampilkan menu.
Untuk menangani tap pada listview, gunakan method setOnItemClickListener
Contoh berikut akan menampilkan dialog singkat jika baris ditekan, judul pada baris juga akan berubah menjadi warna merah. Berdasarkan kode pada contoh listview sebelumnya, tambahkan kode berikut (bagian yang dilingkari). Penjelasan tentang Toast ada di sub bab berikutnya.
39
Pertemuan 4 Dialog
A. DIALOG
Seringkali app perlu menyampaikan pesan sementara kepada pengguna, misalnya jika menampilkan informasi, melaporkan kesalahan atau memperlihatkan proses yang memakan waktu lama.
B. TOAST
Toast digunakan untuk menampilkan pesan yang kemudian akan menghilang dengan sendirinya tanpa interaksi dengan pengguna. Fokus juga tetap pada aplikasi dan tidak berpindah ke Toast. Kelebihan Toast adalah mudah untuk dibuat, sedangkan kelemahannya adalah pengguna dapat saja tidak melihat pesan yang dikandung Toast.
Untuk mencobanya, buat project baru, tambahkan satu button, beri label “Toast”
40 dan kode berikut pada activity_main.xml:
dan kode berikut pada MainActivity.java:
C. ALERT DIALOG
Jika yang diinginkan adalah dialog yang muncul dan harus ditutup secara manual oleh pengguna maka dapat digunakan AlertDialog. AlertDialog dapat menampilkan tiga button.
Tambahkan button pada program sebelumnya, beri label “AlertDialog”. Tambahkan code berikut untuk event onClick.
41 dan kode berikut pada MainActivity.java:
42 Selain setMessage dan setPositiveButton, dapat digunakan method setTitle, setIcon untuk mengeset judul dan icon message dan SetNeutralButton (button tengah) dan SetNegativeButton. Berikut contohnya . Ubah code program pada actionAlert
43 Hasil :
Di dalam Dialog kita juga bisa menambahkan widget. Tambahkan button pada program sebelumnya, beri label “WidgetDialog”. Tambahkan code berikut untuk event onClick.
44
public void actionWidget(View v) {
LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL);
final RadioGroup rg = new RadioGroup(this);
final RadioButton rbPria = new RadioButton(this); rbPria.setText("Pria");
final RadioButton rbWanita = new RadioButton(this); rbWanita.setText("Wanita");
rg.addView(rbPria, 0); rg.addView(rbWanita, 1); linearLayout.addView(rg);
AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle("ALERT WIDGET")
.setView(linearLayout)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub if(rbPria.isChecked()){
Toast.makeText(getApplicationContext(), "Pria", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "Wanita", Toast.LENGTH_SHORT).show();
} }
})
.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel(); }
});
AlertDialog alert = builder.create(); alert.show();
45 Hasilnya:
Apabila kita pilih “Pria” lalu tombol “OK” di klik maka akan mucul
46 Latihan:
Buat program dengan tampilan seperti berikut apabila saat tombol button diklik, maka akan tampil AlertDialog seperti gambar dibawah ini. Jika di tekan tombol “OK” maka akan menampilkan dialog yang sesuia apa yang di inputkan. Jika di tekan tombol “CANCEL” maka akan kembali. Tip : Unutk menampilkan agama gunakan “Spinner”
47
Logging
Fitur logging digunakan untuk memberikan keterangan apa yang sedang terjadi pada app. Manfaat utama fitur ini adalah untuk mendebug app.
Sebagai contoh, buka project yang pernah anda buat sebelumnya. Lalu pada bagian MainActivity onCreate tambahkan log sebagai berikut. “yw” adalah tag dan dapat diganti dengan string apapun.
Buka tab logcat dan jalankan program
Terlihat banyak message di dalam logcat, untuk memfilternya sesuai dengan tag yang kita tentukan sebelumnya, tambahkan filter (gambar bawah). Nama filter dapat diisi bebas.
48 Fitur filter yang lain adalah memfilter berdasarkan jenis lognya (verbose sampai dengan error), terutama untuk jenis error.
Pada contoh diatas kita menggunakan Log.i (info), selain itu dapat digunakan method Log.v(), Log.d(), log.w() dan Log.e() untuk verbose, debug, warn dan error.
Tips: untuk tag, dianjurkan menggunakan variabel yang ditempelkan di class activity (code dibawah)
publicclass MainActivity extends Activity {
privatestaticfinal String TAG = "MainActivity";
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG,"program dimulai");
49
Pertemuan 5 Activity dan Intent
Dalam materi sebelumnya, selalu digunakan satu activity. Tentu saja sebuah applikasi sering membutuhkan lebih dari satu activity. Activity adalah komponen terkecil penyusun Android App yang berisi satu kegiatan yang dapat dilakukan oleh pengguna.
Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah fasilitas untuk menghubungkan satu activity ke activity yang lain, baik untuk app yang sama maupun app yang berbeda. Intent juga digunakan untuk notifikasi event misalnya SD card dimasukkan, SMS masuk dan lain-lain.
Untuk lebih memahami activity dan intent, sekarang coba buka salah satu app android yang telah dibuat sebelumnya, lalu pada project explorer pilih AndroidManifest.xml. File XML ini berisi property aplikasi, termasuk di dalamnya activity dan intent
Klik xml-nya dibagian bawah
50 Selain itu ada tag intent-filter yang digunakan untuk memfilter intent yang dapat dihandle activity. android.intent.categori.LAUNCHER menyatakan activity ini adalah initial activity yang dapat dipanggil langsung oleh launcher sedangkan intent.action.MAIN menyatakan activity ini adalah initial activity tanpa data input dan tidak menghasilkan output.
Sekarang kita akan membuat contoh app yang memiliki dua activity.
Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat class baru: di project explorer klik package, klik kanan New Class. Beri nama class ini ActivityDua dan pastikan superclass kelas ini adalah android.app.Activity (gambar bawah)
51 Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut name dengan nama class lengkap dengan nama package dan label.
Penting: Tanpa menambahkan activity ke dalam AndroidManifest.xml, akan
terjadi force close saat program dijalankan.
52 Setelah itu jangan lupa di save (Ctrl+S). Dapat dilihat hasilnya pada AndroidManifest.xml
Sekarang kembali ke activity utama (MainActivity), tambahkan button di activity_main.xml, isi atribut onClick dengan clickButton. Buat implementasi method clickButton sebagai berikut, perhatikan pengunaan class Intent:
Dari kode diatas dapat dilihat bahwa intent merupakan struktur data (objek) yang ‘dilempar’ sebagai paramater ke method startActivity.
Jika program dijalankan hasilnya akan seperti ini. Terlihat label pada ActivityDua yang disimpan di dalam AndroidManifest.xml akan menjadi title.
53
Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat layout untuk activity tersebut. Ini mirip saat membuat layout baris pada ListView. Untuk membuat file layout, pilih project di project explorer, klik kanan, AndroidTools New Resources File. Pilih resource type “Layout”. Beri nama file activity_dua.xml, pilih root element LinearLayout (gambar bawah)
Tambahkan widget Large Text ke dalam layout, beri id “tvDua” dan save.
Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka class ActivityDua dan tambahkan kode dibawah dan coba jalankan.
Pertukaran Data antar Activity
Pada contoh sebelumnya, activity kedua dipanggil tanpa ada data yang dikirimkan dari activity utama ke maupun data kembali. Sekarang kita akan belajar bagaimana cara mengirim dan menerima data antar activity.
54
Mengirimkan data ke activity
Kita akan memodifikasi contoh pada app sebelumnya (app dengan dua activity). Pada MainActivity, ubah kode sebagai berikut, perhatikan method putExtra untuk menambahkan data yang akan dikirim.
Sedangakan di ActivityDua tambah kode sebagai berikut untuk menerima data. Method onStart ini akan otomatis dipanggil saat activity mulai dijalankan setelah onCreate. Coba jalankan kembali app ini.
Menerima data dari actvity yang dipanggil
Untuk mengirimkan dan menerima data dari activity, dapat digunakan method startActivityForResult.
Sebagai contoh, kita akan membuat activity yang memanggil activity lain, pengguna mengisi data pada activity tersebut dan mengirimkannya kembali ke activity utama. Kita akan memodifikasi program sebelumnya.
Catatan: jika anda mau program sebelumnya tidak hilang anda dapat menduplikasi project dengan mencopy-paste project tersebut pada package explorer.
Sekarang kita kembali ke activity utama MainActivity, gunakan method putExtra untuk menambahkan data ke intent. Pada startActivityForResult terdapat parameter angka 99 (silahkan ganti dengan angka atau konstanta apapun). Paremeter ini diperlukan karena satu activity bisa mengirimkan banyak intent dan diperlukan cara untuk membedakan antara satu intent dengan intent yang lain. Method onActivityResult akan dipanggil saat activity yang dipanggil telah selesai.
55 Selanjutnya kita akan menambahkan widget editText pada activity dua yang dapat diedit oleh pengguna dan hasilnya akan dikirimkan kembali ke activity utama. Buka res/layout/activity_dua.xml. Tambakan satu editText dan satu button. Beri nama etNama dan tambahkan android:onClick="clickButtonActDua" di button.
Sekarang kita akan membuat kode di activitydua yang akan mengisi editText dengan data yang dikirim dari activity utama dan setelah button ditekan mengirimkan hasil update ke activity utama. Buka file ActivityDua.java dan tambahkan kode berikut:
56 Jika dijalankan hasilnya sebagai berikut
Latihan Activity-Intent
Menggunakan listview (layar1), tampilkan daftar nama mahasiswa. Pengguna dapat men-tap nama (baris), dan kemudian app akan menampilkan informasi yang lebih detil berisi NIM, NAMA, ALAMAT dan NOHP (layar2). Pada layar informasi detil (layar2) tersebut ada button “EDIT” yang jika diklik akan membawa ke layar ketiga yang berisi editText untuk mengupdate data. Hasil update akan muncul baik di layar1 dan layar2
57 Activity Life Cycle
Pada contoh sebelumnya, kita telah menggunakan lebih dari satu activity. Setiap activity memiliki siklus seperti gambar dibawah. Saat pertama kali dijalankan activty akan berada dalam status active. Ketika user pindah app atau menjalankan activity lain maka status dapat berubah menjadi paused atau stopped. Setelah itu app bisa kembali active (user membuka kembali) atau di-destroy oleh Android (memori habis).
Kita dapat menangani setiap fase dari activity. Ini berguna misalnya untuk app game, pada saat activity berubah dari active menjadi paused, maka game juga harus otomatis dipaused dan jika activity di-kill oleh Android, maka state game perlu disimpan dan dikembalikan. Demikian juga untuk app yang menggunakan sensor, koneksi dengan sensor perlu dilepaskan saat app di-pause atau distop.
Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih terlihat walaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti menulis ke database karena akan memperlambat proses transisi ke activity lain. Umumnya onPause digunakan untuk tiga hal: menstop animasi atau aktivitas yang menggunakan banyak CPU; commit input dari user (misalnya draft email); melepaskan system resources seperti sensor atau kamera.
Saat activity berubah dari pause menjadi stop, maka akan dipanggil onStop(). Pada method ini dapat dilakukan komputasi yang kompleks untuk menyimpan state. Pada saat kondisi stop, activity sama sekali tidak muncul di layar dan fokus sudah berada di app lain.
Jika app kembali aktif, maka akan dipanggil onResume(). Pada method ini lakukan proses untuk mengembalikan kondisi app seperti semula (kebalikan dari onStop). Selain onResume, untuk state stop ada event lain yang terlibat yaitu onRestart. Hubungan keduanya dapat dilihat pada gambar bawah
Active/Running Paused
Stopped Destroyed
hilang fokus tapi masih visible
sistem kekurangan memori
sistem kekurangan memori
58 diambil dari:
http://developer.android.com/training/basics/activity-lifecycle/stopping.html
Dari gambar diatas, dapat dilihat urutan pada dari state stop menuju resumed urutannya adalah OnRestart() onStart() onResume()
Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab mengenai sensor.
59
Pertemuan 6 Layout Manager
. Untuk meletakan komponen (view) pada layar, android menggunakan layout manager. Karena ukuran layar device Android sangat beragam, tidak ada peletakan posisi widget secara eksak per pixel.
Terdapat empat jenis layout manager yang memiliki fungsi masing-masing. LinearLayout, TableLayout, RelativeLayout dan FrameLayout. Berikut akan dibahas lebih rinci untuk setiap layout.
A. Relative Layout
RelativeLayout mengatur posisi secara relatif berdasarkan posisi widget yang lain atau parentnya. Sebagai contoh, dua widget pada gambar di bawah. EditText posisinya relatif terhadap textView nama.
60 Untuk layout_width dan layout_height ada dua pilihan: match_parent (view berusaha sebesar parent) dan wrap_content (view hanya berusaha sebesar content yang berada di dalamnya). Sedangkan padding menyatakan jarak antara pinggir layar dengan komponen.
Perhatikan penggunaan atribut layout_toRightOf yang menyatakan bahwa EditText berada disebelah kanan label. Sedangkan atribut layout_baseLine digunakan agar TextView dan EditText aligned. Jika layout_baseLine dihapus efeknya akan sebagai berikut (Text View terlalu tinggi posisinya):
Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan widget lain adalah:
android:layout_above android:layout_below android:layout_toLeftOf android:layout_toRightOf.
Untuk mengatur posisi ada tambahan lima atribut: android: layout_alignTop, android:layout_alignBottom, android:layout_alignLeft, android:layout_alignBaseline
Contoh jika kita ingin menambahkan button sehingga posisinya sebagai berikut:
61 Artinya button tersebut dibawah dan disebelah kanan EditText.
Widget juga dapat diatur berdasarkan gravity android:layout_gravity ada beberapa pilihan untuk gravity ini: left, right, center_horizontal, center_vertical, bottom, top. Gravity ini juga berlaku untuk layout manager yang lain. Berikut adalah contohnya:
Hasilnya:
62 B. Table Layout
Untuk memilih layout manager, selain dengan cara manual dapat juga ditentukan membuat layout (File New Other Android XML Layout File). Saat muncul dialog berikut, pilih Root Element sebagai TableLayout.
Buatlah project :
TableLayout meletakan komponen dalam bentuk tabel (baris dan kolom), mirip seperti Table yang digunakan di HTML. Pengguna mendefinisikan baris dengan tag <TableRow> dan sistem secara otomatis mendefinisikan kolomnya. Contoh deklarasi berikut:
63 Gantir New Layout Type dengan “TableLayout”
64 Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan dua kolom dan dua baris.
Misalnya kita ingin agar EditText sampai ke bagian belakang, maka tambahkan android:stretchColumns="1" pada TableLayout. Maka kolom 1 akan terisi penuh.
65 Hasilnya:
Untuk menambahkan widget di kolom terntentu, gunakan aandroid:layout_column. Misalnya kita akan menambahkan TextView di
kolom 1 (ingat kolom dimulai dari 0). Ini bisa dilakukan dengan
menggunakan atribut android:layout_column. Tanpa atribut ini, TextView akan muncul di kolom 0
66 C. Frame Layout
Framelayout digunakan untuk menampilkan satu komponen dalam satu layar. Jika ada lebih dari satu widget, maka akan ditampilkan secara bertumpuk, walaupun posisi widget dapat diatur dengan gravity. Kita bisa menambahkan layout lain sebagai child di dalam frame layout.
Contoh untuk deklarasi berikut menampilkan dua ImageView (pastikan file image telah disimpan di direktori [project]/res/drawable-hdpi, [project]/res/drawable-ldpi dan [project]/res/drawable-mdpi )
Ubahlah layout dengan cara yang sama menjadi Framelayout dan kemudian Ubahlah file activity_main.xml seperti gambar di bawah ini
67 Hasilnya gambar akan bertumpuk seperti ini
D. LinearLayout
Sesuai dengan namanya, linear layout menyimpan widget dalam satu baris atau satu kolom (tergantung orientasinya).
Jika orientasinya vertical (android:orientation="vertical") maka hasilnya akan seperti ini
68 Sedangkan jika orientasinya horizontal (android:orientation="horizontal"), maka hasilnya akan seperti ini.
E. ScrollView
Dengan scrollview, layout seolah-olah memiliki layar yang lebih luas. Pengguna dapat melakukan scroll. Scrollview hanya mempunyai satu child dan umumnya adalah LinearLayout. Scrollview hanya dapat melakukan vertical scrolling, gunakan HorizontalScrollView untuk layout yang dapat discroll secara horizontal.
Jangan gunakan Listview bersama layout ini karena listview telah memiliki mekanisme scrolling tersendiri.
Berikut adalah contoh scrollview yang menghasilkan layout seperti ini yang dapat discroll. Dua button teratas menggunakan RelativeLayout yang disisipkan dalam ScrollView. Ini adalah contoh penggabungan antara dua layout.
69 Latihan Menggabungkan beberapa layout
Ubahlah default layout RelativeLayout dengan ScrollView dengan cara yang pernah di ajarkan .
Tambah kan layout LinearLayout(Vertical) didalam layout ScrollVew seperti pada gambar, dibawah ini
Ganti layout_width = ”match_parent” layout_height = ”wrap_content”
70 Kemudian Tambah kan RelativeLayout di dalam LinearLayout. Setelah itu tambahkan Widget dua buah Button di dalam Relative Layout. Dan tambahkan beberapa Widget Button di dalam LinearLayout. Seperti code di bawah ini
<ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ScrollView1" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="110dp" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="24dp" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Button" /> </RelativeLayout>
71 <Button android:id="@+id/button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button13" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button8" android:layout_width="wrap_content" android:layout_height="wrap_content"
72 android:text="Button" />
</LinearLayout> </ScrollView>
Latihan Layout
Berdasarkan hasil latihan activity-intent, pada layar2 dan layar3, tambahkan layout yang tepat agar tampilan widget rapi.
73
Pertemuan 7 Action Bar
Actionbar adalah bar yang berada diatas activity yang mulai diperkenalkan sejak Android 3. Action bar memperlihatkan identitas berupa judul dan icon activity, tempat fitur-fitur utama (misalnya search, shared, create dsb), dan dapat digunakan untuk navigasi global.
Beberapa contoh action bar:
(sumber: 8)
Untuk mengimplementasikan ActionBar pada Android dengan versi lebih kecil dari 3 dapat menggunakan library actionbarsherlock.com
Dalam aplikasi sebelumnya, sebenarnya kita secara default selalu membuat ActionBar karena minimal SDK diset 11 (Android 3.0). Coba buka MainActvity.java dan lihat function onCreateOptionMenu. Terlihat fungsi ini mengisi ActionBar dengan isi res/menu/main.xml
74 Coba lihat /res/menu/main.xml
Kita akan bahas lebih detil tentang ini pada bagian berikutnya. ActionItem
ActionItem berbentuk button atau text yang dapat diakses langsung dari ActionBar. Jika tidak cukup, maka actionitem akan muncul di overflow menu. Buat project baru, pastikan minimal SDK diisi dengan 11 (Android 3.0)
Kemudian buka /res/menu/main.xml. Isi dengan item sebagai berikut. Kita menambahkan dua item “Add” dan “Delete” yang akan muncul jika tempatnya cukup (“ifRoom”).
75 Kemudian :
Jangan lupa di simpan (Ctrl+S) untuk melihat perubahaannya
Lakukan cara yang sama untuk Delete sehingga terlihat file menu.xml seperti dibawah ini.
76 Saat dijalankan akan menghasilkan ActionBar sebagai berikut.
Sekarang kita akan buat aksi kalau “ADD” atau “DELETE” ditekan. Override fungsi onOptionsItemSelected dan cek hasil getItemId().
String Resources
Pada kode diatas kata “add” dan “delete” dimasukkan ke dalam kode. Ini bukan praktek yang baik (perhatikan warning pada /main.xml), karena akan menyulitkan jika app akan diporting untuk bahasa lain. Solusinya adalah dengan menggunakan string resources.
Pertama-tama, buka /res/values/strings.xml. Perhatikan bahwa secara default telah ada string untuk nama app (app_name) dan lainnya. Tambahkan add dan delete (gambar bawah). Jangan lupa save setelah selesai.
77 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”
Sedangkan untuk MainActivity.java, ganti dengan R.string.add dan R.string.delete.
Icon
Umumnya action bar menggunakan icon yang lebih mudah dikenali oleh pengguna. Untuk menambahkan icon, cara yang paling mudah adalah
mendownload Android design icon di:
http://developer.android.com/design/downloads/index.html
Setelah download dan ekstrak, pilih all_icons/holo_dark dan copy icon yang diinginkan (dengan Windows Explorer) ke direktori /res/drawable-hdpi, /res/drawable-mdpi dan /res/drawable-xhdpi. Ingat dalam pembahasan sebelumnya bahwa setiap resoulusi membutuhkan gambar yang terpisah.
78 Sesuai dengan penamaan standard untuk icon ActionBar, rename agar didahului dengan “ic_menu_” Untuk me-rename, klik kanan pada nama file refactor rename. Semua resolusi secara otomatis akan diganti. Sehingga hasilnya sebagai berikut:
Sekarang buka res/menu/main.xml dan tambahkan atribut android:icon
79 Jika kita ingin menambahkan teks disebelah icon, tambahkan nilai “withText” pada android:showAsAction sebagai berikut:
Jika dijalankan hasilnya tidak berubah. Mengapa? karena tidak cukup ruang untuk menambahkan teks. Coba ubah orientasi AVD menjadi landscape dengan ctrl-F11 maka tulisan akan muncul (gambar bawah). Untuk mengembalikan menjadi portrait tekan ctrl-F12.
Selain “ifRoom” dan “withText”, pilihan yang lain adalah “never” agar item hanya muncul di overlflow menu (gambar bawah)
Latihan:
Modifikasi latihan activity-intent , tambahkan action item “delete” dan “edit” saat detil data mahasiswa (layar2)
80
Pertemuan 8 Ujian Tengah Semester
81
Pertemuan 9 Penyimpanan Data
Android menyediakan beberapa cara untuk menyimpan data: file, relasional database dengan SQLlite dan pasangan key/value yang disebut sistem preferences. Untuk sharing antar aplikasi disediakan mekanisme yang disebut ContentProvider.
Shared Preferences
Shared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value untuk tipe data primitif (integer, double, string, booelan). SP cocok untuk penggunaan ringan seperti menyimpan setting aplikasi dan kondisi user interface misalnya pada saat activity masuk ke state sleep karena device menerima telepon. Data dalam shared preferences disimpan dalam device android dalam bentuk XML.
Ada tiga mode untuk shared preferences (SP)
MODE_PRIVATE: hanya aplikasi yang membuat SP yang dapat mengakses data MODE_WORLD_READABLE: aplikasi lain boleh membaca
MODE_WORLD_WRITEABLE: aplikasi lain boleh membaca sekaligus menulis. Shared Preference objek untuk activity diperoleh melalui method getPreferences(). Contoh Kode berikut memperlihatkan cara penggunaan SP. Jangan lupa memanggil commit!
82 Jalankan. Kemudian coba komentari bagian isi data, dan jalankan kembali
aplikasi.
Dapat dilihat data nama dan umur tersimpan walaupun aplikasi sudah ditutup.
Pertemuan 10 Topik Pertemuan 10
Latihan:
Buat applikasi yang menyimpan berapa kali aplikasi telah dijalankan. Tampilkan jumlah tersebut.
83 SQLite
SQLite adalah embedded database (hanya menggunakan sekitar 250KB memori) yang menyediakan fasilitas relational DBMS termasuk SQL. Referensi lengkap SQLite dapat dilihat di http://www.sqlite.org/ SQLite tidak hanya digunakan di Android.
Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan shared preference, tidak disediakan fasilitas agar aplikasi dapat membaca database aplikasi lain.
Untuk menggunakan SQLite, sangat dianjurkan menggunakan class helper untuk membuka dan menutup database, menginisiasi tabel dst. Helper juga digunakan saat melakukan upgrade struktur database jika suatu saat aplikasi diupdate. Class helper ini diturunkan dari class SQLiteOpenHelper.
Buatlah project baru :
Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data mahasiswa berupa nama dan nomor telpon. Pertama kita buat class helper terlebih dulu. Tambahkan ke dalam project tersebut satu class (ke project explorer, pilih src/nama package; klik kanan New Class). Pastikan superclass kelas ini adalah SQLiteOpenHelper. Beri nama class ini OpenHelper.
84 Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jika database diuprade.
85 Selanjutnya kita akan membuat class yang melakukan manipulasi terhadap data (insert, ambil data). Beri nama DbMahasiswa, source code DbMahasiwa adalah sebagai berikut: package com.example.latihansepuluh; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;
publicclass DbMahasiswa {
//class yang menampung record Mahasiswa publicstaticclass Mahasiswa {
public String nama;
public String telepon; }
private SQLiteDatabase db;
privatefinal Context con;
privatefinal OpenHelper dbHelper;
public DbMahasiswa (Context c) {
con = c;
dbHelper = new OpenHelper(con,"",null,0); }
publicvoid open() {
db = dbHelper.getWritableDatabase(); }
publicvoid close() {
db.close(); }
publiclong insertMahasiswa(String nama, String noTelp) { ContentValues newValues = new ContentValues(); newValues.put("NAMA", nama);
newValues.put("TELEPON", noTelp);
returndb.insert("MAHASISWA", null, newValues); }
86 Cursor cur = null;
Mahasiswa M = new Mahasiswa();
//kolom yang diambil
String[] cols = new String [] {"ID", "NAMA", "TELEPON"};
//parameter, akan mengganti ? pada NAMA=?
String[] param = {nama}; cur =
db.query("MAHASISWA",cols,"NAMA=?",param,null,null,null);
if (cur.getCount()>0) { //ada data? ambil
cur.moveToFirst(); M.nama = cur.getString(1); M.telepon = cur.getString(2); } return M; } }
Setelah kita membuat class helper dan class dbMahasiswa, sekarang kita akan memanfaatkan dua kelas tersebut. Kembali ke activity utama yaitu class MainActivity. Tambahkan kode dibagian onCreate sebagai berikut:
Selain tipe INTEGER dan TEXT yang digunakan pada contoh diatas, dapat digunakan tipe REAL, BLOB. Semua tipe lain seperti boolean, date harus dimasukkan ke dalam tipe tersebut. SQLite tidak melakukan pengecekan tipe, sehingga bisa saja memasukkan tipe.
87
Group By, Having, Order By
Pada kode sebelumnya dapat dilihat penggunaan db.query untuk mengambil data mahasiswa dengan nama tertentu.
Method query menerima tujuh parameter. Parameter pertama adalah nama table, parameter kedua adalah array kolom yang akan diambil (SELECT), parameter ketiga adalah bagian seleksi record (bagian setelah ‘where’), parameter keempat adalah isi bagian seleksi. Parameter 5, 6 dan 7 adalah bagian ‘group by’, ‘having’ dan ‘order by’.
Contoh penggunaan parameter 5-7 adalah sebagai berikut: jika kita menambahkan field ‘KELAS’ pada tabel MAHASISWA dan kita ingin menampilkan jumlah mahasiswa per kelas (contoh misalnya ada kelas A, B, C dst), tapi hanya kelas yang mempunyai anggota >1 dengan kelas terurut descending, maka query-nya adalah sebagai berikut:
select kelas, count(*) as jum from mahasiswa group by kelas
having jum > 1 order by kelas desc;
Maka di dalam program pemanggilan quernya adalah sebagai berikut:
RawQuery
Selain method query, tersedia juga rawQuery untuk memasukkan langsung query. Sebagai contoh, berikut perbandingan antara query dengan rawQuery
group by
88 Mana yang lebih baik? beberapa sumber mengatakan query lebih cepat dibandingkan rawQuery dan lebih mudah untuk dibaca.
Loop Semua Record
Untuk mengambil data semua record, dapat digunakan moveToNext() dalam loop seperti pada contoh berikut
alternatif lain yang dapat digunakan untuk loop semua record adalah adalah:
Mengisi ListView dengan Record
Listview dapat langsung dihubungkan dengan database dan untuk mencegah user interface yang tidak responsif (ANR: Application Not Responding), idealnya data diload di background.
Untuk mencapai hal ini dapat digunakan SimpleCursorAdapter, ContentProvider dan Loader. Sayangnya hal ini cukup kompleks (mudah-mudahan akan lebih disederhanakan di API berikutnya). Berikut adalah contoh penggunakan ketiga class tersebut.
89 Seperti dalam contoh sebelumnya, buat class helper yang merupakan turunan dari kelas SQLiteOpenHelper.
Catatan: untuk dapat menggunakan cursor adapter, table harus mengandung field _id (huruf kecil)
package com.example.latihansebelas;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION =1;
private static final String DATABASE_NAME ="dbMhs";
//cursoradapter mewajibkan nama _id
//harus _id dengan huruf kecil, JANGAN _ID private static final String TABLE_CREATE = "CREATE TABLE MHS (_id integer primary key autoincrement, " +
"nama text);";
90 CursorFactory factory, int version) {
super
(context,DATABASE_NAME,factory,DATABASE_VERSION); }
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//create database
db.execSQL(TABLE_CREATE); }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVer,
int newVer) {
//jika database diupgrade, hapus yang lama, buat yang baru
db.execSQL("DROP TABLE IF EXISTS MHS"); onCreate(db);
} }
Selanjutnya kita akan membuat class Contentprovider untuk mengakses tabel.
Catatan:
Biasanya Contentprovider dibuat agar data app kita dapat diakses oleh app lain. Tapi class Contentprovider juga dapat digunakan di app sendiri secara private (tidak bisa diakses app lain). Keuntungan content provider adalah:
1. Dapat dieksekusi secara asynchronus, sehingga menghindari error app not responding.
2. Memberikan akses tunggal ke data.
3. Memudahkan hubungan antara view (widget) dengan data melalui ContentObserver milik ContentResolver.
4. Dimanfaatkan untuk rest client app.
91 Class ini merupakan turunan dari ContentProvider (gambar bawah)
Untuk tahap pertama hanya insert dan query yang dibuat. Update dan delete akan dibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk widget yang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat di MainActivity nanti. package com.example.latihansebelas; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;
public class MhsContentProvider extends ContentProvider {
// database
private DbHelper database;
// konstanta2 dibawah mendefinisikan bagaimana contentprovider ini diakses