Android
Android
http://creativecommons.org/licenses/by-nc-sa/3.0/
Modul ini bebas dicopy, didistribusikan, ditransmit dan diadaptasi/dimodifikasi/diremix dengan syarat:
tidak untuk komersial, pembuat asal tetap dicantumkan dan hasil modifikasi dishare dengan lisensi yang
sama.
Sebaiknya modul ini dibaca dan dicoba secara berurutan, terutama bagi pemula. Ada
beberapa latihan di akhir materi yang sangat dianjurkan untuk dibuat. Latihan ini
mengukur sejauh mana anda telah memahami materi. Bagi dosen, idealnya memberikan
satu atau dua tugas besar (tiap tugas dikerjakan sekitar 2 bulan) yang dibuat untuk
mengaplikasikan dan mengintegrasikan keseluruhan materi.
Sekilas Android
Android adalah software platform yang open source untuk mobile device. Android berisi
sistem operasi, middleware dan aplikasi-aplikasi dasar. Basis OS Android adalah kernel
Linux 2.6 yang telah dimodifikasi untuk mobile device.
Android versi 1.0 dikeluarkan tanggal 23 September 2008. Versi 1.1 adalah versi yang
pertama kali digunakan di mobile phone disusul versi 1.5 (Cupcake), 1.6 (Donut) dst.
Versi Android terakhir adalah:
2.2 (Froyo), mempercepat kinerja dengan Just In Time compiler dan Chrome V8
JavaScript engine, Wi-Fi hotspot tethering dan suppport Adobe Flash.
2.3 (Gingerbread), memperbaiki user interface, soft keyboard, copy/paste features
dan support Near Field Communication (NFC).
3.0 (Honeycomb), diperuntukkan untuk tablet yang menggunakan layar lebih besar,
multicore processors dan hardware acceleration untuk grafis.
4.0 (Ice-cream sandwich), kombinasi Gingerbread and 3.0 Honeycomb. Integrasi
antara platform untuk tablet dan smartphone.
4.1 & 4.2 (Jelly-Bean), user interface yang lebih halus (project butter).
Untuk mengembangkan aplikasi di Android, bahasa utama yang digunakan adalah Java,
tetapi bukan dalam platform J2ME yang memiliki banyak keterbatasan. Platform yang
digunakan di Android setara dengan J2SE, dan ini merupakan kelebihan utama Android.
Fitur-fitur
Fitur-fitur utama Android yang dapat dimanfaatkan oleh pengembang app sebagai
berikut:
Database dengan SQLite.
Untuk membuat app Android, diperlukan Android SDK (Software Development Kit)
yang diperoleh di http://developer.android.com/sdk sedangkan untuk IDE (Integrated
Development Environment) dapat dipilih Eclipse, Netbeans atau bahkan langsung
dengan command line dan notepad. Tapi saat ini telah tersedia instalasi untuk Windows
yang telah menyediakan semua komponen yang dibutuhkan (ADT Bundle for Windows).
Download ADT Bundle ini, dan setelah selesai ekstrak ke tempat yang anda inginkan dan
langsung dapat dijalankan karena tidak ada proses instalasi.
Salah satu file hasil ekstrak dari ADT Bundle adalah “SDK Manager.exe”, jalankan file
ini. Dapat dilihat bahwa versi default API yang terinstall adalah 4.2.2 (API17). Jika anda
terkoneksi dengan internet, anda dapat download API versi lain yang dibutuhkan.
Selanjutnya kita perlu membuat emulator smartphone android (AVD: Android Virtual
Device). Program yang akan kita buat dikomputer akan dijalankan di emulator ini.
Kita akan buat AVD versi 4.2. (JellyBean) Isi nama, device dan target
Lalu isi RAM dengan ukuran kecil terlebih dulu, dan centang “Use Host GPU” (jika
komputer anda memiliki GPU). Lalu tekan OK.
Pilih AVD yang baru Anda buat lalu klik Start dan kemudian Launch. Tunggu 1-5 menit
(tergantung kemampuan komputer yang Anda miliki).
Emulator ini membutuhkan waktu cukup lama dan memori yang besar. Ambil secangkir
kopi dan silahkan tunggu sampai layar berikut muncul (jika yang muncul masih tulisan
Terutama bagi yang belum memiliki Android, Anda dapat gunakan emulator ini untuk
mengeksplorasi fitur-fitur Android.
Selanjutnya kembali ke file bundle yang telah diekstrak, terdapat direktori Eclipse.
Masuk ke direktori ini dan jalankan eclipse.exe. Akan muncul dialog untuk memilih
direktori tempat source akan diletakkan, lalu akan tampil window welcome seperti
gambar dibawah. Close window ini selanjutnya anda siap membuat program pertama.
Tip: Jika anda menggunaka prosesor Intel, ada cara untuk mempercepat emulator
Android, anda dapat menggunakan teknologi intel VT-x. Baca: http://wp.me/p3f1j-cI
(http://yudiwbs.wordpress.com/2012/09/15/mempercepat-emulator-android/)
Untuk memulai, jalankan Eclipse, pilih File New Android Application Project.
Isi seperti gambar dibawah, jangan lupa ganti nama package. Package name harus unik,
aturan yang biasa digunakan adalah menggunakan nama website organisasi anda (dalam
urutan yang dibalik), ditambah dengan nama applikasi. Misalkan nama website
organisasi anda adalah yuliadi.com, maka nama package adalah: com.yuliadi.namapp.
Jika nama web organisasinya cs.upi.edu, maka nama packagenya:
edu.upi.cs.yudiwbs.namaapp.
Dapat dilihat pada gambar di bawah bahwa minimum required SDK diset dengan API11
Android 3.0 (HoneyComb) karena versi ini telah mendukung ActionBar.
Selanjutnya pilih next sampai untuk activity pilih “BlankActiviy” dan Next.
Terlihat ADT telah menyiapkan komponen user interface activity utama (untuk sekarang,
anggap activity adalah semacam Form).
Komponen user interface untuk app Android disimpan di direktori /res/layout dalam
format XML. Dalam project ini secara otomatis dibuat activity_main.xml
Pertama yang kita lihat adalah graphical layout berisi rendering layout dan fasilitas untuk
mengedit layout. Lihat ke tab bagian bawah, pilih activity_main.xml untuk melihat
format XML-nya. Komponen user interface dalam Android didefinisikan didalam XML.
Jadi anda dapat mengubah elemen tampilan dengan dua cara: melalui graphical layout
atau langsung mengedit file xml-nya.
Sekarang coba buka source code. Lihat package explorer, buka src, package dan klik
MainActivity.java
Jalankan project dengan mengklik icon run (gambar bawah) atau ctrl-F11 dan pilih
Android Application. Tunggu emulator dilaunch jika emulator telah ditutup sebelumnya
.
Perhatikan tab console dibagian bawah. Tab ini penting untuk melihat apa yang terjadi.
Komponen-komponen user interface yang berada di bagian kiri, sering disebut “widget”
atau “view”.
Pertama pilih widget TextField, pilih yang paling atas (plain text), lalu drag ke dalam
form.
Terakhir, drag teks “hello world” dari tengah ke dekat button. Jika posisi menjadi
‘berantakan’ jangan khawatir, atur ulang sehingga posisinya seperti dibawah.
Coba run (ctrl-F11) untuk melihat hasil tampilan dari program ini. Jangan lupa, jangan
tutup emulatornya, supaya tidak menunggu lama saat run berikutnya. Sekarang kita
akan menambahkan aksi yang akan dijalankan saat button diklik.
Sekarang karena kita akan membuat code yang saat button di-klik menangkap apa yang
diketikkan pengguna dan menuliskannya di TextView. Untuk itu setiap komponen perlu
diberi nama.
Coba lihat XML-nya, maka semua Id telah diganti (gambar bawah). Ini kelebihan
mengganti nama id menggunakan property.
Sekarang kita akan mengeset agar saat button diklik, method yang diinginkan akan
dipanggil. Set atribut android.onClik pada button dengan nama method yang akan
menangani event tersebut (bSapaClick).
Penting: setelah update XML, tekan save (ctrl-s). Ini disebabkan file R.java (di
direktori /gen) yang berisi semua Id dan digenerate secara otomatis dapat tidak terupdate
jika file xml tidak di-save secara eksplisit.
Sekarang kita perlu menambahkan code agar saat tombol diklik app akan mengeluarkan
respon.
Kemudian buat satu method baru bSapaClick. Pastikan nama method sama dengan
yang dicantumkan di activity_main.XML. Nama yang tidak sama akan menyebakan
error saat program dijalankan.
Tip: Jika id tidak dikenali seperti R.id.etNama, R.id.tvSalam dan seterusnya, buka
kembali activity_main.xml lalu tekan ctrl-S (save)
Jalankan program (ctrl-F11), perhatikan tab Console di bagian bawah untuk memonitor
proses emulasi. Isi teks dan tekan tombol.
Cara ini paling sederhana, tetapi programmer harus memastikan nama method pada XML
sama dengan nama method di program. Jika nama method tidak sama, tidak akan muncul
kesalahan pada saat program dicompile, tapi akan menyebabkan kesalahan pada saat
Mana yang lebih baik? menggunakan atribut onClik atau dengan listener? itu tergantung
dari selera programmer dan standard code yang digunakan.
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.
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.
Detil property dan event untuk setiap widget dapat dilihat di:
http://developer.android.com/reference/android/widget/package-summary.html (scroll
sedikit ke bawah, di bagian classes)
Berikut akan kita bahas beberapa widget yang terpenting. Silahkan buat project baru.
Text View
TextView digunakan untuk menampilkan label teks. View ini sudah kita gunakan
Beberapa contoh property dari TextView adalah android:textSize, android:textStyle,
android:textColor. Coba tambahkan textview standard dengan atribut dibawah.
Hasilnya:
Button
Button merupakan turunan dari TextView sehingga yang berlaku di textView juga
berlaku di button. Tambahan property yang penting adalah onClick
Catatan: dp yang digunakan sebagai satuan panjang merupakan singkatan dari density-
independen pixel. Nilai pixel untuk 1 dp berubah-ubah sesuai dengan resolusi. 1 dp pada
resolusi 160 pixel berarti 1 pixel. Jika resolusinya 320 pixel, maka 1 dp = 2 pixel
demikian seterusnya.
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.
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
dan hasilnya
EditText
EditText digunakan untuk menerima input dari pengguna. Pada palette telah disediakan
berbagai jenis EditText, silahkan dicoba satu persatu dan perhatikan XML yang
dihasilkan.
CheckBox
User dapat memilih lebih dari satu pilihan dengan checkbox. Pada palette, Checkbox
ada di bagian FormWidgets.
Sehingga hasilnya
Sedangkan contoh program untuk mendapatkan nilai suatu checkbox di check atau tidak
adalah sebagai berikut.
Tambahkan Button dan TextView di form untuk menampilkan hasil pilihan user.
Sehingga tampilannya akan seperti ini.
Sedangkan XML-nya akan seperti ini, anda dapat langsung mengedit file XML ataupun
melalui window property. Jangan lupa atribut onClick:
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 ini button
Periksa Nilai
--------------------------------------------------------------------------------
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).
Hasilnya:
Tambahkan button dan textview, lalu gunakan property untuk mengedit sehingga
hasilnya seperti berikut. Ganti id RadioGroup dengan rgJenisKel, radiobutton
dengan rbLaki dan rbPerempuan dan id TextView dengan tvHasilRadio.
Tambahkan property onClick pada button dengan nama klikHasilRadio
Buat soal berikut yang penggunanya hanya dapat memilih tepat satu:
--------------------------------------------------------------------------------
1. Sebutkan ibu kota propinsi Sulawesi Tenggara?
Samarinda
Kendari
Palu
Makasar ini button
Periksa Nilai
--------------------------------------------------------------------------------
Jawaban yang benar adalah “Kendari”. Jika pengguna memilih pilihan yang
benar akan mendapat nilai 10, sedangkan jika menjawab salah maka akan
mendapat nilai -2
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.
Pertama, buat project baru lalu pilih Composite dan tambahkan ListView di
activity_main.xml
Coba jalankan.
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:
Composite ListView
Listview juga dapat digunakan untuk menampilkan struktur yang lebih rumit. Contoh
berikut memperlihatkan listview dengan isi yang kita tentukan sendiri.
Untuk membuatnya, pertama buat project baru. Tambahkan ListView seperti pada contoh
sebelumnya. Ganti id dengan listJudul.
Kemudian kita akan buat layout untuk setiap baris pada ListView yang berisi judul dan
keterangan. Pilih project pada project explorer, lalu klik kanan Android Tools
New Resources File (gambar bawah)
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.
Sekarang buat class untuk yang menampung data judul dan keterangan. Pada project
explorer, pilih /src/[package], klik kanan new Class
Berikut isi dari DataList. Class ini akan berisi data yang akan muncul di setiap baris.
Buat class dengan cara yang sama dengan sebelumnya (klik /src/[package], klik kanan,
new class), beri nama DataAdapter, jadikan class ini turunan dari kelas ArrayAdapter.
Klik browse di dialog saat membuat class di bagian superclass (gambar bawahh)
Ketik Array…, maka akan muncul ArrayAdapter, pilih item tersebut (gambar bawah)
Isi class DataAdapter adalah sebagai berikut. Pada method getView, parameter pos
adalah indeks baris. Perhatikan pengisian tvJudul dan tvKeterangan dengan data sesuai
indeks.
Latihan:
Buat program dengan tampilan seperti berikut, saat tombol diklik, maka isi list
akan bertambah sesuai dengan nim dan nama. Tip: gunakan
adapter.notifyDataSetChanged() untuk merefresh data.
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.
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.
Toast
Toast digunakan untuk menampilkan pesan yang kemudian akan menghilang dengan
sendirinya tanpa interaksi dengan pengguna. Fokus juga tetap pada aplikasi dan tidak
berpindah ke Toast. Kelebihan Toast adalah mudah untuk dibuat, sedangkan
kelemahannya adalah pengguna dapat saja tidak melihat pesan yang dikandung Toast.
Untuk mencobanya, buat project baru, tambahkan satu button, beri label “Toast” dan
kode berikut adalah event saat button diklik:
AlertDialog
Jika yang diinginkan adalah dialog yang muncul dan harus ditutup secara manual oleh
pengguna maka dapat digunakan AlertDialog. AlertDialog dapat menampilkan tiga
button.
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.
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.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"program dimulai");
}
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.
Lihat tag activity, dapat dilihat ada satu activity dengan property nama dan label.
Sekarang kita akan membuat contoh app yang memiliki dua activity.
Pertama buat project baru. Kemudian langsung buat activity kedua, caranya buat class
baru: di project explorer klik package, klik kanan New Class. Beri nama class ini
ActivityDua dan pastikan superclass kelas ini adalah android.app.Activity (gambar
bawah)
Sekarang kita perlu menambahkan activity ini di AndroidManifest.xml. Isi atribut name
dengan nama class lengkap dengan nama package dan label.
Dari kode diatas dapat dilihat bahwa intent merupakan struktur data (objek) yang
‘dilempar’ sebagai paramater ke method startActivity.
Jika program dijalankan hasilnya akan seperti ini. Terlihat label pada ActivityDua yang
disimpan di dalam AndroidManifest.xml akan menjadi title.
Terlihat ActivityDua masih polos tanpa layout. Sekarang kita akan membuat layout untuk
activity tersebut. Ini mirip saat membuat layout baris pada ListView.
Untuk membuat file layout, pilih project di project explorer, klik kanan, AndroidTools
New Resources File. Pilih resource type “Layout”. Beri nama file activity_dua.xml, pilih
root element LinearLayout (gambar bawah)
Sekarang kita perlu meload layout ini saat activity kedua dijalankan. Buka class
ActivityDua dan tambahkan kode dibawah dan coba jalankan.
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.
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.
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:
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.
tidak visible
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
Contoh penggunaan onPause() dan onResume() dapat dilihat pada subbab mengenai
sensor.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Parameter ini berisi objek yang menyimpan state activity seperti isi widget sehingga saat
app masuk ke pause/stop dan kemudian kembali, widget terisi kembali secara otomatis.
Kita dapat memanfaatkan Bundle ini untuk menyimpan variabel-variabel yang perlu
dikembalikan state-nya pada saat activity aktif kembali dari stop atau destroyed.
Contoh berikut akan lebih menjelaskan masalah ini, pertama buatlah app dengan dua
button dan satu textview. Saat button “simpan” diklik maka variabel nama dan skor akan
terisi. Sedangkan saat tombol “tampil” diklik maka isi variabel akan dicetak di TextView.
<Button
….
android:onClick="klikButtonTampil"
android:text="Tampil" />
<Button
…
android:onClick="klikButtonSimpan"
android:text="Simpan" />
String nama;
int skor;
Klik simpan lalu klik tampil, maka hasilnya akan seperti ini:
Sekarang coba rotate screen (ctrl-F11). Proses rotate akan men-destroy activity dan
mengcreate ulang. Sekarang coba klik tampil (jangan klik simpan), efeknya akan seperti
ini:
Bayangkan efeknya jika dengan merotate device semua variabel di activity hilang. Tentu
saja asumsi pengguna adalah proses rotate tidak akan merubah state dari activity. Ini juga
berlaku misalnya saat pengguna pindah ke activity lain dan kemudian kembali ke activity
semula, mereka akan berharap kondisi activity akan sama seperti sebelum ditinggalkan.
Walaupun pada kenyataanya Android dapat mendestroy activity yang ditinggalkan
tersebut.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//simpan variabel
//method ini dipanggil sebelum onStop
savedInstanceState.putInt("state_skor", skor);
savedInstanceState.putString("state_nama", nama);
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Restore nilai
skor = savedInstanceState.getInt("state_skor");
nama = savedInstanceState.getString("state_nama");
}
Jalankan dan perhatikan efeknya (simpan tampil rotate (ctrl-F11) tampil). Maka
variabel akan tetap tersimpan.
RelativeLayout
RelativeLayout mengatur posisi secara relatif berdasarkan posisi widget yang lain atau
parentnya. Sebagai contoh, dua widget pada gambar di bawah. EditText posisinya relatif
terhadap textView nama.
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.
Beberapa atribut lain yang mengatur posisi widget dibandingkan dengan widget lain
adalah:
android:layout_above
android:layout_below
android:layout_toLeftOf
android:layout_toRightOf.
Contoh jika kita ingin menambahkan button sehingga posisinya sebagai berikut:
TableLayout
Untuk memilih layout manager, selain dengan cara manual dapat juga ditentukan
membuat layout (File New Other Android XML Layout File). Saat muncul
dialog berikut, pilih Root Element sebagai TableLayout.
Hasilnya adalah sebagai berikut. Bayangkan sebagai sebuah tabel dengan dua kolom dan
dua baris.
Kolom 0 Kolom 1
Hasilnya:
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 )
Catatan: layout_weight adalah rasio antara view. Misalnya ada dua widget, widget
pertama ukurannya harus ¾ layar dan sisanya ¼ layar. Maka set layout_weight widget
pertama dengan 3 dan widget kedua dengan 1. Height atau widht perlu diset 0px.
TBD contohnya
Berikut adalah contoh linear layout dengan satu textview dan satu button.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
Jangan gunakan Listview bersama layout ini karena listview telah memiliki mekanisme
scrolling tersendiri.
Berikut adalah contoh scrollview yang menghasilkan layout seperti ini yang dapat
discroll. Dua button teratas menggunakan RelativeLayout yang disisipkan dalam
ScrollView. Ini adalah contoh penggabungan antara dua layout.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
RelativeLayout didalam
LinearLayout.
Didalamnya ada dua
versi Mei 2013 button.
52
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/button1"
android:text="Button" />
</RelativeLayout>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</ScrollView>
Relative
layout
dengan dua
TextView
TableLayout
dengan tiga
kolom dan tiga
baris
ActionBar
Actionbar adalah bar yang berada diatas activity yang mulai diperkenalkan sejak Android
3. Action bar memperlihatkan identitas berupa judul dan icon activity, tempat fitur-fitur
utama (misalnya search, shared, create dsb), dan dapat digunakan untuk navigasi global.
(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
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)
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.
Sekarang kita akan mengubah item menu. Buka /res/menu/main.xml ganti kata “add”
dan “delete” dengan “@string/add” dan “@string/delete”
Icon
Umumnya action bar menggunakan icon yang lebih mudah dikenali oleh pengguna.
Untuk menambahkan icon, cara yang paling mudah adalah mendownload Android design
icon di: http://developer.android.com/design/downloads/index.html
Setelah download dan ekstrak, pilih all_icons/holo_dark dan copy icon yang diinginkan
(dengan Windows Explorer) ke direktori /res/drawable-hdpi, /res/drawable-mdpi dan
/res/drawable-xhdpi. Ingat dalam pembahasan sebelumnya bahwa setiap resoulusi
membutuhkan gambar yang terpisah.
Setelah itu masuk ke package explorer dan refresh (F5), hasilnya akan seperti ini:
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
Selain “ifRoom” dan “withText”, pilihan yang lain adalah “never” agar item hanya
muncul di overlflow menu (gambar bawah)
Sedangkan “always” akan memaksa item selalu muncul. Gunakan untuk item yang benar-
benar sangat penting karena jika tidak mencukupi akan terjadi overlap.
Latihan:
Modifikasi latihan activity-intent pada halaman 40, tambahkan action item
“delete” dan “edit” saat detil data mahasiswa (layar2)
Menyimpan Data
Android menyediakan beberapa cara untuk menyimpan data: file, relasional database
dengan SQLlite dan pasangan key/value yang disebut sistem preferences. Untuk sharing
antar aplikasi disediakan mekanisme yang disebut ContentProvider.
Shared Preferences
Shared Preferences (SP) adalah mekanisme untuk menyimpan pasangan key-value untuk
tipe data primitif (integer, double, string, booelan). SP cocok untuk penggunaan ringan
seperti menyimpan setting aplikasi dan kondisi user interface misalnya pada saat activity
masuk ke state sleep karena device menerima telepon.
Data dalam shared preferences disimpan dalam device android dalam bentuk XML.
Shared Preference objek untuk activity diperoleh melalui method getPreferences(). Kode
berikut memperlihatkan cara penggunaan SP. Jangan lupa memanggil commit!
Jalankan. Kemudian coba komentari bagian isi data, dan jalankan kembali aplikasi.
Dapat dilihat data nama dan umur tersimpan walaupun aplikasi sudah ditutup.
Latihan:
Buat applikasi yang menyimpan berapa kali aplikasi telah dijalankan. Tampilkan
jumlah tersebut.
Setiap aplikasi memiliki instance database tersendiri, dan berbeda dengan shared
preference, tidak disediakan fasilitas agar aplikasi dapat membaca database aplikasi lain.
Untuk latihan kita akan membuat aplikasi sederhana yang menyimpan data mahasiswa
berupa nama dan nomor telpon. Pertama kita buat class helper terlebih dulu. Buatlah
project Android, tambahkan ke dalam project tersebut satu class (ke project explorer,
pilih src/nama package; klik kanan New Class). Pastikan superclass kelas ini
adalah SQLiteOpenHelper. Beri nama class ini OpenHelper.
Pada class OpenHelper berikut akan dibuat tabel Mahasiswa dan penanganan jika
database diuprade.
cur = db.query("MAHASISWA",cols,"NAMA=?",param,null,null,null);
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
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:
group by
having order by
RawQuery
Selain method query, tersedia juga rawQuery untuk memasukkan langsung query.
Sebagai contoh, berikut perbandingan antara query dengan rawQuery
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:
Catatan: untuk dapat menggunakan cursor adapter, table harus mengandung field _id
(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;
@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");
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:
Untuk tahap pertama hanya insert dan query yang dibuat. Update dan delete akan
dibahas berikutnya. Contentprovider yang dibuat ini juga dapat digunakan untuk widget
yang lain, tidak harus berupa ListView. Cara penggunaanya dapat dilihat di MainActivity
nanti.
package edu.upi.cs.yudi.listviewdb;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
// database
private DbHelper database;
@Override
public Uri insert(Uri uri, ContentValues values) {
//insert data
int uriType = sURIMatcher.match(uri);
SQLiteDatabase sqlDB = database.getWritableDatabase();
long id = 0;
switch (uriType) {
case MHS:
id = sqlDB.insert("MHS", null, values);
break;
default:
throw new IllegalArgumentException("URI tdk dikenal: " + uri);
}
//notifikasi
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(BASE_PATH + "/" + id);
}
@Override
public boolean onCreate() {
database = new DbHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs,String sortOrder) {
//query tabel
SQLiteDatabase db = database.getWritableDatabase();
Cursor cur=null;
break;
default:
//notifikasi
cur.setNotificationUri(getContext().getContentResolver(), uri);
return cur;
}
@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// nanti dibuat
return 0;
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// nanti dibuat
return 0;
}
@Override
public String getType(Uri arg0) {
// nanti dibuat
return null;
}
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="edu.upi.cs.yudi.listviewdb.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:exported="false"
android:name=".MhsContentProvider"
android:authorities="edu.upi.cs.yudi.listviewdb.contentprovider" >
</provider>
</application>
Selanjutnya buat xml layout baru sebagai isi dari baris di listview (pilih layout, klik
kanan new Android XML ) Beri nama row.xml, dan tambahkan dua textview.
Ganti namanya dengan tvNama dan tvId.
package edu.upi.cs.yudi.listviewdb;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.app.LoaderManager;
//implementes LoaderManager
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//load data ke cursor
//harus ada _id dengan huruf kecil!
String[] projection = { "_id", "nama" };
CursorLoader cursorLoader = new CursorLoader(this,
MhsContentProvider.CONTENT_URI, projection, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cur) {
//dipanggil saat cursor sudah terisi, dilakukan
//dibackground sehingga user interface tetap responsif
//isi adapter dengan cursor yang sudah terisi
adapter.swapCursor(cur);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//reset, kosongkan
adapter.swapCursor(null);
}
}
Latihan SQLite2:
File
[cek untuk Android versi >=3.0?]
File dapat disimpan baik di dalam device maupun di media penyimpanan (SD card).
Secara default, aplikasi tidak dapat mengakses file milik aplikasi lain. Bagi anda yang
telah mengenal stream dan file di Java, anda dapat membaca secara cepat bagian ini,
karena tidak ada perbedaan antara Java dan Android. Class yang mensupport operasi file
disediakan di package java.io.*
Stream
Pemrosesan file dalam jumlah besar, yang membutuhkan kinerja yang tinggi masih
dibutuhkan berbagai bidang. Misalnya aplikasi backend yang mengelola dokumen di
perusahaan, aplikasi pengolahan teks, aplikasi pemroses XML, HTML, aplikasi
simulasi-simulasi dan sebagainya. Penguasaan stream dan file akan membantu anda
untuk memecahkan berbagai masalah
Stream adalah aliran data. Bayangkan stream sebagai sungai yang mengalirkan air.
Seperti sungai, stream mengalirkan byte-byte data. Pemrosesan input dan output di Java
pada prinsipnya menggunakan konsep stream ini.
Persiapan
Sebelum memulai, pastikan emulator sudah memiliki SD-Card (Start All Program
Android SDK Tools)
Lalu untuk setiap project yang akan mengakses ke SD Card, tambahkan ijin untuk
menulis ke media penyimpanan external di AndroidManifest.xml
File teks penting untuk menulis data, XML, HTML dan sebagainya. File teks dianggap
sebagai stream dari karakter. Untuk menulis ke file teks, cara yang paling mudah adalah
dengan menggunakan class PrintWriter. Berikut adalah contoh program yang menulis
dua baris ke file teks.
Sedangkan untuk membaca, dapat digunakan class Scanner yang dapat membaca baris
demi baris. Berikut contoh codenya, letakkan di bawah code atas.
Objek Stream
Java telah menyediakan fasilitas agar objek dapat disimpan ke dalam stream secara
otomatis dengan mudah. Class yang digunakan adalah ObjectOutputStream dan
ObjectInputStream.
Selanjutnya, buat program untuk menulis dua objek mahasiswa ke dalam class. Penulisan
objek ke stream sangat mudah, hanya dengan class ObjectOutputStream dan method
writeObject. Buatlah code ini di activity Main.
ObjectOutputStream out =
new ObjectOutputStream (new FileOutputStream(namaFileOutput));
Walaupun pada awalnya teknik layering stream ini terlihat sulit, tapi teknik ini sangat
bermanfaat untuk mengkombinasikan berbagai fitur yang dibutuhkan.
Sekarang kita lanjutkan ke pembacaan objek yang telah dituliskan. Untuk membaca file
berisi objek digunakan class FileInputStream dan ObjectInputStream;
Grafik 2D
Menggambar di Canvas
Dalam contoh pertama kita akan menggunakan Canvas, Paint, Path dan Color untuk
menggambar kotak. Koordinat canvas 0,0 berada di kiri atas. Makin ke kanan nilai x
semakin besar dan makin kebawah nilai y semakin besar.
Setelah membuat project baru, buatlah class yang bernama GraphicsView yang
merupakan turunan class View.
package com.example.cobagraphicview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
Lalu di-activity utama, tambahkan kode berikut yang men-set contentview dengan class
GraphicView.
Canvas, sesuai namanya adalah tempat untuk menggambar bentuk 2D. Dengan canvas,
kita dapat menggambar bentuk (lingkaran, kotak, garis, titik), menggambar text dan
melakukan operasi translate, scale, rotate.
Paint digunakan untuk menyimpan style, warna dan informasi lainnya yang dibutuhkan
untuk menggambar.
Sekarang kita coba fungsi-fungsi lain pada canvas, tambahkan code berikut dalam class
Graphicsview
package com.example.cobagraphicview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.view.View;
//gambar kotak
cat.setColor(Color.argb(75, 255, 0, 0)); //alpha,red,green,blue
c.drawRect(kotak,cat);
//gambar mulai dari posisi 45 derajat sebanyak 90 derajat searah jarum jam
//lengkungan akan mengikuti rect oval
//paramater ke 4 jika true garis penutup melewati titik pusat
//memberikan efek spt pizza yang dipotong.
c.drawArc(oval, 45, 90, true,cat);
cat.setColor(Color.RED);
//jika parameter ke-4 false maka garis akan melewati
//ujung ke ujung tanpa harus ke titik pusat
//menyebabkan efek spt lingkarang dipotong2 mendatar
c.drawArc(oval2, 45, 90, false,cat);
//gambar garis
c.drawLine(50,500,400,500,cat); //x1,y1,x2,y2
//gambar titik
cat.setColor(Color.BLACK);
for (int i=0;i<10;i++) {
cat.setColor(Color.RED);
//diisi dalam maupun outline
cat.setStyle(Style.FILL_AND_STROKE);
cat.setStrokeWidth(2);
cat.setTextSize(35);
c.drawText("Hello World", 10, 500, cat);
Selanjutnya kita akan membuat lingkarang yang mengikuti suatu jalur menggunakan
class Path. Deklarasikan satu objek ini di luar onDraw:
Dianjurkan untuk membuat objek diluar method onDraw karena onDraw dapat dipanggil
berulang-ulang.
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);
cat.setColor(Color.RED);
cat.setStyle(Style.STROKE);
cat.setStrokeWidth(10);
//menggunakan path, bisa juga dengan drawRect
path1.reset();
path1.moveTo(0+offset, 0+offset); //kiri atas
path1.lineTo(lebar-offset, 0+offset); //kanan atas
path1.lineTo(lebar-offset, tinggi-offset); //kanan bawah
path1.lineTo(0+offset, tinggi-offset); //kiri bawah
path1.lineTo(0+offset, 0+offset); //kembali ke kiri atas
c.drawPath(path1, cat);
Latihan:
Buatlah gambar rumah seperti ini, tambahkan warna dan modifikasi sesuai yang
anda inginkan
Event Touch
Selenjutnya kita akan membuat app yang akan menggambar kotak ditempat pengguna
menyentuh layar. Buat project baru dan tambahkan class baru turunan dari class View,
beri nama GraphicsView. Berikut adalah isi kelas tersebut yang membersihkan layar dan
kemudian menggambar kotak pada koordinat sentuhan jari.
package com.example.cobatouch;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
@Override
protected void onDraw(Canvas c) {
//clear screen
cat.setColor(Color.BLACK);
c.drawRect(0,0,c.getWidth(),c.getHeight(),cat);
package com.example.cobatouch;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this);
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: //jari menyentuh layar
//passing posisi ke graphicsview
gv.posX = event.getX();
gv.posY = event.getY();
gv.invalidate(); //draw ulang
break;
case MotionEvent.ACTION_MOVE: //bergerak
break;
case MotionEvent.ACTION_UP: //diangkat
break;
}
return true;
}
}
Latihan:
Buat app yang menampilkan gambar tank (atau tentara) mush secara random.
Pengguna harus mentouch lokasi tank tersebut, dan jika tepat maka tank akan
hilang.
package com.example.cobaloadbitmap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GraphicsView gv = new GraphicsView(this);
//load bitmap
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
}
}
Animasi di Canvas
Animasi di canvas cocok digunakan untuk game sederhana seperti game berjenis puzzle
yang melibatkan sedikit objek dan tidak memperlukan animasi berat. Canvas juga lebih
sederhana dibandingkan dengan OpenGL
Animasi dapat dilakukan dengan membersihkan layar dan menggambar objek di tempat
yang baru. Class Asyntask dapat digunakan untuk mengatur posisi objek dan jeda antar
frame. Asyntask melakukan proses dibackground, sehingga app tidak terkunci dan tetap
responsif.
Berikut adalah contoh codenya. Buat project baru, tambahkan class GraphicsView yang
merupakan turunan View seperti pada contoh sebelumnya. Class ini akan membersihkan
layar dan menggambar image sesuai posisi.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
@Override
protected void onDraw(Canvas c) {
//clear screen
c.drawColor(Color.WHITE);
//gambar bitmap
c.drawBitmap(bmpGambar,posX,posY,cat);
}
Selanjutnya buat class AnimasiTask yang merupakan turunan dari Asynctask. Kelas ini
berperan untuk mengatur posisi bola dan memerintahkan agar canvas didraw ulang setiap
posisi berubah.
package com.example.cobaanimasibmp;
import android.os.AsyncTask;
import android.util.Log;
@Override
protected Void doInBackground(Void... arg0) {
// method ini dijalankan di background secara asynchronous
publishProgress();
@Override
protected void onProgressUpdate(Void... progress) {
gv.postInvalidate(); //refresh canvas agar menggambar image di posisi baru
}
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv= new GraphicsView( this);
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
gv.bmpGambar = bmp;
setContentView(gv);
AnimasiTask at = new AnimasiTask();
at.gv = gv;
at.execute(); //jalankan animasi secara async dan dibackground
}
Latihan:
Buatlah game sederhana memukul serangga di layar. Program menampilkan
kotak di layar, jika pengguna ‘memukulnya’ dengan jari, maka pengguna
mendapat skor. Tampilkan animasi jika kotak terkena pukulan (misal kotak
berubah warna).
Accelerometer
Accelerometer adalah alat yang mengukur akselerasi atau percepatan (perubahan
kecepatan) baik yang disebabkan hal yang statik seperti gaya gravitasi (ingat bahwa
benda yang jatuh mengalami percepatan) maupun perubahan dinamik seperti saat device
bergerak atau bergetar.
Dengan mengukur gaya gravitasi, kita bisa mengetahui sudut kemiringan device.
Sedangkan dengan mengukur akselerasi dinamik kita bisa mengetahui ke arah mana
benda bergerak dan secepat apa.
Sebagian besar device Android memiliki sensor accelerometer ini. Sensor ini mengukur
perubahan kecepatan di tiga sumbu: x, y dan z (gambar bawah). Satuannya adalah
m/det^2. Gaya gravitasi selalu mempengaruhi. Sehingga jika device diletakkan diam,
nilai sumbu z tetap terbaca sekitar 9.8m/det^2.
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// kalau akurasi berubah
}
@Override
public void onSensorChanged(SensorEvent event) {
double ax=0,ay=0,az=0;
// menangkap perubahan nilai sensor
//if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
ax=event.values[0];
ay=event.values[1];
az=event.values[2];
}
//ax,ay,az bisa digunakan
tvHasil.setText("x:"+ax+" y:"+ay+" z:"+az);
}
@Override
protected void onPause() {
//app kehilangan fokus (misal user menerima telp), lepaskan sensor
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
//app kembali
super.onResume();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Masalahnya adalah AVD tidak mensupport accelerometer sehingga saat app harus
dijalankan pada device langsung. Caranya bisa dengan langsung menghubungkan atau
manual melalui APK.
Agar langsung dapat menjalankan app pada device, hubungan handphone/tablet dengan
komputer melalui kabel USB. Pastikan USB driver telah terinstall. Untuk jenis Nexus,
usb driver dapat diinstall melalui SDK manager (Extra Google USB Driver).
Pilih tab target, lalu pilih launch on all … dengan “Active Devices”
Kemudian pada device, jalankan USB Debugging dengan pilihan Setting Developer
Options USB Debugging.
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 bermanfaat
untuk augmented reality. Dengan GPS kita bisa mengetahui posisi device, tapi kita tidak
mengetahui ke arah mana device menghadap. Tetapi jika GPS dikombinasikan dengan
informasi azimuth dan pitch maka dapat diketahui ke arah mana device menghadap. Roll
dan pitch juga dapat digunakan untuk mengontrol game.
Berikut adalah contoh kode untuk mendapatkan tiga orientasi tersebut, penjelasan ada di
dalam 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//register listener
mSensorManager.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;
@Override
protected void onPause() {
//app kehilangan fokus (misal user menerima telp),
//lepaskan listener sensor
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
protected void onResume() {
//app kembali, daftarkan lagi listener
super.onResume();
mSensorManager.registerListener(this, accel,
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, magneto,
SensorManager.SENSOR_DELAY_NORMAL);
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
Jalankan di device dan coba lakukan gerakan pitch, roll dan yaw dan perhatikan angka
yang didapat.
Location API
Dengan GPS (Global Positioning Service), suatu device dapat diketahui posisi
geolokasinya. GPS menggunakan 24 satelit yang memancarkan sinyal secara bersamaan.
Sinyal berisi waktu kirim dan posisi satelit. Device akan menerima sinyal satelit itu
secara pasif (device tidak memancarkan sinyal, hanya menerima). Berdasarkan
kecepatan sinyal sampai ke device maka dapat ditentukan jarak antara device dengan
satelit. Minimal diperlukan 4 satelit berbeda untuk menentukan lokasi. Selain GPS, Rusia
mengembangkan sistem serupa yang disebut GLONASS dan Eropa mengembangkan
Galileo.
Hampir semua device Android mendukung GPS dan sebagian mendukung kombinasi
GPS + GLONASS. Selain itu Android mendukung penentuan lokasi berbasis network
Android menyediakan location API yang mengatur provider lokasi (GPS, network atau
pasif).
Kita akan mencoba membuat aplikasi sederhana yang memanfaatkan lokasi. Untuk lebih
memahami proses pengambilan lokasi, jalankan app langsung pada device (lihat subbab
accelerometer untuk caranya).
Buat project baru. Edit AndroidManifest.xml karena app membutuhkan ijin dari user
untuk mengakses lokasi. Gunakan ACCESS_COARSE_LOCATION untuk lokasi
berdasarkan network dan ACCESS_FINE_LOCATION untuk lokasi berdasarkan GPS.
Jika kita menggunakan FINE_LOCATION maka tidak perlu lagi meminta
COARSE_LOCATION karena otomatis akan masuk.
Untuk mengambil lokasi, kita akan activity yang meng-implement LocationListener dan
kemudian dipassing ke LocationManager.
Berikut adalah code untuk class MainActivity, perhatikan comment yang ada. Jalankan
langsung di-device.
import android.location.Criteria;
TextView tvLat;
TextView tvLng;
TextView tvStatus;
double lat;
double lng;
long minTime;
float minDistance;
String locProvider;
LocationManager locMgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
protected void onResume() {
//mulai mendengarkan dari awal dan juga saat dibangunkan dari pause
super.onResume();
locMgr.requestLocationUpdates(locProvider, minTime, minDistance, this);
}
@Override
protected void onPause() {
//lepaskan listener, agar tidak memakan resources saat dipause
super.onPause();
locMgr.removeUpdates(this);
}
@Override
public void onLocationChanged(Location loc) {
//dipanggil saat lokasi berubah atau waktu refersh
lat = loc.getLatitude();
lng = loc.getLongitude();
tvLat.setText(String.valueOf(lat));
tvLng.setText(String.valueOf(lng));
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Jika dijalankan maka pada saat awal lokasi akan diisi dengan cepat berdasarkan data
terakhir (network). Perhatikan icon GPS di kiri atas yang menyatakan GPS diaktifkan.
Setelah beberapa saat (bawa device ke dekat jendela atau ruang terbuka). Maka akan
muncul lokasi berdasarkan GPS yang diupdate setiap 5 detik. Jika anda berada di dalam
ruangan tertutup, maka layar dibawah tidak akan pernah muncul karena lokasi GPS tidak
pernah didapatkan:
Tip: Untuk mendapatkan lokasi berdasarkan GSM, pastikan uncheck Settings ->
Applications -> Development -> Allow mock locations
Latihan:
Buatlah app yang menyimpan data lokasi latitude, longitude, dan data
accelerometer (x,y,z) untuk suatu perjalanan dengan kendaraan (motor/mobil).
Simpan data tersebut beserta waktu pengambilan data ke dalam database.
Sebelum memulai, pastikan emulator telah terhubung dengan internet, jalankan browser
dan coba buka salah satu website.
Jika tidak terhubung dengan internet, dapat digunakan server local seperti Apache atau
PhpMyAdmin.
Catatan:
Baca ini http://stackoverflow.com/questions/7841494/cannot-find-google-apis-for-android-sdk jika Google
API tidak ditemukan di Android SDK.
Diperlukan key yang didapat dari Google untuk menggunakan fasilitas ini.
Kita 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”.
Lalu gunakan Start cmd, jalankan keytool dengan sintaks sebagai berikut. Sesuaikan
lokasi debug.keystore dengan yang ada di komputer anda. Ingat, saat ditanya password
ketikkan ‘android’ (tanpa tandapetik).
Dengan nilai certificate fingerprint MD5, kita dapat memperoleh mapkey melalui: (anda
harus memiliki account Google terlebih dulu)
https://developers.google.com/android/maps-api-signup
Masukan fingerprint, klik generate API Key, maka didapatlah API key untuk mengakses
peta.
Selanjutnya buat project baru Android. Saat menentukan target, pilih Google API.
Artinya selain splatform standard, ditambahkan Google API
Selanjutnya isi main.xml dengan code sebagai berikut, ganti isi apiKey dengan key yang
telah diperoleh dari google sebelumnya:
Zoom
Menambahkan zoom sangat mudah, tambahkan dua baris berikut ke dalam onCreate.
Ubah Posisi
Untuk mengganti posisi peta, dapat digunakan method setCenter() dengan parameter
GeoPoint. GeoPoint menyimpan posisi latitude dan longitude dalam integer untuk
menghemat memori dan mempercepat proses. Oleh karena itu koordinat perlu dikali 1E6
terlebih dulu. Sedangkan untuk mengatur zoom, dapat digunakan method setZoom.
Tambahkan code berikut pada onCreate:
Tambahkan class baru di project peta kita, beri nama PointsOverlay yang merupakan
turunan dari ItemizedOverlay.