LISENSI
Buku ini hanya boleh digunakan oleh seseorang yang
telah mengikuti training Berbayar Sandec Mantab
Basic, atau seseorang yang telah membeli produk buku
pdf Sandec. Sandec tidak bisa mengawasi segala
bentuk pengcopyan buku ini tanpa seizin dari kami,
jika ada rekan atau saudara yang melakukan copying
terhadap buku ini, kami kategorikan sebagai
pembajakan. Adapun jika pembajaknya belum
bertobat, biar itu menjadi tabungan pahala kami di
akhirat kelak :)
2
Apa itu Sandec dan Santren Koding?
Sudah lama saya punya impian mempunyai sebuah komunitas “like a startup” yang
benar-benar dikelola profesional. Benar-benar bisa membiayai dirinya sendiri, kegiatan bisa
rutin, ada pengurus yang fokus untuk mengelolanya. Sehingga member atau anggota
komunitas benar-benar dilayani dengan baik dan selalu ada perkembangan kegiatan tiap
bulannya. Ga cuman kumpul-kumpul ga cetho (kumpul tidak jelas) tanpa hasil yang nyata.
Walaupun “kumpul ga cetho” itu juga dibutuhkan, kadang sering kali ide brilian atau Wow
berasal dari “kumpul ga cetho” tersebut. Tapi jangan sampai lebih banyak “kumpul ga cetho”
dibanding kumpul produktifnya.
Sudah banyak sekali komunitas yang telah saya buat, namun kandas dihajar waktu dan tidak
bisa maju karena saya sendirian. Teman-teman mulai pergi meninggalkan kota Semarang satu
per satu. Terlalu memikat hati lah bekerja dan aktif di luar Semarang. Tinggal saya sendirian
tanpa teman, berjuang sendiri. Sebetulnya, awal ingin membuat komunitas di Semarang karena
saya sendiri malas buat hijrah dari Semarang, sudah happy dan tentrem di Semarang, males
kemana-mana. Kalau ke luar kota pun, hawanya pengen segera pulang. Jadi akhirnya coba
deh, mulai bikin gerakan-gerakan produktif di Semarang. Siapa tahu dapat teman.
Awal mula komunitas Android malah bukan berasal dari anak-anak kuliahan seperti biasanya,
tapi malah keluar dari sebuah tingkat pendidikan menengah yaitu SMP. Loh kok SMP? Dan
SMP ini lah yang ikut andil sangat besar dalam membantu memsukseskan komunitas Sandec
kedepannya. Dulu saya sering membuat kegiatan-kegiatan di SMA atau kuliah, tapi kok ya
anak-anak susah diatur :(, saya stress sendiri, haha. Akhirnya saat itu saya diminta jadi
pengajar Olimpiade Sains Nasional (OSN) mata pelajaran Fisika. Kebetulan saya emang suka
fisika sejak SMA. Coba deh saya terima aja, sekalian bantu-bantu sekolah Almamater yaitu
SMP Negeri 1 Semarang. Saya juga hobi ngajar, apalagi ketemu anak-anak. Sempet juga
dendam dulu pas SMP, gara-gara sekolah gratis semua ekskul di smp dihapuskan, termasuk
OSN Matematika, dimana saya ada di dalamnya, saatnya payback time. Akan saya bayar
tuntas, buktikan bahwa anak-anak juga bisa berprestasi tanpa biaya tinggi.
Awalnya tugas saya di SMP 1 lumayan berat juga, anak-anak tidak punya latar belakang
prestasi yang gemilang, tidak ada kakak kelas/alumni yang udah pernah juara lomba, kalau
lomba kok kalah mulu. Adek-adeknya ikutan mlempem, ga semangat, karena tidak punya role
model yang baik. Jadi susah bayangin gimana rasanya megang medali emas di dada.
Kebetulan punya pengalaman menarik ketika SMA, di SMA saya dulu yaitu SMA Negeri 3
Semarang, anak-anaknya itu kalau mau lomba atau belajar ya sendiri. Semangatnya
gila-gilaan, padahal ya anak-anaknya usaha sendiri semua, ga ada yang bimbing. Dan anehnya
bisa pada juara dan menang. Buktinya, tiap senin itu, selalu ada aja anak yang dipanggil dalam
pengumuman kejuaraan saat upacara. Wah apa sih bedanya sama SMP 1 ini, soalnya kalau
saya lihat temen-temen saya dulu juga biasa-biasa aja. Ga ada yang spesial.
3
Setelah saya pikir-pikir lagi, ternyata rahasianya ada di Upacara! Heh? Beneran, upacara di
SMA 3 itu beda banget sama sekolah-sekolah lainnya. Kalau upacaranya sih ya sama, ada
baris, pengibaran bendera, dkk. Tapi ada sesuatu yang jarang dimiliki sekolah-sekolah lainnya.
“Pengumuman kejuaraan”! Yaps, itu yang bikin beda sama sekolah lain. Di SMA 3, tiap upacara
seperti yang saya ceritakan sebelumnya, banyak banget pengumuman siapa yang menang
lomba. Hal ini ternyata bikin anak-anak yang denger jadi iri, gemeteran, pengen juga diumumin.
Selain itu anak-anak SMA 3 itu fanatik gila sama sekolahnya, pokoknya bangga banget lah. Lha
wong kalau di bis atau BRT itu ya, badge yang ada di lengan itu dinaik-naikkan biar kelihatan
dia dari SMA 3, haha. Pokoknya fanatik gila + super bangga + banyak role model di sekolah itu.
Saya coba bawa ke SMP 1, Alhamdulillah membuahkan hasil, saya tanamkan ke hati
anak-anak bahwa ketika mereka lomba, bukan hanya hadiah dan prestasi untuk dirinya sendiri,
namun manfaatnya lebih luas lagi. Mereka adalah agen dakwah dan calon role model untuk
adek-adek dan teman-temannya. Akhirnya terbentuklah firolab dan firodev, dari sini lah Sandec
mulai akan merekah. Sebetulnya ada cerita menarik di sini, yang mulanya saya mengajar OSN
Fisika, mulai merambah jadi pelatih Karya Ilmiah Remaja (KIR), hingga akhirnya malah jadi
pengajar programming di SMP 1. Alhamdulillah di SMP 1 sendiri ada 5 ekskul khusus di bidang
IT yaitu: Mobile Developer (Android/iOS), Web Developer, Game Developer, Desain Grafis, dan
Robotik. Weh banyak dan fokus ya ekskulnya, ada banyak cerita menarik di balik itu, kenapa
harus firolab dan firodev namanya, gimana sampai bisa banyak cabang, dan membuat gelora
wah di SMP 1 Semarang (cek web smpn1smg.sch.id) akan saya bahas di lain kesempatan
hehe :) Tunggu buku berikutnya.
Dengan support dari Kepala Sekolah dan Guru di SMP 1, karena sudah bisa lumayan
membawa nama baik sekolah dan menaikkan pamor sekolah. Saya lumayan bisa leluasa di
Sekolah. Saat itu ada namanya IAK (Indonesia Android Kejar) dari Kibar dan Google Developer
Groups (GDG). Sebuah kegiatan untuk belajar membuat aplikasi android dari nol untuk semua
kalangan, walaupun tidak punya latar belakang komputer. Saya coba bawa ke IAK ini ke SMP 1
Semarang. Coba izin ke Kepala Sekolah untuk memakai ruangan dan lab komputernya,
Alhamdulillah disetujui.
Oh iya, saat itu saya sedang jadi santri di Pesantren Programmer nya Pak Dedi dari idn.id,
orang keren dan kece asal Semarang yang top banget lah di dunia pendidikan IT. Lha wong
bikin sekolah aja ada garansi uang kembali kalau ga sesuai target kayak bikin 100 Apps
android, cek idn.sch.id. Jadi saya daftar jadi Fasilitator Indonesia Android Kejar (IAK), ternyata
bagus, saya ajak anak-anak smp ikut eventnya. Anak-anak pada ketagihan, ada yang jadi
peserta termuda dan lolos lomba Google Hackathon (cek link1), padahal baru SMP umur 13
tahun, ntabs lah.
Namun, ada sedikit kekecewaan, eventnya cuman sebentar, nunggu beberapa bulan lagi untuk
ada lagi. Dari situ, saya dan temen-temen (lulusan IAK) membuat komunitas Android bernama
1
https://inet.detik.com/cyberlife/d-3217862/cerita-bocah-linux-soal-serunya-coding
4
Semarang Android Developer Center (SANDEC), ada cerita menarik kenapa namanya
“Developer Center”, dibahas di buku berikutnya, wkwkw (biar ga menuh-menuhin halaman kata
editor). Sampai akhirnya membawa saya juga untuk menjadi Project Manager IAK Semarang
yang sudah “Powered by Google”. Tujuan awalnya sih buat bikin kegiatan kayak IAK, tapi tiap
minggu, biar bisa belajar teruuss….
Kegiatan kami setiap sabtu di lab SMP 1 Semarang. Awalnya yang datang cuman dikit, dikit,
dikit, sekaliii…… Cuman 1,2,3 pokoknya bisa dihitung pake jari deh. Tapi yaudah, jalani aja,
emang katanya wong semarang itu susah diajak beginian. Istiqomahlah nak.
Hari-hari terus berlanjut, yang ikut tambah banyak, member di Telegram udah mulai ratusan,
kalau bikin meetup, penuh terus. Bingung juga akhirnya, timbul ide untuk diseriusin. Maka
mulailah tim pengurus dibentuk dengan lebih serius lagi, ini momentum ga boleh hilang!
Uniknya orang semarang, susah buat ikut, sekali ikut ga mau kemana-mana.
Kian hari makin mantabs dan solid pengurusnya, mulai kerjasama bareng Pemkot Semarang
dan stakeholder lainnya. Tapi kami masih bingung, kira-kira pembiayaannya dari mana ya untuk
kegiatan-kegiatan, kami juga pengen ada tempat nongkrong seperti Coworking Space buat
temen-temen Sandec. Tapi jangan sampai bentuk monetisasi ini, hanya ke beberapa pengurus
duitnya, uangnya harus balik lagi Komunitas!
Setelah riset, ngumpulin data, dan tanya temen2. Akhirnya diputuskan final untuk membuat
pelatihan berbayar, tapi harus Gratis Ngulang Sepuasnya. Loh kok? Karena kami rasa
nyawanya komunitas itu ya di sini, bisa belajar bareng terus. Harga juga harus terjangkau, jadi
ini bukan pengeluaran tapi investasi. Untuk yang dari luar kota juga harus kami fasilitasi, harus
ada tempat penginapan gratis. Makan pun juga harus oke, namanya belajar ngoding, perut
harus oke, biar ga stress. Akhirnya jadilah…
, awalnya kami ragu untuk bikin ini, harga yang dikira-kira masuk adalah di range
1,5-2jt/peserta. Itu aja mininal 4-5 peserta biar ga tombok, belum bisa nabung. Alhamdulillah
kami bertemu dengan Pak Subiyakto, beliau ini adalah Guru OSN Fisika di SMA saya dulu
(SMA 3) dan sekaligus pembina OSN Fisika Jateng. Beliau menawari tempat untuk pelatihan
dan tempat menginap. Untuk tempat pelatihan pertama kali, malah ga diminta uang sama
sekali, untuk penginapan malah disediakan gratis di rumah beliau yang dekat dengan tempat
pelatihan, kebetulan ada banyak kamar di sana. Yang biasanya dipakai kalau pas camp
anak-anak luar kota dan luar pulau untuk belajar OSN Fisika di rumah beliau. Akhirnya biaya
bisa kami tekan ke harga 1jt/orang. Kata beliau, yang penting jalan saja, ga usah mikirin duit,
seperti kebanyakan kegiatan les di tempat beliau, prinsipnya adalah “Membuat anak bisa
belajar sendiri”. Lha trus duitnya dari mana kalau nanti ga ada yang les, Tuhan pasti
memberikan jalan kepada hambanya kata beliau. Filosofi itulah yang kami pegang untuk
“Sandec Training Mantab”. Jangan pikir duit dulu, jalanin, buat orang pinter.
5
Sedikit rahasia nih, kenapa harganya ada 2 macam 750rb dan 1jt? Setelah survey, masih ada
aja yang menganggap harga 1 juta ini kemahalan, sadis kan? Akhirnya kami coba buat pricing
di harga 750rb untuk sekali training dan 1jt untuk yang ngulang sepuasnya. Jadi biar 1jtnya
kelihatan murah, hehe. Kami harap teman-teman bisa mengambil yang 1jt, selain bisa
membantu Sandec berkembang, membiayai pembuatan buku, pelatihan gratis tiap sabtu, juga
ikut membantu kegiatan Santren Koding, sebuah kegiatan GRATIS untuk anak-anak lulusan
SMA/SMK selama 1-3 tahun. Mereka belajar dari bangun tahajud sampai jam 11 malam tiap
hari. Konsepnya “Belajar Keras, Kerja Santai”, kita didik mereka untuk belajar mandiri dan siap
bekerja atau membuat usaha sendiri saat nanti bisa lulus. Selain jago ngoding, juga pinter ngaji
pastinya. Sehingga bisa bermanfaat bagi umat :). Saya berharap lulusan ini nantinya mereka
bisa membuat santren lagi untuk bisa membiayai adik-adiknya yang baru, sehingga santri yang
diterima dan diluluskan semakin banyak. Kalau mau ikut pelatihan bisa hubungi Pak Wakhyudi
(085719536486), awalnya dia guru fisika di SMK, sampai jadi trainer Android untuk anak-anak.
Kalau ada saudara, tetangga, teman yang potensial, pinter, tapi tidak punya biaya kuliah dan
sekiranya membutuhkan pendidikan ini, bisa buka web facebook.com/santrenkoding atau hub
Ali (083838146462). Tempat belajar kami ada di 2 tempat yaitu Jalan candi Penataran Selatan
(https://goo.gl/maps/KezynW8pDK32) dan Jalan Ngesrep Timur 3 Semarang. Bila ingin
membantu adik-adik baik alat, dana atau barang, bisa menghubungi Ali :)
Terimakasih kepada teman-teman pengurus dan member setia yang selalu mendukung kami
baik melalui doa, dana, semangat, dan waktu untuk membuat Sandec menjadi seperti ini.
You’re da real MVP!
6
Kegiatan Santren Koding
7
Kegiatan Sandec Mantab dan Pelatihan Gratis
8
Thanks to 14
Kata Pengantar 15
Hari Pertama 16
Linear Layout ( Membuat Layout Gojek ) 16
Relative Layout 22
Card View + Scroll View 26
Toast & Dialog Box 30
Hari Kedua 45
Splash Screen 45
Membuat New Activity untuk SplashActivity 46
Hari Ketiga 77
Array dan ArrayList 77
RecylcerView 92
Play Sound 106
9
“Manusia yang paling dicintai oleh Allah adalah yang paling bermanfaat untuk manusia.
Dan amalan yang paling dicintai oleh Allah adalah kegembiraan yang engkau masukan ke
hati seorang mukmin, atau engkau hilangkan salah satu kesusahannya, atau engkau
membayarkan hutangnya, atau engkau hilangkan kelaparannya. Dan aku berjalan
bersama saudaraku untuk memenuhi kebutuhannya itu lebih aku cintai daripada
ber-i’tikaf di masjid Nabawi selama sebulan lamanya. Dan siapa yang menahan marahnya
maka Allah akan tutupi auratnya. Barangsiapa yang menahan marahnya padahal ia bisa
menumpahkannya, maka Allah akan penuhi hatinya dengan keridhaan di hari kiamat. Dan
barangsiapa berjalan bersama saudaranya sampai ia memenuhi kebutuhannya, maka
Allah akan mengokohkan kedua kakinya di hari ketika banyak kaki-kaki terpeleset ke api
neraka” (HR. Ath Thabrani 6/139, dishahihkan Al Albani dalam Silsilah Ash Shahihah
2/575).
10
TENTANG PENULIS
Penulis yang satu ini memiliki nama Wakhyudi, anak dari Bapak Bambang
Waluyo dan Ibu Ati Kusmiati. Memiliki Seorang anak bernama Diandra Fathiya Azzahra
dan seorang istri bernama Prawesti Ika Wijayanti. Hobinya dalam berselancar di dunia
maya telah mengantarkannya ke dunia programing yang menakjubkan.
Kesenangannya dalam dunia IT sudah terlihat semenjak penulis menempuh
pendidikan di SMAN 1 Pemalang. Hal itu dibuktikan dalam lomba ICT SMA dan SMK
tingkat kabupaten Pemalang dengan menyabet juara dua.
Penulis juga aktif dalam kegiatan kemasyarakatan di Komplek perumahan.
Menjadi Kordinator Karang Taruna RT dan penggerak Bank Sampah di lingkungan
Rumah. Pernah beberapa kali ikut olimpiade Fisika mahasiswa mewakili UNNES yang
diadakan Pertamina, sampai di level Provinsi.
Ketika menjadi guru di SMK Telekomunikasi Tunas Harapan, menjadi penggerak
kegiatan setor hafalan surat Al Qur’an sebagai sarat presensi kehadiran ekstra Rohis,
Serta menyabet juara tiga Olimpiade Sains Nasional Guru SMK dan SMA tingkat
kabupaten Semarang.
11
Tubagus Haidir Ali, anak sederhana yang lahir di Kendal 08 Maret 1999, awal mula
tertarik dengan dunia IT ketika pada waku SMP sering banget ke warnet buat main game, pas
diwarnet kenal dengan seseorang yang lebih tepatnya adalah penjaga warnet yang kerjaan nya
membuat web dan desain, nah dari situ mulai tertarik dengan dunia IT, setelah sering sharing
dan main billing gratis. Kemudian setelah lulus SMP, Ali memutuskan untuk masuk SMK
dengan jurusan RPL, yah meskipun pada waktu itu belum tau apa itu RPL. Singkat cerita
setelah lulus SMK ternyata gak bisa ngoding, akhirnya cuma bisa kerja di sebuah konter, itupun
satu bulan langsung keluar, dan mencoba kesempatan buat kuliah. Tapi ternyata kuliah juga
gak cocok dan pada akhirnya keluar sebelum ujian semester pertama, singkat cerita lagi
akhirnya ada keinginan buat masuk ke bidang IT lagi tapi yang ada agamanya, akhirnya coba
tanya tanya dan daftar di berbagai instansi seperti Pondok Programmer, dll. Dan singkat cerita
pada tanggal 10 February 2017 akhirnya diterima di Pesantren Programmer Bimadev
Semarang yang sekarang menjadi Santren Koding.
Tiga bulan belajar langsung menjadi Facilitator di Indonesia Android Kejar dari Google
dan sekarang dipercaya untuk menjadi Project Manager Santren Koding.
Kutipan favorite nya adalah:
“Jangan takut untuk bermimpi. Karena mimpi adalah tempat menanam benih harapan
dan memetakan cita-cita.”
Monkey D. Luffy
Pengalaman berkesan:
1. Pernah jadi Fasilitator Android Kejar.
2. Pernah bekerja sebagai Network Engineer di Bandar Udara Ahmad Yani (Migrasi
Server).
3. Menulis buku ini.
4. Ikut event Bekraf Solo.
12
Edwin Setiawan, lahir Kendal 15 November 1998, sekarang ia sedang belajar
pemrogaman lebih dalam di Santren Koding. Salah satu hobinya adalah men-sharing-kan ilmu
melalui menulis buku dan mengajar training pelatihan android gratis maupun berbayar.
Kompetensi di bidang mobile apps, baik android maupun aplikasi game edukasi membuatnya
senang dengan hal tantangan baru.
Banyak event-event yang di ikuti santri IT ini, antara lain fasilitator Indonesia Android
Kejar yang langsung di support oleh google dan juga menjadi trainer di komunitas Sandec. Oh
iya, buku ini di kerjakannya bersama teman-teman santren koding juga lho.
“Berkaryalah karena bangsa Indonesia masih membutuhkan orang kreativ. Jika karyamu
tidak hargai oleh negara sendiri, setidaknya kamu masih bermanfaat dan dibutuhkan
orang lain.”
-Edwin Setiawan-
Aktif dalam mengikuti komunitas membuat ia percaya bahwa akan ikut berperan
merubah mental pola berfikir pelajar di Indonesia menjadi mental juara, khusunya di Semarang.
Dengan menciptakan 1000 developer muda setiap tahun melalui program Sandec Goes To
School.
13
Thanks to
Mas Teguh, mas Yogo, mas Anjar dan mas Ellian yang telah mengikuti
training berbayar Sandec sehingga bisa menjadi sponsor, sehingga buku
ini dapat dilepas ke publik dengan harga terjangkau, termasuk membiayai
operasional pelatihan gratis Sandec setiap sabtu.
14
Kata Pengantar
Segala puji hanya milik NYA,yang telah memberikan kami kesehatan untuk menulis
buku ini sehingga buku ini bisa hadir di hadapan pembaca. Buku android basic ini
adalah sebuah buku fundamental untuk memasuki “belantara” ilmu android yang sangat
luas. Pada buku ini disajikan contoh contoh yang sederhana berkaitan dengan project
project yang ada, harapanya, pembaca lebih mudah untuk memahami konsep
dasarnya. Jika pondasi dasarnya sudah kuat maka saat mengerjakan sesuatu yang
rumit, tidak merasakan turbelensi masalah yang begitu besar.
Kami sadar, bahwa tak ada yang sempurna di dunia ini, termasuk juga buku yang kami
tulis. Kami membuka pintu yang seluas luasnya kepada pembaca untuk memberikan
masukan yang membangun dalam rangka memperbaiki buku ini. Semoga dengan buku
ini bisa mempererat tali persaudaraan kita, amin.
Tim Penulis
15
Hari Pertama
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
16
android:background="#FF0000"
android:gravity="center_horizontal"
android:text="Merah" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#00aa00"
android:gravity="center_horizontal"
android:text="Hijau" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#0000aa"
android:gravity="center_horizontal"
android:text="Biru" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFF00"
android:gravity="center_horizontal"
android:text="Kuning" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FF0000"
android:text="Merah" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#00aa00"
17
android:text="Hijau" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#0000aa"
android:text="Biru" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFF00"
android:text="Kuning" />
</LinearLayout>
</LinearLayout>
18
Konfigurasi Linear Layout mempunyai lima konten yaitu:
1. Orientation
Orientation berfungsi untuk mengurutkan tampilan dalam LinearLayout
Penulisan / syntax nya adalah :
android:orientation=”vertical” /*untuk menurun*/
android:orientation=”horizontal” /*untuk mendatar*/
2. Layout Model
Layout Model adalah bentuk tampilan terhadap element/widget terhadap space
yang tersedia. Terdiri dari tiga pilihan yaitu :
● specific dimension, yaitu kita menentukan sendiri ukurannya, misal 125dp
untuk 125 pixel.
● wrap_content, yaitu widget akan mengikuti ukuran konten yang ada
didalamnya.
● Match_parent, yaitu widget akan mengikuti ukuran space yang kosong
3. Weight
Weight mengatur settingan android:layout_width (untuk baris) dan
droid:layout_height (untuk kolom).
4. Gravity
Gravity digunakan untuk mengatur tata letak suatu konten, syntaxnya adalah
android:gravity=”value” , value gravity adalah center, center_horizontal,
center_vertical, right, left dan lain lain.
5. Padding dan Margin
Padding berguna untuk memberikan ruang kosong di dalam suatu tampilan
sedangkan Margin berguna untuk memberikan ruang kosong diluar suatu tampilan.
19
Menu Gojek
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.gojek.MainActivity">
<ImageView
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/logo_hitam" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
android:gravity="center">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_goride"
android:layout_margin="16dp"/>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gofood"
android:layout_margin="16dp"/>
</LinearLayout>
20
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gomart"
android:layout_margin="16dp"/>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gosend"
android:layout_margin="16dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
21
B. Relative Layout
Perbedaan yang mendasar antara Relative layout dengan Linear layout adalah cara
peletakan komponen view di User Interface. Relative layout menggunakan kerangka
acuan dalam peletakan beberapa komponen view nya. Misalkan begini, kita memiliki
komponen TextView sebanyak tiga buah dan akan disusun vertikal ke bawah
menggunakan relative layout, maka koding nya adalah sebagai berikut :
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.relative.MainActivity">
<TextView
android:id="@+id/tv_a"
android:background="#e9d30b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen A"/>
<TextView
android:id="@+id/tv_b"
android:background="#08f918"
android:layout_below="@id/tv_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen B"/>
<TextView
android:id="@+id/tv_c"
android:background="#07eadf"
android:layout_below="@id/tv_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen C"/>
</RelativeLayout>
22
Preview dari source code tersebut
Layaout di atas hampir sama dengan layout mengunakan linear layout dengan
orientation vertikal. Kalau rekan rekan cermati dari source codenya milik relative layout
ini, untuk meletakan Komponen B di bawah komponen A maka kita harus
menambahkan atribut below komponen A di atribut milik komponen B
android:layout_below="@id/tv_a"
Ini artinya Komponen B menjadikan Komponen A sebagai acuan bagi dirinya. Nah
misalkan ada kasus lain dimana, komponen A ingin berada di pojok kiri atas, komponen
B berada di pojok kanan atas dan komponen C berada di pojok kiri bawah, dengan
menggunakan Relative layout maka source codenya akan menjadi seperti ini :
activitiy_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.relative.MainActivity">
<TextView
android:id="@+id/tv_a"
android:background="#e9d30b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen A"
/>
<TextView
android:id="@+id/tv_b"
android:background="#08f918"
23
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen B"
/>
<TextView
android:id="@+id/tv_c"
android:background="#07eadf"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen C"
/>
</RelativeLayout>
Preview :
24
Untuk kasus ini, acuan dari tiap komponen adalah komponen induk (parent). Komponen
B dibuat align parent top dan align parent right bernilai true sehingga bisa berada di
pojok kanan atas
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
Sedangkan untuk komponen A dan C secara default keduanya mempunyai atribut align
parent left jika pada mode Relative layout.
Misalkan kita mau membuat Komponen A ada ditengah tengah secar vertical dan
horisontal maka atribut di komponen A kita rubah menjadi seperti ini
<TextView
android:id="@+id/tv_a"
android:background="#e9d30b"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Komponen A"/>
Preview :
25
C. Card View + Scroll View
CardView berfungsi seperti frame layout yang akan membungkus tampilan didalam nya
dengan design yang menyerupai kartu. Cara menggunakan nya adalah sebagai berikut
:
26
Klik app dan pilih dependencies
27
Jika muncul error seperti ini
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support:cardview-v7:26.0.0-alpha1'
}
28
Syntaxnya adalah seperti berikut
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.CardView>
Scroll View
29
D. Toast & Dialog Box
Toast dan Message Box adalah sebuah pesan interaktif yang akan disampaikan oleh
user. Toast adalah sebuah pesan/peringatan yang ditampilkan dalam beberapa detik,
berbeda halnya dengan dialog box yang menampilkan pesan berbentuk kotak dan
biasanya menggunakan pilihan kita harus memilih “Ya” atau “Tidak” seperti contoh gambar di
bawah ini.
Membuat Toast
30
2. Klik Image Go Food lalu berikan Id pada image Go-Food.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
31
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView showToast = (ImageView) findViewById(R.id.toastGoFood);
showToast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,
"Pesan Makanan Go-Food, Toast Berhasil", Toast.LENGTH_SHORT).show();
}
});
}
}
5. Kemudian jalankan aplikasi pada emulator atau device kalian masing-masing.
Nah setelah kita membuat Toast, yang akan kita buat selanjutnya adalah Dialog Box.
32
Membuat Dialog Box
Build Target 22
Min SDK 15
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AlertMain" >
<Button
android:id="@+id/one_button_alert"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginTop="25dp"
android:layout_marginLeft="20dp"
android:text="One Button Alert" />
<Button
android:id="@+id/two_button_alert"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/one_button_alert"
android:layout_marginLeft="20dip"
android:text="Two Button Alert" />
33
<Button
android:id="@+id/three_button_alert"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/two_button_alert"
android:layout_marginLeft="20dip"
android:text="Three Button Alert" />
</RelativeLayout>
package com.example.android.dialogbox;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import static android.R.id.button1;
public class MainActivity extends Activity {
private Button button1;
private Button button2;
private Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.one_button_alert);
button2 = (Button) findViewById(R.id.two_button_alert);
button3 = (Button) findViewById(R.id.three_button_alert);
button1.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setTitle("Contoh Alert");
34
builder.setMessage("Alert dengan 1 Action Button ");
builder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "OK");
}
});
builder.show();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setTitle("Contoh Alert");
builder.setMessage("Alert dengan 2 Action Button ");
builder.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "NO");
}
});
builder.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "YES");
}
});
builder.show();
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setTitle("Contoh Alert");
builder.setMessage("Alert dengan 3 Action Button ");
builder.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "NO");
}
});
35
builder.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "YES");
}
});
builder.setNeutralButton("BATAL",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Log.e("info", "BATAL");
}
});
builder.show();
}
});
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
}
36
Lalu kita coba run hasilnya diatas dan hasilnya akan seperti ini.
37
D. Intent activity & Action Bar
Intent adalah sebuah cara yang menghubungkan antar activity di Android. Hal ini mirip
seperti link dalam website yang mengarahkan kita ke halaman yang lainnya. Silahkan
buka project Gojek nya, kita akan menerapkan intent disalah satu layout gojek yang
telah dibuat. Buka MainActivity.java, tuliskan kode onClick pada imageview dengan id
img_go_food :
main_actvity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.gojek.MainActivity">
<ImageView
38
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/logo_hitam" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
android:gravity="center">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_go_ride"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_goride"
android:layout_margin="16dp"/>
<TextView
android:text="GO RIDE"
android:textColor="#000000"
android:gravity="center"
android:textStyle="bold"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/img_go_food"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gofood"
android:onClick="goFood"
android:layout_margin="16dp"/>
<TextView
android:text="GO FOOD"
android:textColor="#000000"
android:gravity="center"
android:textStyle="bold"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
39
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_go_mart"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gomart"
android:layout_margin="16dp"/>
<TextView
android:text="GO MART"
android:textColor="#000000"
android:gravity="center"
android:textStyle="bold"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/img_go_send"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_gosend"
android:layout_margin="16dp"/>
<TextView
android:text="GO SEND"
android:textColor="#000000"
android:gravity="center"
android:textStyle="bold"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
Di file activity main, telah ditambahkan method onClick pada gambar gofood. Jika
gambar ini telah diberi intent, maka ketika gambar di klik akan mengarah kepada
activity yang kita inginkan. Buka MainActivity.java, tambahkan method goFood().
40
MainActivity.java
package com.example.gojek;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goFood(){
}
}
41
Buat activity baru untuk menu Go Food
GoFood.java
package com.example.gojek;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class GoFood extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_go_food);
}
}
42
activity_main.xml activity_go_food.xml
Pada gambar di atas ketika gambar GO FOOD di klik, tampilan akan diarahkan ke
Activity_go_food.xml. Kita tanam intent di gambar GO FOOD, agar bisa direct ke
Activity_go_food.xml. Buka MainActivity.java
MainActivity.java
package com.example.gojek;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
43
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goFood(View view){
Intent intent = new Intent(MainActivity.this,
GoFood.class);
startActivity(intent);
}
}
Penambahan intent ada di public void goFood(View view), yang mempunyai parameter
berupa view. Parameter ini digunakan untuk menerima parameter dari method onClick
di activity_main.xml yang mengarah ke method goFood.Kata intent (dengan huruf “i”
kecil) adalah sebuah variable yang menyimpan objeck intent yang mempunyai dua
parameter. Parameter pertama adalah activity asal, parameter kedua adalah activity
tujuan. startActivity digunakan untuk menjalankan Intent yang telah kita buat agar intent
tersebut berjalan.Pada bagian atas di kedua Activity terdapat action bar dengan kata
Gojek berwarna putih dan berbackgroud biru. Untuk membedakan title tiap activitiy kita
bisa ganti tittle di action bar nya dengan cara menambahkan code
getSuportActionBar.setTitle(“title yang diinginkan”)
GoFood.java
public class GoFood extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_go_food);
getSupportActionBar().setTitle("GO FOOD");
}
}
Silakan di Run. Action Bar milik activity_go_food telah berubah menjadi “GO FOOD”.
44
Hari Kedua
A. Splash Screen
Splash screen adalah “sambutan ” ketika pertama kali membuka sebuah aplikasi.
Beberapa contoh Splash Screen adalah sebagai berikut :
45
1. Membuat New Activity untuk SplashActivity
activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/splash_gojek"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.gojek.SplashActivity">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
46
android:layout_centerHorizontal="true"
android:layout_marginBottom="100dp"/>
</RelativeLayout>
Untuk gambar yang akan ditampilkan di Splash screen terlebih dahulu dipaste di folder
drawable, sehingga dapat dipanggil di activity_splash.xml.
47
3. Memberikan logic di SplashActivity.java
ketikan kode berikut ini :
SplashActivity.java
package com.example.gojek;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
getSupportActionBar().hide();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this,MainActivity.class);
startActivity(intent);
finish();
}
},5000);
}
}
48
4. Setting SplashActivity sebagai Launcer di Manifest
Tukar tempat, nama file .MainActivity ke tempat .SplashActivity, begitu juga sebaliknya,
sehingga akan menjadi seperti ini :
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gojek">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
49
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".GoFood" />
<activity android:name=".MainActivity"></activity>
</application>
</manifest>
Sillakan di Run, hasilnya akan muncul menu Splash dulu selama 5 detik kemudian baru
direct ke MainActivity.
Setelah kita membuat menu dan SplashScreen, saatnya kita coba menghitung biaya.
Pertama kita buat activity baru dengan nama BiayaOjek. Kemudian di activity_main.xml
kita tambahkan onClick pada gambar goRide
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/menu_goride"
android:onClick="biayaOjek"
android:layout_margin="16dp"/>
Selanjutnya kita buka MainActivity.java, buat sebuah method onClick biayaOjek dan
berikan sebuah Intent dengan tujuan BiayaOjek.java
public void biayaOjek(View view) {
Intent intent = new Intent(MainActivity.this, BiayaOjek.class);
startActivity(intent);
}
Setelah itu kita masuk ke activity_biaya_ojek.xml dan buat menu seperti di bawah ini
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
50
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="com.example.gojek.BiayaOjek">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Akumulasi Biaya"
android:textColor="#000000"
android:textSize="16sp" />
<EditText
android:id="@+id/et_kilometer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="Kilometer" />
<Button
android:id="@+id/btn_total_biaya"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="16dp"
android:onClick="totalBiaya"
android:text="Total Biaya" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="16dp"
android:background="#484242" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Total Biaya" />
51
<TextView
android:id="@+id/tv_total"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=": 0" />
</LinearLayout>
</LinearLayout>
Maka Hasilnya akan seperti ini
package com.example.gojek;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
52
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class BiayaOjek extends AppCompatActivity {
EditText etKilometer;
Button btnTotal;
TextView tvTotal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_biaya_ojek);
etKilometer = (EditText) findViewById(R.id.et_kilometer);
btnTotal = (Button) findViewById(R.id.btn_total_biaya);
tvTotal = (TextView) findViewById(R.id.tv_total);
}
public void totalBiaya(View view) {
if (TextUtils.isEmpty(etKilometer.getText())) {
etKilometer.setError("Error");
return;
}
String total = etKilometer.getText().toString();
int totalAngka = Integer.parseInt(total);
int hasil = hitungHarga(totalAngka);
displayMessage(hasil);
}
private int hitungHarga(int total){
int hargaPerKilometer = 1000;
int hasilKali = total * hargaPerKilometer;
return hasilKali;
}
private String hasil(String total) {
String totalHasil = "";
totalHasil = total;
return totalHasil;
}
private void displayMessage(int hasil) {
53
tvTotal.setText(": Rp." + hasil);
}
}
Toast.makeText(this, ""+hasil, Toast.LENGTH_SHORT).show();
public void totalBiaya(View view) {
if (TextUtils.isEmpty(etKilometer.getText())) {
etKilometer.setError("Error");
return;
}
String total = etKilometer.getText().toString();
int totalAngka = Integer.parseInt(total);
int hasil = hitungHarga(totalAngka);
displayMessage(hasil);
Toast.makeText(this, ""+hasil, Toast.LENGTH_SHORT).show();
}
54
55
D. Mengirimkan data via Intent
Intent juga bisa digunakan untuk mengirim data ke activity lain lho, contohnya kita akan
mengirim data ke activity go -food.
56
3. Setelah selesai membuat activity, buatlah layoutnya menjadi seperti gambar
dibawah ini, atau jika susah bisa mengubah activity_go_food.xml dengan kode
dibawah ini.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
tools:context="org.sandec.gojek.GoFood"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/imageView3"
android:layout_width="match_parent"
57
android:layout_height="wrap_content"
app:srcCompat="@drawable/menu_gofood" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="30dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_nama"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="17dp"
android:text="Nama"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/edt_nama"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_toEndOf="@+id/tv_alamat"
android:layout_toRightOf="@+id/tv_alamat"
android:ems="10"
android:inputType="textPostalAddress" />
<TextView
android:id="@+id/tv_alamat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alamat"
android:textSize="18sp"
android:textStyle="bold"
android:layout_alignBaseline="@+id/edt_alamat"
android:layout_alignBottom="@+id/edt_alamat"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:id="@+id/edt_alamat"
android:layout_width="wrap_content"
58
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPostalAddress"
android:layout_below="@+id/edt_nama"
android:layout_alignLeft="@+id/edt_nama"
android:layout_alignStart="@+id/edt_nama" />
<TextView
android:id="@+id/tv_pesan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/edt_pesan"
android:layout_alignBottom="@+id/edt_pesan"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="Pesan"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/edt_pesan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/edt_alamat"
android:layout_alignStart="@+id/edt_alamat"
android:layout_below="@+id/edt_alamat"
android:ems="10"
android:inputType="textPostalAddress" />
</RelativeLayout>
<Button
android:id="@+id/buttonOrder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ORDER" />
</LinearLayout>
59
4. Lalu ubahlah juga kode activity_order_food.xml dengan kode dibawah ini.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
tools:context="org.sandec.gojek.GoFood"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/imageView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/menu_gofood" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="30dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_nama"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="17dp"
android:text="Nama"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/edt_nama"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_toEndOf="@+id/tv_alamat"
android:layout_toRightOf="@+id/tv_alamat"
60
android:ems="10"
android:inputType="textPostalAddress" />
<TextView
android:id="@+id/tv_alamat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alamat"
android:textSize="18sp"
android:textStyle="bold"
android:layout_alignBaseline="@+id/edt_alamat"
android:layout_alignBottom="@+id/edt_alamat"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:id="@+id/edt_alamat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPostalAddress"
android:layout_below="@+id/edt_nama"
android:layout_alignLeft="@+id/edt_nama"
android:layout_alignStart="@+id/edt_nama" />
<TextView
android:id="@+id/tv_pesan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/edt_pesan"
android:layout_alignBottom="@+id/edt_pesan"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="Pesan"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/edt_pesan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/edt_alamat"
android:layout_alignStart="@+id/edt_alamat"
android:layout_below="@+id/edt_alamat"
android:ems="10"
android:inputType="textPostalAddress" />
61
</RelativeLayout>
<Button
android:id="@+id/buttonOrder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ORDER" />
</LinearLayout>
GoFood.java
package org.sandec.gojek;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class GoFood extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_go_food);
final EditText nama = (EditText) findViewById(R.id.edt_nama);
final EditText alamat = (EditText) findViewById(R.id.edt_alamat);
final EditText pesan = (EditText) findViewById(R.id.edt_pesan);
Button order = (Button) findViewById(R.id.buttonOrder);
order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
OrderFood.class);
62
b.putString("alamat", alamat.getText().toString());
b.putString("pesan", pesan.getText().toString());
intent.putExtras(b);
startActivity(intent);
}
});
}
}
OrderFood.java
package org.sandec.gojek;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_food);
Bundle b = getIntent().getExtras();
//membuat obyek dari widget textview
TextView nama = (TextView) findViewById(R.id.tv_nama);
TextView alamat = (TextView) findViewById(R.id.tv_alamat);
TextView pesan = (TextView) findViewById(R.id.tv_pesan);
//menset nilai dari widget textview
nama.setText(b.getCharSequence("nama"));
alamat.setText(b.getCharSequence("alamat"));
pesan.setText(b.getCharSequence("pesan"));
63
Button cancel = (Button) findViewById(R.id.cancelOrder);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new
Intent(OrderFood.this,GoFood.class);
startActivity(intent);
}
});
}
Oke Kita sudah selesai membuat aplikasi pesan go-food gojek dengan menggunakan
pengiriman data intent, coba run di device masing- masing dan lihat apakah kode sudah
benar dan tidak terjadi eror. jika kode tersebut terasa panjang atau masih salah dalam
penulisannya bisa buka
Github masternya yaitu di.
https://github.com/mredwinsetiawan/kirim_data_menggunakan_intent.
64
E. Shared Preferences
Di Android mempunyai beberapa teknik penyimpanan antara lain yaitu :
1. Shared preferences
2. SQLite
3. File Storage
4. Content Provider
5. Cloud Storage
Source : https://stackoverflow.com/questions/9986734/which-android-data-storage-technique-to-use
Pada diklat kali ini, yang dibahas adalah Shared Preferences. Digunakan untuk
menyimpan data simpel berukuran kecil dalam format berpasangan (key dan value).
Biasa digunakan dalam penyimpanan setting, theme, user token dan data berpasangan
yang sejenis. Shared Preferences disimpan dalam bentuk XML di dalam memori
internal device,pada direktory /data/data/app_package_name.
65
Menyimpan Data di Shared Preferences
Ada dua cara menyimpan data melalui Shared Preferences, yaitu :
1. Preferences based Activity
● Digunakan ketika hanya ada satu file preferences dalam Acivity
● Untuk menggunakan file preferencenya menggunakan method
getPreferences(int mode);
2. Custom Preferences
● Digunakan ketika membutuhkan lebih dari satu file preferences dalam Activity
● Untuk menggunakan file preferencenya menggunakan method
getSharedPreferences(String key, int mode);
● String key adalah nama dari preferences file nya
66
Create Shared Preferences
Seperti yang telah diuraikan untuk membuat file Shared Preferences kita bisa
menggunakan method getPreferences(int mode) atau getSharedPreferences(String
Key, int mode).
Contoh :
public void saveLoginDetails(String email, String password){
SharedPreferences sharedPreferences =
context.getSharedPreferences("LoginDetails",
context.MODE_PRIVATE);
}
public void saveLoginDetails(String email, String password){
SharedPreferences sharedPreferences =
context.getSharedPreferences("LoginDetails",
context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("email",email);
editor.putString("password", password);
editor.commit();
}
67
Remove Data in Shared Preferences
Konsepnya hampir sama dengan menyimpan data, untuk menghapus gunakan method
clear() jika ingin menghapus semua data yang ada di shared Preferences, pilih method
remove() jika hanya sebagian saja yang dihapus.
Contoh :
Menghapus semua
editor.clear();
editor.commit();
Menghapus sebagian
editor.remove(“password”);
editor.commit();
PreferencesManager preferencesManager = new PreferencesManager(this);
String tampilEmail = preferencesManager.getEmail();
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
68
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.cekpin.MainActivity">
<TextView
android:text="PIN"
android:layout_marginTop="100dp"
android:layout_gravity="center_horizontal"
android:textSize="30sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edt_pin"
android:layout_marginTop="20dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:hint="Masukan PIN"
android:gravity="center"
android:layout_below="@id/edt_pin"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_login_pin"
android:layout_marginTop="10dp"
android:text="Masuk"
android:onClick="cekPin"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/result"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
69
Hasil dari layout tersebut akan menjadi seperti ini :
Jadi logicnya akan seperti ini, jika aplikasi ini dibuka pertama kali, dia akan mengecek
apakah ada nilai PIN atau masih kosong. Jika kosong dia akan melakukan direct ke
activity SimpanPinActivity.java, kalau tidak kosong, user akan disuruh memasukan Pin
untuk bisa masuk ke activity selanjutnya. Adapun logic di MainActivity.java adalah
sebagai berikut :
MainActivity.java
package com.example.wakhyudi.cekpin;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
70
public class MainActivity extends AppCompatActivity {
EditText edtPin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtPin = (EditText)findViewById(R.id.edt_pin);
SharedPreferences sharedPreferences =
getSharedPreferences("autentikasi",MODE_PRIVATE);
if (sharedPreferences.getString("pin","").isEmpty()){
Intent intent = new Intent(this,SimpanPinActivity.class);
startActivity(intent);
finish();
}
}
public void cekPin(View view){
SharedPreferences sharedPreferences =
getSharedPreferences("autentikasi",MODE_PRIVATE);
if(edtPin.getText().toString().isEmpty()){
Toast.makeText(this,"Mohon isi PIN nya",Toast.LENGTH_LONG).show();
return;
}
String pin_sp = sharedPreferences.getString("pin","");
String pin = edtPin.getText().toString().trim();
if(pin.equals(pin_sp)){
Intent intent = new Intent(this,SimpanPinActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(this,"PIN yang anda masukan salah",
Toast.LENGTH_LONG).show();
}
}
}
Adapun penjelasaan code di atas adalah sebagai berikut :
71
SharedPreferences sharedPreferences =
getSharedPreferences("autentikasi",MODE_PRIVATE);
Digunakan untuk mengakses Object shared preferences dengan key Groupnya adalah
“autentikasi”.
if (sharedPreferences.getString("pin","").isEmpty()){
Intent intent = new Intent(this,SimpanPinActivity.class);
startActivity(intent);
finish();
Mengecek nilai shared preferences di device, apakah ada atau kosong, kalau kosong
maka akan di direct ke activity SimpanPinActivity, kalau sudah di direct maka activity
main akan di destroy (finish) untuk alasan security dan manajemen memory. Jika
shared preferences punya nilai, maka user diharuskan memasukan Pin yang telah
disimpan di shared preferences.
if(edtPin.getText().toString().isEmpty()){
Toast.makeText(this,"Mohon isi PIN nya",Toast.LENGTH_LONG).show();
return;
}
Jika tombol masuk ditekan, sementara nilai pin belum diisi, maka method ini akan
hidup, dengan memunculkan pesan berisi “Mohon isi PIN nya”.
String pin_sp = sharedPreferences.getString("pin","");
String pin = edtPin.getText().toString().trim();
if(pin.equals(pin_sp)){
Intent intent = new Intent(this,SimpanPinActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(this,"PIN yang anda masukan salah",
Toast.LENGTH_LONG).show();
}
72
Jika nilai pin yang dimasukan sama dengan nilai yang ada di shared preferences maka
user akan diarahkan menuju SimpanPinActivity, jika nilainya tidak sama maka, sistem
akan memunculkan pesan “PIN yang anda masukan salah”.
Sekarang kita mulai membuat layout dan logic untuk activity kedua, buat new activity
dengan nama SimpanPinActivity. Adapun source code dari activity ini adalah sebagai
berikut :
activity_simpan_pin.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.cekpin.SimpanPinActivity">
<TextView
android:text="Simpan PIN"
android:textSize="40sp"
android:gravity="center"
android:layout_marginTop="100dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edt_simpan_pin"
android:hint="Masukan PIN"
android:gravity="center"
android:layout_marginTop="20dp"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_simpan_pin"
android:onClick="simpanPin"
android:text="Simpan PIN"
android:layout_gravity="center"
android:layout_width="wrap_content"
73
android:layout_height="wrap_content" />
</LinearLayout>
Preview :
SimpanPinActivity.java
package com.example.wakhyudi.cekpin;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class SimpanPinActivity extends AppCompatActivity {
EditText edtSimpanPin;
@Override
74
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simpan_pin);
edtSimpanPin = (EditText)findViewById(R.id.edt_simpan_pin);
}
public void simpanPin(View view){
SharedPreferences sharedPreferences =
getSharedPreferences("autentikasi",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
if(edtSimpanPin.getText().toString().isEmpty()){
editor.remove("pin");
editor.commit();
Toast.makeText(this,"PIN menjadi kosong",Toast.LENGTH_LONG).show();
return;
}
String simpanPin = edtSimpanPin.getText().toString().trim();
editor.putString("pin",simpanPin);
editor.commit();
Toast.makeText(this,"PIN Anda telah tersimpan",Toast.LENGTH_LONG).show();
}
}
Penjelasan :
public void simpanPin(View view)
Method ini aktif ketika tombol Simpan ditekan,dimana di dalam method ini terjadi update
nilai Shared Preferences.
SharedPreferences.Editor editor = sharedPreferences.edit();
Mode update dalam share preferences agar bisa melakukan proses update nilai.
if(edtSimpanPin.getText().toString().isEmpty()){
editor.remove("pin");
editor.commit();
Toast.makeText(this,"PIN menjadi kosong",Toast.LENGTH_LONG).show();
return;
}
75
Jika tombol simpan diklik, dimana nilai pin masih dikosongi, maka hal ini akan
menghapus nilai pin pada sharedpreferences dan mengembalikannya ke nilai default.
String simpanPin = edtSimpanPin.getText().toString().trim();
editor.putString("pin",simpanPin);
editor.commit();
Toast.makeText(this,"PIN Anda telah tersimpan",Toast.LENGTH_LONG).show();
Jika nilai pin diisi, maka akan nilaii tersebut akan disimpan di sharedpreferences dan
akan memunculkan pesan “PIN Anda telah tersimpan”.
Silakan di run, ketika pertama kali dijalankan, sharedpreferences belum ada nilainya, maka user
akan langsung diarahkan ke activity kedua, silakan isi pin pada activity kedua ini dan simpan.
Jika proses simpan berhasil, kemudian tekan tombol back di hp device. Proses back ini akan
menutup aplikasi secara otomatis. Buka kembali aplikasi tersebut, karena sharedpreferences
sudah terisi, maka user akan diarahkan ke activity yang pertama untuk login dengan pin yang
telah terdaftar.
76
Hari Ketiga
Array adalah kumpulan dari beberapa variabel yang ber type sama dan memiliki
panjang yang tetap, pengurutan elemen array dimulai dari index 0
misalkan kita akan membuat Array int dengan nama arrayBilanganBulat dan panjang
array 5, lalu kita isi array tersebut,
Contoh
package com.company;
public class Main {
public static void main(String[] args) {
int[] arrayBilanganBulat = new int[5];
arrayBilanganBulat[0] = 1;
arrayBilanganBulat[1] = 2;
arrayBilanganBulat[2] = 3;
arrayBilanganBulat[3] = 4;
arrayBilanganBulat[4] = 5;
System.out.print(arrayBilanganBulat[0]);
}
}
Penjelasan : membuat array type data integer dengan nama arrayBilanganBulat dan
panjangnya 5
int[] arrayBilanganBulat = new int[5];
77
Penjelasan : arrayBilanganBulat index 0 bernilai 1, index 1 bernilai 2 dan seterusnya sampai
index 4 bernilai 5.
arrayBilanganBulat[0] = 1;
arrayBilanganBulat[1] = 2;
arrayBilanganBulat[2] = 3;
arrayBilanganBulat[3] = 4;
arrayBilanganBulat[4] = 5;
Hasilnya :
78
ArrayList<>
ArrayList mempunyai operasi yang lebih lengkap dan mudah digunakan daripada Array
biasa.. ArrayList dapat menambah data secara dinamis tanpa harus menentukan
ukurannya terlebih dahulu. Berikut contoh operasi yang dapat dilakukan oleh ArrayList:
Berikut contohnya:
package com.company;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> bilanganBilangan = new ArrayList<>();
System.out.println("jumlah bilanganBulat: " + bilanganBilangan.size());
bilanganBilangan.add("A");
bilanganBilangan.add("B");
bilanganBilangan.add("C");
bilanganBilangan.add(1,"AA");
System.out.println(bilanganBilangan);
System.out.println("Jumlah bilanganBulat: " + bilanganBilangan.size());
System.out.println("Apakah bilanganBulat kosong? "+
bilanganBilangan.isEmpty());
System.out.println("Update bilanganBulat indek ke-1? " +
bilanganBilangan.set(1,"BB"));
System.out.println("Hapus bilanganBulat indek ke-2? " +
bilanganBilangan.remove(2));
79
System.out.println(bilanganBilangan);
}
}
80
B. OOP Miwok
Setelah kita tahu apa itu Array dan Arraylist, saat nya kita masuk ke OOP (Object
Oriented Programming) pada Android
Buat project baru dengan nama Miwok dan ikuti langkah dibawah ini
color.xml
<resources>
<!-- Primary color of the app (shown in the app bar) -->
<color name="primary_color">#4A312A</color>
<!-- Primary dark color of the app (shown in the status bar) -->
<color name="primary_dark_color">#2F1D1A</color>
<!-- Background color for app -->
<color name="tan_background">#FFF7DA</color>
<!-- Background color for the numbers category -->
<color name="category_numbers">#FD8E09</color>
<!-- Background color for the family members category -->
<color name="category_family">#379237</color>
<!-- Background color for the colors category -->
<color name="category_colors">#8800A0</color>
<!-- Background color for the phrases category -->
<color name="category_phrases">#16AFCA</color>
</resources>
Buat resource baru dengan nama dimens.xml lalu isi dengan kode dibawah ini
<resources>
<!-- Height of each list item -->
<dimen name="list_item_height">88dp</dimen>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
81
Strings.xml
<resources>
<!-- Title for the application. [CHAR LIMIT=12] -->
<string name="app_name">Miwok</string>
<!-- Category name for phrases [CHAR LIMIT=20] -->
<string name="category_phrases">Phrases</string>
<!-- Category name for the vocabulary words for colors [CHAR LIMIT=20] -->
<string name="category_colors">Colors</string>
<!-- Category name for the vocabulary words for numbers [CHAR LIMIT=20] -->
<string name="category_numbers">Numbers</string>
<!-- Category name for the vocabulary words for family members [CHAR LIMIT=20]
-->
<string name="category_family">Family Members</string>
</resources>
Styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/primary_color</item>
<item name="colorPrimaryDark">@color/primary_dark_color</item>
</style>
<!-- Style for a category of vocabulary words -->
<style name="CategoryStyle">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">@dimen/list_item_height</item>
<item name="android:gravity">center_vertical</item>
<item name="android:padding">16dp</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:textStyle">bold</item>
<item name="android:textAppearance">?android:textAppearanceMedium</item>
</style>
</resources>
82
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/tan_background"
android:orientation="vertical"
tools:context="com.example.android.miwok.MainActivity">
<TextView
android:id="@+id/numbers"
style="@style/CategoryStyle"
android:background="@color/category_numbers"
android:text="@string/category_numbers" />
<TextView
android:id="@+id/family"
style="@style/CategoryStyle"
android:background="@color/category_family"
android:text="@string/category_family" />
<TextView
android:id="@+id/colors"
style="@style/CategoryStyle"
android:background="@color/category_colors"
android:text="@string/category_colors" />
<TextView
android:id="@+id/phrases"
style="@style/CategoryStyle"
android:background="@color/category_phrases"
android:text="@string/category_phrases" />
</LinearLayout>
MainActivity.java
package com.example.android.miwok;
import android.content.Intent;
import android.os.Bundle;
83
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView numbers = (TextView) findViewById(R.id.numbers);
// Set a click listener on that View
numbers.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent numbersIntent =
new Intent(MainActivity.this, NumbersActivity.class);
// Start the new activity
startActivity(numbersIntent);
}
});
TextView family = (TextView) findViewById(R.id.family);
family.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent familyIntent =
new Intent(MainActivity.this, FamilyActivity.class);
// Start the new activity
startActivity(familyIntent);
}
});
TextView colors = (TextView) findViewById(R.id.colors);
colors.setOnClickListener(new OnClickListener() {
84
@Override
public void onClick(View view) {
Intent colorsIntent = new Intent(MainActivity.this,
ColorsActivity.class);
// Start the new activity
startActivity(colorsIntent);
}
});
TextView phrases = (TextView) findViewById(R.id.phrases);
phrases.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent phrasesIntent =
new Intent(MainActivity.this, PhrasesActivity.class);
// Start the new activity
startActivity(phrasesIntent);
}
});
}
}
85
setContentView(R.layout.word_list);
// Create a list of words
ArrayList<Word> words = new ArrayList<Word>();
words.add(new Word("one", "lutti"));
words.add(new Word("two", "otiiko"));
words.add(new Word("three", "tolookosu"));
words.add(new Word("four", "oyyisa"));
words.add(new Word("five", "massokka"));
words.add(new Word("six", "temmokka"));
words.add(new Word("seven", "kenekaku"));
words.add(new Word("eight", "kawinta"));
words.add(new Word("nine", "wo’e"));
words.add(new Word("ten", "na’aacha"));
WordAdapter adapter = new WordAdapter(this, words);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}
}
PhrasesActivity
package com.example.android.miwok;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class PhrasesActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_list);
// Create a list of words
ArrayList<Word> words = new ArrayList<Word>();
words.add(new Word("Where are you going?", "minto wuksus"));
words.add(new Word("What is your name?", "tinnә
oyaase'nә"));
words.add(new Word("My name is...", "oyaaset..."));
86
words.add(new Word("How are you feeling?", "michәksәs?"));
words.add(new Word("I’m feeling good.", "kuchi achit"));
words.add(new Word("Are you coming?", "әәnәs'aa?"));
words.add(new Word("Yes, I’m coming.", "hәә’ әәnәm"));
words.add(new Word("I’m coming.", "әәnәm"));
words.add(new Word("Let’s go.", "yoowutis"));
words.add(new Word("Come here.", "әnni'nem"));
WordAdapter adapter = new WordAdapter(this, words);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}
}
ColorActivity
package com.example.android.miwok;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class ColorsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_list);
// Create a list of words
ArrayList<Word> words = new ArrayList<Word>();
words.add(new Word("red", "weṭeṭṭi"));
words.add(new Word("mustard yellow", "chiwiiṭә"));
words.add(new Word("dusty yellow", "ṭopiisә"));
words.add(new Word("green", "chokokki"));
words.add(new Word("brown", "ṭakaakki"));
words.add(new Word("gray", "ṭopoppi"));
words.add(new Word("black", "kululli"));
words.add(new Word("white", "kelelli"));
WordAdapter adapter = new WordAdapter(this, words);
87
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}
}
FamilyActivity
package com.example.android.miwok;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class FamilyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_list);
// Create a list of words
ArrayList<Word> words = new ArrayList<Word>();
words.add(new Word("father", "әpә"));
words.add(new Word("mother", "әṭa"));
words.add(new Word("son", "angsi"));
words.add(new Word("daughter", "tune"));
words.add(new Word("older brother", "taachi"));
words.add(new Word("younger brother", "chalitti"));
words.add(new Word("older sister", "teṭe"));
words.add(new Word("younger sister", "kolliti"));
words.add(new Word("grandmother ", "ama"));
words.add(new Word("grandfather", "paapa"));
WordAdapter adapter = new WordAdapter(this, words);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}
}
88
Lalu kita buat layout baru dengan nama list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:id="@+id/text_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="16dp">
<TextView
android:id="@+id/miwok_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="lutti" />
<TextView
android:id="@+id/default_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="one" />
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list"
89
android:orientation="vertical"
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" />
package com.example.android.miwok;
public class Word {
private String mDefaultTranslation;
private String mMiwokTranslation;
public Word(String defaultTranslation, String miwokTranslation) {
mDefaultTranslation = defaultTranslation;
mMiwokTranslation = miwokTranslation;
}
public String getDefaultTranslation() {
return mDefaultTranslation;
}
public String getMiwokTranslation() {
return mMiwokTranslation;
}
}
package com.example.android.miwok;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
90
import java.util.ArrayList;
public class WordAdapter extends ArrayAdapter<Word> {
public WordAdapter(Context context, ArrayList<Word> words) {
super(context, 0, words);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_item, parent, false);
}
Word currentWord = getItem(position);
TextView miwokTextView = (TextView)
listItemView.findViewById(R.id.miwok_text_view);
miwokTextView.setText(currentWord.getMiwokTranslation());
TextView defaultTextView = (TextView)
listItemView.findViewById(R.id.default_text_view);
defaultTextView.setText(currentWord.getDefaultTranslation());
return listItemView;
}
}
91
C. RecylcerView
RecylerView mulai dikenalkan pada Material Design API level 21 (Android 5.0 Lollipop).
RecyclerView adalah pengembangan dari ListView dan GridView. RecylerView lebih
recyclerView adalah pengembangan dari ListView dan GridView. simple dan mudah
pengelolaannya dibandingkan ListView dan GridView. Dua hal penting yang dimiliki
oleh RecylcerView adalah Layout Manager, Adapter dan ViewHolder .
92
2. GridLayoutManager
Digunakan untuk menampiikan list data dalam bentuk Grid. Nilai Orientasinya juga
ada dua yaitu VERTICAL DAN HORISONTAL.
3. StaggeredGridlayoutmanager
Digunakan untuk menampilkan list data dalam bentuk Grid yang sizenya berbeda
beda. Nilai Orientasinya VERTICAL dan HORISONTAL.
93
Source of picture :https://stackoverflow.com/questions/20760166/android-gridview-like-in-flickr
RecyclerView.Adapter
Di Android, Adapter adalah penghubung antara sumber data dengan komponen yang
ada di User Interface (UI), seperti TextView, ListView, RecyclerView dan komponen lain
yang sejenis. Dengan adanya adanya adapter ini akan memudahkan mengisi data di
main UI. Pada RecyclerView hanya memiliki satu adapter saja untuk semua tipe data,
hal ini berbeda dengan ListView yang memiliki lebih dari satu adapter (ArrayAdapter
untuk menampilkan simple list data berjenis Array, BaseAdapter dan SimpleAdapter
untuk menampilkan Custom list). Selain sebagai penghubung antara data dengan
komponen main UI, RecyclerView juga mempunyai fungsi untuk menghadle view
(ViewHolder) dari sebuah object yang akan ditampilkan di main UI. Misal begini, ada
sebuah data yang mempunyai empat objek di dalamnya, di mana masing masing object
memiliki empat atribut. Untuk menampilkan atribut ini ke main UI biasanya kita
menggunakan findViewById, kalau ada empat atribut di satu object, berarti total ada
94
enam belas findViewById yang harus kita tuliskan. Cara ini tidak efektif, maka lahirlah
teknologi view holder ini, dimana kita hanya menuliskan empat findViewById untuk
empat object. Adapun patern penulisan adapter dan ViewHolder adalah sebagai berikut
Acces Modifier class NamaAdapter extends RecyclerView
.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder>
public class MovieAdapter extends
RecyclerView.Adapter<MovieAdapter.MovieViewHolder>
Dependencies {
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
}
Kemudian tekan tombol sync, untuk meload library ini ke Project kita, proses ini
membutuhkan koneksi internet.
3. Mengambil delapan icon di www.freepik.com
Untuk langkah ke dua, icon yang kami ambil adalah icon dengan kategori sport
dengan format png berjumlah delapan. Copykan icon yang telah didapat ke
dalam folder drawable
95
4. Memasukan widget RecyclerView ke dalam activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.recyclerlinear.MainActivity">
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Jenis Jenis Lomba"
android:textSize="30sp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_olahraga"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
96
android:orientation="vertical"
app:cardBackgroundColor="#ea9b07"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll_parent"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_gravity="center"
android:id="@+id/image_olahraga"
android:src="@mipmap/ic_launcher"
android:layout_width="200dp"
android:layout_height="200dp" />
<TextView
android:id="@+id/tv_nama_olahraga"
android:text="Nama Olahraga"
android:layout_gravity="center"
android:textSize="40sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
97
6. Membuat class Olahraga.java untuk menyimpan data.
Olahraga.java
package com.example.wakhyudi.recyclerlinear.model;
/**
* Created by wakhyudi on 05/06/17.
*/
public class Olahraga {
private String namaOlahraga;
private int gambarOlahraga;
public Olahraga(int gambarOlahraga, String namaOlahraga) {
this.namaOlahraga = namaOlahraga;
this.gambarOlahraga = gambarOlahraga;
}
98
public String getNamaOlahraga() {
return namaOlahraga;
}
public int getGambarOlahraga() {
return gambarOlahraga;
}
}
Di class Olahraga inilah data akan disimpan, didunia android class untuk
menyimpan data sering dinamakan class model. Adapun penjelasan dari coding
di atas adalah sebagai berikut :
public Olahraga(int gambarOlahraga, String namaOlahraga)
Ini adalah method constructor, method ini muncul ketika class Olahraga di
instance menjadi Object. Method ini meminta dua input, yaitu int dan String.
this.namaOlahraga = namaOlahraga;
this.gambarOlahraga = gambarOlahraga;
Ketika dua input dimasukan ke dalam method constructor, maka nilai dari
parameter input akan dimasukan ke variable yang ada di dalam (this) objeck
Olahraga.
7. Membuat class OlahragaAdapter.java untuk menghubungkan data dengan
tampilan.
OlahragaAdapter.java
package com.example.wakhyudi.recyclerlinear;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.wakhyudi.recyclerlinear.model.Olahraga;
import java.util.ArrayList;
99
/**
* Created by wakhyudi on 05/06/17.
*/
public class OlahragaAdapter extends RecyclerView.Adapter
<OlahragaAdapter.OlahragaViewHolder> {
private Context context;
private ArrayList<Olahraga>olahraga;
public OlahragaAdapter(Context context,
ArrayList<Olahraga> olahraga){
this.context = context;
this.olahraga = olahraga;
}
@Override
public OlahragaAdapter.OlahragaViewHolder
onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.list_item_olahraga,
Parent,
false);
return new OlahragaViewHolder(view);
}
public class OlahragaViewHolder extends RecyclerView
.ViewHolder {
ImageView imageOlahraga;
TextView namaOlahraga;
public OlahragaViewHolder(View itemView) {
super(itemView);
imageOlahraga = (ImageView)itemView
.findViewById(R.id.image_olahraga);
namaOlahraga = (TextView)itemView
.findViewById(R.id.tv_nama_olahraga);
}
}
@Override
public void onBindViewHolder(OlahragaAdapter.OlahragaViewHolder holder,
int position) {
100
holder.namaOlahraga
.setText(olahraga
.get(position)
.getNamaOlahraga());
holder.imageOlahraga
.setImageResource(olahraga.get(position)
.getGambarOlahraga());
}
@Override
public int getItemCount() {
return olahraga.size();
}
}
public class OlahragaAdapter extends RecyclerView.Adapter<VH>
OlahragaAdapter mewarisi sifat yang dimiliki oleh Adapter dan ViewHolder yang
ada di RecyclerView.
private Context context;
private ArrayList<Olahraga>olahraga;
Inisialisasi variabel Context dan ArrayList (dengan tipe Objek Olahraga) ke
masing masing variabel yang telah ditentukan.
public OlahragaAdapter(Context context,
ArrayList<Olahraga> olahraga)
Method constructor, digunakan ketika class OlahragaAdapter pertama kali
dibuat. Meminta dua parameter input.
@Override
public OlahragaAdapter.OlahragaViewHolder onCreateViewHolder
(ViewGroup parent,int viewType)
Membuat hubungan antara layout parent (dalam hal ini menjadi layout yang akan
“ditempeli”) dengan layout “anak” (dalam hal ini layout yang akan menempel).
101
View view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.list_item_olahraga,
Parent,
false);
return new OlahragaViewHolder(view);
Memasukan hasil view yang telah dihasilkan ke dalam objek
OlahragaViewHolder.
public OlahragaViewHolder(View itemView)
Mengatur view dari layout anak. Mengatur disini aalah melakukan sinkronisasi
view dengan widgetnya (findViewById).
onBindViewHolder(OlahragaAdapter.OlahragaViewHolder holder,
int position)
Mengikat data dari sumber ke dalam view yang ada di layout anak.
public int getItemCount()
Menghitung jumlah objek Olahraga yang ada dari ArrayList yang dibaca.
102
8. Merekayasa logic yang ada di MainActivity.java
MainActivity.java
package com.example.wakhyudi.recyclerlinear;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.wakhyudi.recyclerlinear.model.Olahraga;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ImageView imageOlahraga;
TextView namaOlahraga;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageOlahraga = (ImageView)
findViewById(R.id.image_olahraga);
namaOlahraga = (TextView)
findViewById(R.id.tv_nama_olahraga);
recyclerView = (RecyclerView)
findViewById(R.id.rv_olahraga);
//setting orientasi recylerview, secara default orientasinya vertical
LinearLayoutManager linearLayoutManager =
new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//memasukan data ke variable
String[] namaOlahraga = {"Angkat Besi",
"Basket",
"Sepeda",
"Lari",
"Memanah",
"Ping pong",
"Renang",
"Volli"};
103
int[] gambarOlahraga = {R.drawable.angkatbesi,
R.drawable.basket,
R.drawable.bersepeda,
R.drawable.lari,
R.drawable.panahan,
R.drawable.pingpong,
R.drawable.renang,
R.drawable.volli};
//membuat objek olahragaList yang bertipe objek olahraga
ArrayList<Olahraga>olahragaList = new ArrayList<>();
//melakukan looping sebanyak data yang ada
for(int i = 0; i<namaOlahraga.length;i++){
Olahraga olahraga = new Olahraga(gambarOlahraga[i],
namaOlahraga[i]);
//memasukan data ke olahragaList
olahragaList.add(olahraga);
}
// memasukan objek Olahraga ke Adapter
OlahragaAdapter olahragaAdapter =
new OlahragaAdapter(this,olahragaList);
recyclerView.setAdapter(olahragaAdapter);
}
}
Penjelasan dari kode di atas adalah sebagai berikut :
LinearLayoutManager linearLayoutManager =
new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
Membuat tampilan dari RecyclerView menjadi list yang berorientasi Linear
vertical.
String[] namaOlahraga =
int[] gambarOlahraga =
Memasukan nilai nilai atribut yang didapat ke dalam Array yang sesuai jenisnya.
.
ArrayList<Olahraga>olahragaList = new ArrayList<>();
Mencetak ArrayList dengan tipe Objek Olahraga.
104
for(int i = 0; i<namaOlahraga.length;i++){
Olahraga olahraga = new Olahraga(gambarOlahraga[i],
namaOlahraga[i]);
//memasukan data ke olahragaList
olahragaList.add(olahraga);
}
Melakukan looping utnuk pencetakan Objek Olahraga sebanyak data yang ada.
Dan memasukan Objek olahraga ke dalam ArrayList.
O lahragaAdapter olahragaAdapter =
new OlahragaAdapter(this,olahragaList);
Mencetak constructor class Olahraga Adapter dengan memasukan context
adalah this (this di sini mengacu kepada activity dimana adapter ini dicetak), dan
ArrayList dengan
nama olahragaList.
recyclerView.setAdapter(olahragaAdapter);
Menyeting adapter dari recylerView menggunakan setingan olahragaAdapter.
Ok, tahapan koding telah selesai silakan di Run, dan hasilnya akan menjadi seperti ini :
105
D. Play Sound
Bagaimana memainkan musik didalam aplikasi android kita, yaitu dengan cara
menambahkan kode dan audio. Mari ikuti langkah berikut ini
Cara membuat folder raw res -> new -> Android resource directory
106
3. Setelah itu pastekan lagu yang ingin kita putar.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.android.mediaplayer.MainActivity">
<TextView
android:layout_width="wrap_content"
107
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="BBM Sounstrack "
android:id="@+id/textView"
android:layout_marginTop="59dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLAY"
android:id="@+id/btnPLAY"
android:layout_marginTop="102dp"
android:layout_below="@+id/textView"
android:layout_toLeftOf="@+id/btnPAUSE"
android:layout_toStartOf="@+id/btnPAUSE"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="STOP"
android:id="@+id/btnSTOP"
android:layout_alignTop="@+id/btnPAUSE"
android:layout_toRightOf="@+id/btnPAUSE"
android:layout_toEndOf="@+id/btnPAUSE"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PAUSE"
android:id="@+id/btnPAUSE"
android:layout_alignTop="@+id/btnPLAY"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
package com.example.android.mediaplayer;
import android.media.MediaPlayer;
108
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
/** Called when the activity is first created. */
private Button btnPlay;
private Button btnPause;
private Button btnStop;
private MediaPlayer mp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mp = new MediaPlayer();
btnPlay = (Button) findViewById(R.id.btnPLAY);
btnPause = (Button) findViewById(R.id.btnPAUSE);
btnStop = (Button) findViewById(R.id.btnSTOP);
stateAwal();
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
play();
btnPlay.setEnabled(false);
btnPause.setEnabled(true);
btnStop.setEnabled(true);
}
});
btnPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pause();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
109
public void onClick(View v) {
stop();
}
});
}
/** State Awal / Pertama Dijalankan */
public void stateAwal(){
btnPlay.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
}
/** Dijalankan Oleh Tombol Play */
private void play() {
mp = MediaPlayer.create(this, R.raw.bbm);
try {
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
/** Menjalankan Audio */
mp.start();
/** Penanganan Ketika Suara Berakhir */
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stateAwal();
}
});
}
/** Dijalankan Oleh Tombol Pause */
public void pause(){
if(mp.isPlaying()){
if(mp!=null){
mp.pause();
}
} else {
if(mp!=null){
mp.start();
110
}
}
}
/** Dijalankan Oleh Tombol Stop */
public void stop(){
mp.stop();
try{
mp.prepare();
mp.seekTo(0);
}catch (Throwable t) {
t.printStackTrace();
}
stateAwal();
}
}
6. Setelah Semuanya selesai coba jalankan dan mainkan musik dengan menekan
tombol play
111
Hari Keempat
B. Request di OkHttp
Untuk membuat simple request di OkHttp bisa seperti ini :
Request request = new Request.Builder()
.url(url)
.build();
Url yang dimasukan adalah url web dimana kita melakukan pemesanan. Contoh :
https://api.github.com.
112
C. Response di OkHttp
final String responData = response.body().string();
Dalam hal ini respon yang didapat dari API Web yang kita tuju dimasukan dalam body()
kemudian dirubah ke dalam string().
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.8.0'
}
Setelah ditambahkan, klik tombol sync agar library tersebut terdownload, tunggu
sampai proses selesai. Proses ini membutuhkan koneksi internet.
3. Tambah permission Internet di Manifest
Karena aplikasi yang akan kita buat membutuhkan koneksi ke internet, maka kita
harus tambahkan permission internet di manifest. Secara default aplikasi yang
dibuat tidak mempunyai akses ke internet.
<uses-permission android:name="android.permission.INTERNET"/>
113
4. Setting layout di actitivity_main.xml
Buat layout sederhana seperti ini
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.wakhyudi.sampleokhttp.MainActivity">
<Button
android:id="@+id/btn_tampil"
android:onClick="ambilData"
android:text="Tampilkan"
android:layout_marginTop="50dp"
114
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_tampil"
android:layout_marginTop="20dp"
android:textSize="30sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
</LinearLayout>
115
public void ambilData(View view){
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(getApplicationContext(),
"Conection Failed",
Toast.LENGTH_LONG)
.show();
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response)
throws IOException {
final String responData = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
tvTampil.setText(responData);
}
});
}
});
}
}
public void ambilData(View view), sebuah method yang dipanggil ketika button
Tampilkan ditekan, di dalam method ini terdapat logic dari OkHttp.
OkHttpClient okHttpClient = new OkHttpClient(), membuat sebuah object OkHttp
yang akan menghandle proses Request dan Response kita dalam networking.
Request request = new Request.Builder().url(url).build() , membuat objek
request dengan memasukan url yang telah ditentukan kedalam Builder untuk dibuat
requestnya.
116
okHttpClient.newCall(request).enqueue(new Callback()), request
yang telah dibentuk akan diteruskan (newCall) oleh OkHttp
kedalam network, proses pemanggilan ini dilakukan dalam
Backgroud Thread (enqueue) dengan memanggil method asyntask
(new Callback). Secara otomatis ketika method ini dipanggil
akan menghasilkan dua method yaitu onFailure dan onResponse.
onFailure, digunakan ketika proses pengambilan data di network
gagal.
onResponse, digunakan ketika proses pengambilan data di
network berhasil.
final String responData = response.body().string(), hasil
respon yang disimpan dalam variable responData.
runOnUiThread(new Runnable() , method yang digunakan untuk menghubungkan
background thread dengan UI thread. Dimana akan di eksekusi (public void run())
responData ke dalam TextView (tvTampil).
117
Setelah di Run dan tombol Tampilkan ditekan akan muncul seperti ini
Pada contoh yang telah dipraktekan adalah data yang simpel, hanya terdiri dari
satu baris text. Bagaimana kalau terdiri dari banyak text ? Untuk menjawabnya
kita harus mengenal konsep JSON terlebih dahulu.
Mengenal JSON
JSON (Java Script Object Notation) merupakan format pertukaran data antara client
(Android) dengan server. Sama seperti XML yang bisa dijadikan format pertukaran
data, JSON memiliki kelebihan dibandingkan XML. Syntax JSON lebih mudah dibaca,
lebih ringan dibandingkan XML. Contoh format JSON :
118
{
“Judul” : “Tutorial JSON”,
“Pengarang” : “Wakhyudi Smile”,
“Komentar” : [
{
“Nama” : “Azzam”,
“Komentar” : “Semoga tetap Istiqomah bro”
},
{
“Nama” : “Mutma’inah”
“Komentar” : “Jazakalloh”
}
]
}
119
1. Buat project baru dengan nama Jadwal Donor
2. Tambahkan permission Internet di Manifest
3. Tambahkan library RecylerView , CardView dan OkHttp
4. Setting layout di activity_main.xml
5. Tambah layout list_item_jadwal untuk merekayasa item yang akan ditampilkan
di recyler view
6. Buat JadwalAdapter dan viewholder
7. Setting Logic di MainActivity.java
Untuk langkah pertama dan kedua seperti langkah langkah sebelumnya. Adapun library
yang ditambahkan di dependencies adalah sebagai berikut :
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.squareup.okhttp3:okhttp:3.8.0'
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.example.wakhyudi.jadwaldonor.MainActivity">
<TextView
android:id="@+id/tv_judul"
android:text="JADWAL DONOR"
android:gravity="center"
android:textSize="30sp"
android:textColor="#000000"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list_jadwal"
android:layout_marginTop="30dp"
120
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Layoutnya akan seperti ini :
bit.ly/JadwalDonor
{
"status": "success",
"data": [
{
"instansi": "UTD PMI Kabupaten Bandung\nPT CAHAYA TUNGGAL SANTOSA",
121
"alamat": "Jl.Antapani",
"jam": "09:00:00",
"rencana_donor": "80"
},
{
"instansi": "UTD PMI Kabupaten Bandung\nPT ISS",
"alamat": "BANDUNG",
"jam": "14:00:00",
"rencana_donor": "60"
},
{
"instansi": "UTD PMI Kota Bekasi\nPT BRIDGESTONE",
"alamat": "BEKASI",
"jam": "08:00:00",
"rencana_donor": "150"
},
{
"instansi": "UTD PMI Kabupaten Bogor\nFIF CILEUNGSI",
"alamat": "JL RAYA NAROGONG CILEUNGSI",
"jam": "08:30:00",
"rencana_donor": "60"
},
{
"instansi": "UTD PMI Kabupaten Majalengka\nFIF CILEUNGSI",
"alamat": "JL RAYA NAROGONG CILEUNGSI",
"jam": "08:30:00",
"rencana_donor": "60"
},
{
"instansi": "UTD PMI Kabupaten Bogor\nPT MEDIFARMA",
"alamat": "Cimanggis bogor",
"jam": "13:00:00",
"rencana_donor": "60"
},
{
"instansi": "UTD PMI Kabupaten Majalengka\nPT MEDIFARMA",
"alamat": "Cimanggis bogor",
"jam": "13:00:00",
"rencana_donor": "60"
},
{
"instansi": "UTD PMI Kota Bekasi\nUDD METROPOLITAN MALL BEKASI",
"alamat": "",
"jam": "11:00:00",
"rencana_donor": "30"
},
{
122
"instansi": "UTD PMI Kota Cirebon\nRw 07 karang jalak mekar sunyaragi",
"alamat": "Sunyaragi",
"jam": "09:00:00",
"rencana_donor": "20"
},
{
"instansi": "UTD PMI Kota Cirebon\nRS. PELABUHAN",
"alamat": "JL.SISINGAMANGARAJA",
"jam": "09:00:00",
"rencana_donor": "30"
}
]
}
Secara garis besar dari data JSON yang ditampilkan kita bisa menyimpukan bahwa ada
empat hal yang akan ditampilkan di Androidnya :
{
“Instansi” : “value”,
“Alamat” : “value”,
“Jam” : “value”,
“Rencana_donor” : “value”
}
Berdasarkan hal itu, maka data yang tampilkan di list_item_jadwal sebanyak empat
baris. Oleh karena itu kita buat list_item_jadwal.xml menjadi seperti ini :
list_item_jadwal.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
app:cardBackgroundColor="#dbed0e"
app:contentPadding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll_parent"
android:orientation="vertical"
123
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/ll_baris_pertama"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_intansi"
android:text="Instansi"
android:layout_width="100dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_instansi_value"
android:layout_marginLeft="10dp"
android:text="value instansi"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_baris_kedua"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_alamat"
android:text="Alamat"
android:layout_width="100dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_alamat_value"
android:layout_marginLeft="10dp"
android:text="value alamat"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
124
android:id="@+id/ll_baris_ketiga"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_jam"
android:text="Jam"
android:layout_width="100dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_jam_value"
android:layout_marginLeft="10dp"
android:text="value jam"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_baris_keempat"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_jumlah_donor"
android:text="Jumlah donor"
android:layout_width="100dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_jumlah_donor_value"
android:layout_marginLeft="10dp"
android:text="value jam"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
125
Layout Parentnya memakai CardView agar mudah untuk di customisasi. CardView ini
memiliki satu child, yaitu LinearLayout Parent. LinearLayout Parent ini memiliki empat
child yaitu, linearlayout pertama, kedua, ketiga dan keempat. Linearlayout pertama
sampai keempat masing masing memiliki tiga child berupa TextView.
Preview list_item_jadwal.xml
Ada empat variable data yang sering muncul yaitu instansi, alamat, jam, dan jmlDonor.
Data data ini kita buat dalam satu class bernama Jadwal.java sebagai class bagi data
yang akan di simpan
Jadwal.java
package model;
/**
* Created by wakhyudi on 02/06/17.
*/
public class Jadwal {
private String instansi, alamat,jam,jmlDonor;
126
public Jadwal (String instansi,
String alamat,
String jam,
String jmlDonor){
this.instansi = instansi;
this.alamat = alamat;
this.jam = jam;
this.jmlDonor = jmlDonor;
}
public void setInstansi(String instansi) {
this.instansi = instansi;
}
public String getInstansi() {
return instansi;
}
public String getAlamat() {
return alamat;
}
public String getJam() {
return jam;
}
public String getJmlDonor() {
return jmlDonor;
}
}
Setelah itu kita buat Adapter untuk penghubung antara layout xml nya dengan class
data yang telah Buat (Jadwal.java), serta memasukan class ViewHolder untuk
menghadle view yang ada di list_item_jadwal.xml dengan activity_main.xml.
Adapter yang akan kita buat diberi nama JadwalAdapter
127
JadwalAdapter.java
package com.example.wakhyudi.jadwaldonor;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import model.Jadwal;
/**
* Created by wakhyudi on 02/06/17.
*/
public class JadwalAdapter extends
RecyclerView.Adapter<JadwalAdapter.JadwalViewHolder>{
private Context context;
private ArrayList<Jadwal> jadwalDonor;
public JadwalAdapter(Context context,
ArrayList<Jadwal> jadwalDonor){
this.context = context;
this.jadwalDonor = jadwalDonor;
}
@Override
//menghubungkan layout utama dengan layout item dan akan menghasilkan view yang
dimasukan ke method JadwalViewHolder
public JadwalViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.list_item_jadwal,
Parent,
false);
return new JadwalViewHolder(view);
}
public class JadwalViewHolder extends RecyclerView
.ViewHolder {
128
TextView instansi,
alamat,
jam,
jmlDonor;
public JadwalViewHolder(View itemView) {
super(itemView);
instansi = (TextView)itemView
.findViewById(R.id.tv_instansi_value);
alamat = (TextView)itemView
.findViewById(R.id.tv_alamat_value);
jam = (TextView)itemView
.findViewById(R.id.tv_jam_value);
jmlDonor = (TextView)itemView
.findViewById(R.id.tv_jumlah_donor_value);
}
}
@Override
public void onBindViewHolder(JadwalViewHolder holder, int position) {
holder.instansi.setText(jadwalDonor
.get(position)
.getInstansi());
holder.alamat.setText(jadwalDonor
.get(position)
.getAlamat());
holder.jam.setText(jadwalDonor
.get(position)
.getJam());
holder.jmlDonor.setText(jadwalDonor
.get(position)
.getJmlDonor());
}
@Override
public int getItemCount() {
return jadwalDonor.size();
}
}
Penjelasan kode di atas adalah sebagai berikut :
129
public class JadwalAdapter extends
RecyclerView.Adapter<JadwalAdapter.JadwalViewHolder>
JadwalAdapter menginduk / mewarisi sifat Adapter yang dimiliki oleh RecyclerView. Di
dalam JadwalAdapter juga memiliki JadwalViewHolder
(<JadwalAdapter.JadwalViewHolder>) yang menginduk ke ViewHolder yang dimiliki
RecyclerView.
private Context context;
Digunakan untuk menyimpan context (content) dari sebuah Activity.
private ArrayList<Jadwal> jadwalDonor;
Digunakan untuk menyimpan rangkaian data bertipe Objek Jadwal ke dalam variable
jadwalDonor.
public JadwalAdapter(Context context,
ArrayList<Jadwal> jadwalDonor)
Sebuah method constructor yang muncul pertama kali ketika class JadwalAdapter di
instance. Parameter1 berisi context dari activity, parameter2 berisi variable ArrayList
yang bertipe Objek Jadwal.
public JadwalViewHolder onCreateViewHolder(ViewGroup parent,
int viewType)
Membuat layout parent (untuk case study ini adalah activity_main.xml) bisa “ditempeli”
layout list_item_jadwal.xml.
public JadwalViewHolder(View itemView)
Digunakan untuk menghandle view yang ada dalam layout yang akan “ditempelkan” ke
layout parent. Dalam contoh kali ini view yang ada dalam list_item_jadwal berjumlah
empat yang kesemuanya berjenis TextView. Dengan adanya ViewHolder ini
memudahkan kita dalam memanage findViewById. Bayangkan saja, kita mempunyai
130
sepuluh objek yang memiliki empat TextView dimana masing-masing TextView memiliki
satu findViewById, berarti total yang kita harus membuat empat puluh findViewByid,
tidak efektif bukan. Dengan ViewHolder kita cukup membuat empat findViewById.
public void onBindViewHolder(JadwalViewHolder holder,
int position)
Digunakan untuk menghubungkan view yang ada di jadwalviewholder
dengan data yang ada di Objek Jadwal yang disetting menjadi
ArrayList karena menampung lebih dari satu jadwal. Parameter dua
yaitu position digunakan untuk memasukan index dari
ArrayListnya.
public String getJmlDonor() {
return jmlDonor.size();
}
Digunakan untuk menghitung jumlah data yang ada di jadwalDonor yang bertipe
ArrayList
MainActivity.java
package com.example.wakhyudi.jadwaldonor;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import model.Jadwal;
import okhttp3.Call;
131
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
private String url =
"https://script.googleusercontent.com/macros/echo?user_content_key=L_W6Q5B_wXGyt7T
TR0zhHGVr7tK4Sh5mO9vB8WpKpcxG7mt4cNH8kQfsWW7yXm3Oyw2xhHtmXH0dGeEQP-bkItrpDsyi5OWnO
JmA1Yb3SEsKFZqtv3DaNYcMrmhZHmUMWojr9NvTBuB6lHT6qnqYcmFWggwoSVQQXTsQ1HqKa1CgDXQROm1
OeNR5ibYVAaRxAeOtzLmbRZcVjrce7Uveb8iU1s-L39A_CLDTUaq6azCNVhRMhi1rsPEMUK-CH6pys1RvM
r_dgaGkoVsMt9XllB7kFByHUCzY&lib=M-tpZm-Fm1QX9Yr80nZn_p-WXe3zpGnIr";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView)findViewById(R.id.rv_list_jadwal);
LinearLayoutManager linearLayoutManager = new
LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
final ProgressDialog progressDialog = new
ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading ... ");
progressDialog.show();
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(getApplicationContext(),
"Gagal",
Toast.LENGTH_LONG).show();
}
@Override
public void onResponse(Call call, Response response)
throws IOException {
132
final ArrayList<Jadwal> jadwalDonor = new ArrayList<>();
String jsonData = response.body().string();
try {
JSONObject jsonObject = new JSONObject(jsonData);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for(int i=0;i<jsonArray.length();i++){
JSONObject objectJadi = jsonArray
.getJSONObject(i);
String instansi = objectJadi
.get("instansi")
.toString();
String alamat = objectJadi
.get("alamat")
.toString();
String jam = objectJadi
.get("jam")
.toString();
String jmlDonor = objectJadi
.get("rencana_donor")
.toString();
Jadwal jadwalObjectDonor= new Jadwal(instansi,
Alamat,
Jam,
jmlDonor);
jadwalDonor.add(jadwalObjectDonor);
}
} catch (JSONException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
JadwalAdapter jadwalAdapter =
133
new JadwalAdapter(getApplicationContext()
,jadwalDonor);
recyclerView.setAdapter(jadwalAdapter);
}
});
}
});
}
}
recyclerView.setLayoutManager(linearLayoutManager);
Digunakan untuk menseting layout dari recylerView. Nilai default dari
linearLayoutManager adalah vertical.
final ProgressDialog progressDialog =
new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading ... ");
progressDialog.show();
Digunakan untuk memunculkan progress Loading di layar
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
Proses mencetak objek OkHttp yang digunakan untuk melakukan proses reguest dan
Response.
okHttpClient.newCall(request).enqueue(new Callback()
Proses meneruskan request dan menaruh proses ini dalam background thread.
public void onFailure(Call call, IOException e) {
Toast.makeText(getApplicationContext(),
134
"Gagal",
Toast.LENGTH_LONG)
.show();
}
Digunakan ketika response yang dihasilkan tidak sesuai dengan request atau terjadi
kesalahan di jaringan.
public void onResponse(Call call, Response response)
throws IOException
Digunakan ketika mendapat response dari server
final ArrayList<Jadwal> jadwalDonor = new ArrayList<>();
Digunakan untuk mencetak objek ArrayList bernama jadwalDonor.
String jsonData = response.body().string();
Menyimpan data response dari server ke dalam variable bertipe String bernama
jsonData.
JSONObject jsonObject = new JSONObject(jsonData);
Memasukan variable string jsonData ke dalam jsonObject.
JSONArray jsonArray = jsonObject.getJSONArray("data");
Mendapatkan Array yang ada dalam jsonObjet yang mempunyai key bernama “data”.
for(int i=0;i<jsonArray.length();i++)
Mendapatkan nomor index Array untuk masing masing object.
JSONObject objectJadi = jsonArray.getJSONObject(i);
Mengurai Array yang didapatkan kedalam object object terpisah.
String instansi = objectJadi.get("instansi").toString();
String alamat = objectJadi.get("alamat").toString();
String jam = objectJadi.get("jam").toString();
String jmlDonor = objectJadi.get("rencana_donor").toString();
135
Mendapatkan nilai dari object dengan key masing masing kemudian merubahnya ke
dalam variable bertipe String.
Jadwal jadwalObjectDonor=
new Jadwal(instansi,alamat,jam,jmlDonor);
Membuat objek Jadwal ke dalam jadwal ObjectDonor dan memasukan parameter yang
telah kita dapatkan.
jadwalDonor.add(jadwalObjectDonor);
Memasukan jadwalObjectDonor ke dalam Arraylist jadwalDonor.
catch (JSONException e) {
e.printStackTrace();
}
Menangkap error ketika ada keasalahan dalam hal pengelolaan JSON, sehingga ketika
terjadi error tidak langsung force close.
runOnUiThread(new Runnable());
Menghubungkan main UI dengan Background thread, dimana hasil yang telah didapat
di background akan di run di main UI.
progressDialog.dismiss();
Menghilangkan progress loading karena sudah mendapatkan data
JadwalAdapter jadwalAdapter = new
JadwalAdapter(getApplicationContext(),jadwalDonor);
Membuat object JadwalAdapter ke dalam variable jadwalAdapter, dan menarima
inputan berupa context dari activitynya dan variable jadwalDonor.
recyclerView.setAdapter(jadwalAdapter);
Setting adapter milik recylerview mengikuti setting dari jadwalAdapter.
136
Tampilan hasil Aplikasi ketika di Run
{
"status": "success",
"data": {
“gol": [
{
"value": "a_pos",
"content": "A+"
},
{
137
"value": "b_pos",
"content": "B+"
}],
"provinsi": [
{
"value": "Aceh",
"content": " Aceh"
},
{
"value": "Bali",
"content": " Bali"
}]
}
}
Untuk kasus ini misalkan kita akan mengambil objek yang ada di Array gol, maka perlu
diperhatikan bahwa Array ini terletak dalam objek data. Untuk melakukan hal itu maka
parsing JSON nya kita buat seperti ini :
JSONObject jsonObject = new JSONObject(jsonData);
JSONObject objectData = jsonObject.getJSONObject(“data”);
JSONArray jsonArray = objectData.getJSONArray("gol");
Penjelasan kode di atas adalah sebagai berikut :
Jadi setelah kita dapat object jsonnya hasil dari response server ( new
JSONObject(jsonData), kemudian kita pilih objek yang kita inginkan, dalam paket JSON
yang kita dapatkan ada dua object yaitu “status” dan “data”. Kita memilih object data
(JSONObject objectData = jsonObject.getJSONObject(“data”)) karena di situlah data yang
kita inginkan berada. Setelah itu barulah kita mengambil Array yang kita inginkan dari
object “data” (JSONArray jsonArray = objectData.getJSONArray("gol"))
138
G. Mengambil data dengan request berupa query
Kita akan melakukan request berupa query ke sebuah web movie yang open API
https://www.themoviedb.org
139
8. Membuat Logic di MainActivity.java.
Langkah satu sampai dua kami rasa sudah cukup jelas di materi sebelumnya.
https://api.themoviedb.org/3/search/movie?api_key=(api_key)&query=Jack+Reacher
Total ada empat belas data yang muncul di API nya, di sini kami hanya mengambil
empat data saja untuk ditampilkan di Android, data tersebut antara lain :
backdrop_path, title, release date dan overview.
list_item_movie.xml
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
140
app:cardBackgroundColor="#5eed05"
app:cardCornerRadius="0dp"
android:layout_margin="1dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll_parent"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_view_movie"
android:src="@mipmap/ic_launcher"
android:scaleType="fitXY"
android:padding="5dp"
android:layout_weight="0"
android:layout_width="100dp"
android:layout_height="100dp" />
<LinearLayout
android:id="@+id/ll_keterangan_movie"
android:orientation="vertical"
android:paddingTop="10dp"
android:paddingRight="5dp"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll_baris_judul"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_title"
android:text="Judul"
android:layout_width="80dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_title_value"
android:text="value Judul"
android:paddingLeft="5dp"
141
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_baris_release"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_release"
android:text="Release"
android:layout_width="80dp"
android:layout_height="wrap_content" />
<TextView
android:text=":"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_release_value"
android:text="value Release"
android:paddingLeft="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_baris_overview"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_overview"
android:text="Overview"
android:layout_width="80dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_overview_value"
android:text="value Overview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
142
</android.support.v7.widget.CardView>
Preview list_item_movie.xml
Sebagai parent layoutnya kami gunakan CardView untuk menimbulkan efek seperti di
atas. CardView ini memiliki satu child Linerlayout yang dinamai ll_parent. Ll_parent
memiliki empat child didalamnya yaitu Image_view_movie, ll_baris_judul,
ll_baris_release dan ll_baris_overview.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
143
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.moviedb.MainActivity">
<LinearLayout
android:id="@+id/ll_search"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edt_search_movie"
android:hint="Masukan nama film / aktor"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_search_movie"
android:onClick="searchMovie"
android:text="cari"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:layout_marginTop="20dp"
android:id="@+id/rv_movie_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
144
145
Preview dari coding tersebut :
146
this.posterPath = posterPath;
this.title = title;
this.releaseDate = releaseDate;
}
public String getPosterPath() {
return posterPath;
}
public String getTitle() {
return title;
}
public String getReleaseDate() {
return releaseDate;
}
}
Seperti yang telah dibahas dibagian list_item_movie, bahwa hanya empat data yang
kita ambil dari server, yaitu link gambar, data title danrelease date.
package com.example.wakhyudi.moviedb;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.wakhyudi.moviedb.model.Movie;
import java.util.ArrayList;
/**
* Created by wakhyudi on 03/06/17.
147
*/
public class MovieAdapter extends RecyclerView
.Adapter<MovieAdapter.MovieViewHolder> {
private Context context;
private ArrayList<Movie>movies;
public MovieAdapter(Context context, ArrayList<Movie>movies) {
this.context = context;
this.movies = movies;
}
@Override
public MovieAdapter.MovieViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
Context context = parent.getContext();
View view = LayoutInflater.from(context)
.inflate(R.layout.list_item_movie,
Parent,
false);
MovieViewHolder movieViewHolder = new MovieViewHolder(view);
return movieViewHolder;
}
public class MovieViewHolder extends RecyclerView.ViewHolder {
ImageView imageMovie;
TextView judul;
TextView release;
public MovieViewHolder(View itemView) {
super(itemView);
imageMovie = (ImageView)itemView
.findViewById(R.id.image_view_movie);
judul = (TextView)itemView
.findViewById(R.id.tv_title_value);
release = (TextView)itemView
.findViewById(R.id.tv_release_value);
}
}
@Override
public void onBindViewHolder(MovieAdapter
.MovieViewHolder holder,
int position) {
String pathGambar = movies.get(position)
148
.getPosterPath();
Glide.with(context)
.load("https://image.tmdb.org/t/p/w500/"+pathGambar)
.into(holder.imageMovie);
Holder.judul
.setText(movies
.get(position)
.getTitle());
Holder.release
.setText(movies
.get(position)
.getReleaseDate());
Holder.overview
.setText(movies
.get(position)
.getOverview());
}
@Override
public int getItemCount() {
return movies.size();
}
}
MainActivity.java
package com.example.wakhyudi.moviedb;
import android.app.ProgressDialog;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.example.wakhyudi.moviedb.model.Movie;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.net.MalformedURLException;
149
import java.net.URL;
import java.util.ArrayList;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
final String BASE_MOVIE_URL =
"https://api.themoviedb.org/3/search/movie?api_key=(api_key_nya)";
final String PARAM_QUERY = "query";
EditText edtSearchMovie;
RecyclerView recyclerViewListMovie;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtSearchMovie = (EditText)
findViewById(R.id.edt_search_movie);
recyclerViewListMovie = (RecyclerView)
findViewById(R.id.rv_movie_list);
LinearLayoutManager linearLayoutManager =
new LinearLayoutManager(this);
recyclerViewListMovie.setLayoutManager(linearLayoutManager);
}
public void searchMovie(View view){
final ProgressDialog progressDialog =
new ProgressDialog(this);
progressDialog.setMessage("Loading ...");
progressDialog.show();
//mendapatkan text dari input user
String searchMovieQuery = edtSearchMovie
.getText()
.toString()
.trim();
//proses buld uri dari text yang didapatkan dari user
Uri uri = Uri
.parse(BASE_MOVIE_URL)
.buildUpon()
.appendQueryParameter(PARAM_QUERY,
searchMovieQuery)
.build();
150
String url = uri.toString();
//proses request
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
//mendapat respon
@Override
public void onFailure(Call call, IOException e) {
progressDialog.dismiss();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
"Gagal",
Toast.LENGTH_LONG).show();
}
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
progressDialog.dismiss();
final ArrayList<Movie>moviesList = new ArrayList<>();
String jsonData = response
.body()
.string();
try {
JSONObject jsonObject = new
JSONObject(jsonData);
JSONArray jsonArray = jsonObject
.getJSONArray("results");
for(int i=0; i<jsonArray.length();i++){
JSONObject objectMovie = jsonArray
.getJSONObject(i);
String imagePath = objectMovie
.get("poster_path")
.toString();
String title = objectMovie
.get("title")
151
.toString();
String release = objectMovie
.get("release_date")
.toString();
Movie movie = new Movie(imagePath,
Title,
Release);
moviesList.add(movie);
}
} catch (JSONException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
MovieAdapter movieAdapter = new
MovieAdapter(getApplicationContext(),
moviesList);
recyclerViewListMovie.setAdapter(movieAdapter);
}
});
}
});
}
}
152
Preview dari hasil coding MoviedB :
153
BONUS CHAPTER
154
1. Buat project baru di Andoid Studio dengan nama Company Profile
2. Klik next terus sampai halaman utama Android Studio terbuka
3. Selanjutnya kita install Dependencies CardView
4. Buat 3 Activity baru dengan nama AboutUs, Protofolio, dan Contact
5. Lalu pada activity_main.xml kita masukkan kode berikut
<ImageView
android:layout_width="match_parent"
android:layout_height="240dp"
android:padding="12dp"
android:src="@drawable/capture_sandec" /
>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#6ab954"
android:gravity="center"
android:text="Main Menu"
155
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:onClick="aboutUsKlik">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/ic_profil" />
<TextView
android:layout_width="270dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="8dp"
android:text="About Us"
android:textColor="#6ab954"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_weight="1"
android:src="@mipmap/ic_right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#000000" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:onClick="protofolioKlik">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/protofolio" />
156
<TextView
android:layout_width="270dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="8dp"
android:text="Portofolio"
android:textColor="#6ab954"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_weight="1"
android:src="@mipmap/ic_right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#000000" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:onClick="contactKlik">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/contact" />
<TextView
android:layout_width="270dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="8dp"
android:text="Contact"
android:textColor="#6ab954"
android:textStyle="bold" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_weight="1"
157
android:src="@mipmap/ic_right" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="#6ab954" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
6. Jangan lupa untuk memasukkan gambar pada res drawable & mipmap
7. Pada MainActivity.java kita berikan Intent yang menuju ke 3 Activity yang baru kita buat
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
158
startActivity(intent);
}
9. Activity_about_us.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="com.tubagushaidirali.companyprofile.AboutUs">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#6ab954"
android:gravity="center"
android:text="About Us"
android:textColor="#ffffff"
159
android:textSize="20sp"
android:textStyle="bold" />
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="8dp"
android:src="@drawable/book" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/about_us"
android:textStyle="bold" />
<ImageView
android:layout_width="match_parent"
android:layout_height="180dp"
android:src="@drawable/together" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/about_us_2"
android:textColor="#afb7b7"
android:textSize="12sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/about_us_3" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="#6ab954" />
160
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</ScrollView>
10. Activity_contact.xml
161
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.tubagushaidirali.companyprofile.Contact">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/alamat"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/jalan"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
162
android:text="@string/contact"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/nomer"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/email"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/emailnya"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
163
android:gravity="center"
android:text="@string/website"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/web"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/facebook"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/fb"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
164
android:background="#6ab954"
android:gravity="center"
android:text="@string/telegram"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/tele"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
</LinearLayout>
</LinearLayout>
</ScrollView>
165
11. activity_protofolio.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.tubagushaidirali.companyprofile.Protofolio">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/sandec_weekly_training"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/training_mingguan"
android:textSize="16sp" />
166
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/cs50_sandec"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/cs50"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/santren_koding"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/sankod"
167
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/sandec_hacker_academy"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/sandec_hacker"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/sandec_scholarship"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
168
android:text="@string/scholarship"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:background="#6ab954"
android:gravity="center"
android:text="@string/sandec_career"
android:textColor="#ffffff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="@string/career"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="#6ab954" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</ScrollView>
169
12. Serta jangan lupa untuk meng-edit strings.xml seperti dibawah ini
<resources>
<string name="app_name">Company Profile</string>
<string name="about_us">Pada awal didirikan pada tanggal 31 Juli
2016, Semarang Android Developer Center (SANDEC) merupakan
komunitas Android regional Semarang yang fokus pada pengembangan
dan pelatihan Android Developer. Namun seiring dengan berjalannya
waktu, kami berkembang menjadi Community and StartUp Management di
Semarang. Kami mengelola beberapa komunitas dan StartUp bidang IT
secara professional, sehingga mereka dapat berkembang baik tanpa
harus memikirkan kebutuhannya selain dari core bussines mereka.
</string>
<string name="about_us_2">Skill itu Penting, tetapi Keluarga Jauh
Lebih Penting</string>
<string name="about_us_3">Dalam pengembangan Sumber Daya Manusia
(SDM), kami telah melaksanakan berbagai program guna mengasah skill
170
yang dimiliki SANDEC’s members. Informasi detail dari program
SANDEC bisa diakses di page ini. Semua itu kami lakukan tak lain
sesuai dengan motto kami, yaitu “Learn, Teach, and Grow”. Belajar
untuk meningkatkan skill, Mengajar untuk berbagi ilmu dan Tumbuh
menjadi seorang yang hebat.</string>
<string name="alamat">Alamat</string>
<string name="jalan">Jalan Anjasmoro Raya No.16 dan Jalan
Supriyadi 99</string>
<string name="contact">Contact</string>
<string name="nomer">08XXXXXXXX</string>
<string name="email">Email</string>
<string name="emailnya">sandec.imastudio@gmail.com</string>
<string name="website">Website</string>
<string name="web">www.sandec.org</string>
<string name="facebook">Facebook</string>
<string name="fb">SANDEC Semarang Android Developer
Center</string>
<string name="telegram">Telegram</string>
<string name="tele">https://t.me/AndroidSemarang</string>
<string name="sandec_weekly_training">Sandec Weekly
Training</string>
<string name="training_mingguan">Pelatihan yang ditujukan bagi
SANDEC members yang dilaksanakan setiap hari weekend (Sabtu/
Minggu). Pelatihan ini gratis dan dibagi menjadi 2 level training
yaitu Beginner dan Intermediate.</string>
<string name="cs50_sandec">CS50 SANDEC</string>
<string name="cs50">Mata kuliah pengenalan pemprograman dan
algoritma di Harvard University bagi yang sudah mempunyai
pengalaman membuat program maupun yang belum pernah sama
sekali.</string>
<string name="santren_koding">Santren Koding</string>
<string name="sankod">Program pendidikan Pesantren belajar
Programming + Diniyah selama 1 tahun di Semarang. Kegiatan ini 100%
bebas biaya (GRATIS), tidak ada ikatan dinas, dll.</string>
<string name="sandec_hacker_academy">SANDEC Hacker
Academy</string>
<string name="sandec_hacker">Program yang bertujuan untuk
menciptakan Android Developer handal melalui training dan challenge
yang harus dilalui.</string>
<string name="sandec_scholarship">SANDEC Scholarship</string>
<string name="scholarship">Beasiswa dari SANDEC untuk kamu yang
mau meluangkan waktunya untuk berbagi kepada yang lainnya.</string>
<string name="sandec_career">SANDEC Career</string>
<string name="career">Program training Android GRATIS + Jaminan
Kerja! Anda berkesempatan untuk ditempatkan langsung menjadi
developer di perusahaan mitra kami.</string>
</resources>
171
13. Well Done :)
172
173
174
Make Money From Your App
Ada beberapa cara untuk memonitize app kita supaya menghasilkan earning, cara itu
antara lain sebagai berikut
1. Premium Model
2. Freemium Model
3. Subscription
4. Ads
Untuk penjelasan dari masing masing model adalah sebagai berikut :
Premium Model
Pada model ini user melakukan pembayaran saat mendownload aplikasi. Karena sifatnya yang
premium, sebaiknya aplikasi yang dibuat telah melalui serangkaian tes sehingga aplikasi tidak
crash, ringan digunakan dan tentunya menjadi solusi bagi user yang membeli nya.
Freemium Model
Pada model ini user tidak dikenakan biaya ketika mendownload aplikasi yang kita buat. Aplikasi
pada model ini secara default memiliki fitur yang kita batasi, ketika user mau melakukan
penambahan fitur / upgrade, barulah user dikenakan biaya untuk melakukan penambahan fitur
sesuai yang dibutuhkan.
Subscription
Subscription atau model berlangganan, adalah model yang digunakan ketika aplikasi yang kita
gunakan memiliki jangka waktu dalam penggunaannya. Ketika jangka waktu yang telah
ditentukan habis, maka user harus membayar ulang untuk menggunakan aplikasi tersebut. Ini
hampir sama dengan model premium, bedanya adalah model berlangganan melakukan
pembayaran berulang, sedangkan premium hanya sekali bayar.
Ads
Salah satu strategi monitize yang umum adalah memberikan aplikasi anda secara gratis namun
menjalankan iklan di dalamnya. Jika aplikasi Anda menampilkan iklan, perhatikan juga
kenyamanan user, terlalu banyak iklan membuat aplikasi anda akan segera di uninstall oleh
user. Cara terbaik memasukan iklan ke aplikasi anda adalah menggunakan AdMob.
175
AdMob
Untuk mendapatkan layanan dari AdMob kita harus mempunyai akun AdMob terlebih
dahulu, silakan daftar dulu di sini : www.google.com.admob
Kalau sudah daftar, silakan masuk dashboard, pada bagian app dan pilih add app
Setelah di klik add app, akan muncul pertanyaan apakah app kita sudah di publish di
Playstore? Karena app kita masih bersifat latihan, kita pilih yang no , kita akan
176
membuat AdMob dengan mode test dulu. Hal ini dilakukan untuk menguji terlebih
dahulu apakah layanan AdMob tersebut sudah terintegrasi ke dalam applikasi kita.
Silakan pilih nama Aplikasi nya, dan pilih android, pilih ADD
177
Untuk awal kita akan mencoba membuat iklan dengan format BANNER, silakan di klik
tulisan SELECT di bagian BANNER, isi bagian yang kosong, kalau sudah semua di isi
maka akan muncul App ID , dan ad Unit ID
Simpan App ID dan Ad unit ID, ini yang akan kita gunakan untuk menghubungkan
aplikasi kita dengan layanan AdMob.
Sekarang kita buat new Project untuk membuat AdMob pertama kita. Silakan
tambahkan library AdMob di project kita melalui gradle
compile 'com.google.android.gms:play-services-ads:11.0.2'
Setelah library ditambahkan, jangan lupa lakukan sync agar class dan methodnya bisa
diload ke app kita. Buatlah layout di activity_main.xml mempunyai dua view, yaitu satu
Button dan satu AdView, adapun source code nya adalah sebagai berikut :
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.admobbanner.MainActivity">
178
<Button
android:id="@+id/btn_iklan_terestial"
android:layout_gravity="center"
android:layout_marginTop="100dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Iklan terestial"/>
<com.google.android.gms.ads.AdView
android:id="@+id/adview_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-8792912902643771/4123863840" />
</LinearLayout>
Button di sini akan digunakan nanti saat kita akan menampilkan Iklan dengan Format
Terestial. Di atribut milik AdView, terdapat atribut adSize yang bernilai BANNER (ini
menunjukan format iklannya) dan adUnitId (id iklan yang akan kita tambahkan ke App
kita). Preview dari coding di atas adalah sebagai berikut :
179
Silakan buka MainActivity.java kita akan menambahkan logic di file ini supaya bisa
menampilkan Ads. Adapaun source nya adalah sebagai berikut :
MainActivity.java
package com.example.wakhyudi.admobbanner;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//melakukan proses inialisasi AdMob kita ke Activity tujuan, parameter
pertama adalah activity tujuan, parameter dua adalah App ID
MobileAds.initialize(this,"ca-app-pub-8792912902643771~2647130648");
// menghubungkan xml ke javanya
AdView mAdView = (AdView)findViewById(R.id.adview_banner);
//membuat request iklan untuk app kita
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("0158CB87AE756C276E2B448D47A587C8")
.build();
//memasukan iklan yang didapat ke mAdView
mAdView.loadAd(adRequest);
}
}
180
Ketika di run hasilnya akan seperti ini :
Iklan di atas bukanlah iklan real, iklan tersebut merupakan iklan tes, unutk
mendapatkan iklan real silakan dihilangkan line .addTestDevice
Nah itu adalah iklan dengan format banner, sekarang kita akan membuat iklan dengan
format Terestial. Silakan buat iklan baru dengan langkah sama seperti, bedanya nanti
saat pemilihan format, pilih yang Interstitial. Masukan Ad Unit ID pada TerestialActivity
kedua, dimana activity ini akan dituju, ketika tombol Terestial ditekan. Untuk layout
activity_terestial.xml tidak usah dikasih AdView, karena nanti pengaturannya di
TerestialActivity.java, dan berikut ini adalah source code activity_terestial.xml,
TerestialActivity.java
181
activity_terestial.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wakhyudi.admobbanner.TerestialActivity">
</LinearLayout>
TerestialActivity.java
package com.example.wakhyudi.admobbanner;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
public class TerestialActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_terestial);
//Membuat iklan Terestial di current Activity
final InterstitialAd interstitialAd = new InterstitialAd(this);
//setting ad unit ID di iklan terestial yang kita buat
interstitialAd.setAdUnitId("ca-app-pub-8792912902643771/1127881440");
//membuat request dan melakukan tes di device kita
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("0158CB87AE756C276E2B448D47A587C8")
.build();
//menaruh method listener di Ads kita untuk menangkap proses yang terjadi
interstitialAd.setAdListener(new AdListener() {
//jika iklan berhasil didapatkan, maka iklan akan ditampilkan
@Override
public void onAdLoaded() {
interstitialAd.show();
}
182
});
interstitialAd.loadAd(adRequest);
}
}
183
Publish
Setelah kita yakin dengan aplikasi yang kita buat, dimana kita telah melakukan testing
teerhadap aplikasi. Saatnya kita publish ke Playstore, file yang dipublish ke playstore
mempunyai format .apk. Sebelum release di playstore, apk kita harus didaftarkan dulu untuk
mendapatkan sertifikasi digital atau keystore. Berikut ini adalah cara membuat dan
mendaftarkan apk di android studio kita
1. Pada menu android studio pilihlah menu build -> Generated Signed APK
184
2. Pilih yang create new, untuk mendapatkan keystore nya
3. KeyStore path nya saya arahkan ke folder contoh_keystore, dengan nama filenya
contoh_keystore
185
4. Silakan isi field yang masih kosong
Setelah sudah yakin dengan apa yang diisi silakan diklik ok dan menuju ke step
selanjutnya
186
5. Tentukan di mana folder apk nya, boleh pilih secara default atau bisa dirubah, Build
typenya pilih yang release, bukan yang debug, sementara signature versionnya kita
pilih V1, kalau sudah klik finis.
Selamat Anda sudah berhasil membuat apk yang siap di publish ke Playstore
6. Buka link https://play.google.com/apps/publish dan login dengan akun google play
teman teman
Klik tombol publikasikan aplikasi di Google Play, kemudian di direct ke direktori Toko.
187
7. Pada direktori toko, silakan di isi detail tentang aplikasinya (jenis, deskripsi,
screenschot aplikasi, dan lain sebagainya.
8. Kalau deskripsi sudah lengkap, klik bagian rilis aplikasi, pilih yang kelola produksi
188
9. Pilih upload APK, upload apk yang sudah kita buat dengan signed apk, kalau sudah isi
nama rilisnya, bebas sih, bisa pakai nama App nya. Kemudian scroll ke bawah, klik tombol
Tinjau (preview), kalau sudah yakin silakan klin tombol mulai peluncuran
189