Anda di halaman 1dari 189

1

 
 

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!

Semarang, 18 Juli 2017


Ariaseta Setia Alam

6
Kegiatan Santren Koding

7
Kegiatan Sandec Mantab dan Pelatihan Gratis

   

8
 

Apa itu Sandec dan Santren Koding? 3

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

Hari Keempat 112


Network Library OkHttp 112
Request di OkHttp 112
Response di OkHttp 113
Get simple Data from Internet 113
Mengenal JSON 118
Mengambil Data JSON 119
Parsing JSON dengan Variasi Struktur Data 137
Mengambil data dengan request berupa query 139

BONUS CHAPTER 154


Membuat Aplikasi Company Profile 154
Make Money From Your App 175
AdMob 176
Publish 184
 
 
 

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.

Mempunyai motto hidup :

“Selama Alloh masih memberi nafas jangan menyerah”

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.

Telp : 0838 3814 6462


Fb : Tubagus Haidir Ali
Email : ​tubagushaidirali@gmail.com
Telegram : @betebe

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.

Belajar di Santren Koding membuatnya banyak belajar bagaimana cara mensyukuri


hidup. Dengan cara sholat tepat waktu sampai ikut kajian sunnah. Bayangkan seorang
programmer keren yang bisa ngaji dan jago komputer. Menantu idaman banget bukan, hehe.

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.

Untuk konsultasi melalui email: ​mr.edwinsetiawan@gmail.com

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.

Mas Teguh Mas Ellian


(​teguhe@gmail.com​) (​Beniva9@gmail.com​)

Mas Anjar Mas Yogo


(​Anjarcahyok@gmail.com​) (​yogoarbi@yahoo.com​)

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.

“Skill memang penting tapi keluarga jauh lebih penting”

Tim Penulis

15
Hari Pertama

A. Linear Layout ( Membuat Layout Gojek )


LinearLayout adalah susunan tata letak sederhana yang biasa digunakan oleh
developer Android. Karena layout ini hanya memberikan susunan tata letak secara
garis lurus. Bisa secara Vertical maupun Horizontal.

<?​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 tampi​lan
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
:

Klik file, pilih Project Structure

26
Klik app dan pilih dependencies

Kemudian klik add Library dependency

Kita cari cardview kemudian klik ok

27
J​ika muncul error seperti ini

Klik build.gradle(Module: app)

d​ependencies { 
   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​' 

Hapus kata “​-alpha1​” dan samakan versi nya dengan


'com.android.support:appcompat-v7:​25.3.1​'

Kemudian klik Sync Now

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

Scroll View berfungi untuk membuat tampilan yang bisa di scroll


<​ScrollView 
   ​android​:layout_width=​"match_parent" 
   ​android​:layout_height=​"match_parent"​> 
</​ScrollView​> 

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.

Contoh gambar Toast & Dialog box

Lalu bagaimana cara membuatnya, ikuti langkah berikut ini :

Membuat Toast

1. Buka layout gojek yang telah kita buat.

30
2. Klik Image Go Food lalu berikan Id pada image Go-Food.

3. Berikan nama Id dengan “​toastGoFood​”.

4. Lalu kita ubah MainActivity.java dan lihatlah kode dibawah ini.

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.

Pengertian dari kode diatas adalah sebagai berikut :

● Toast​ = pemanggilan kelas Toast.


● .makeText() = method dari kelas Toast untuk membuat text dari Toast
itu sendiri.
● MainActivity.​this​ = ​Context​ yang saat ini digunakan.
● "​Pesan Makanan Go-Food, Toast Berhasil​" = teks yang akan
ditampilkan di Toast.
● Toast.​LENGTH_SHORT​ = durasi penampilan Toast.
● .show()​ = method untuk menampilkan Toastnya.

Nah setelah kita membuat Toast, yang akan kita buat selanjutnya adalah Dialog Box.

32
Membuat Dialog Box

Selanjutnya kita akan membuat dialog box.

1. Buatlah New Project dengan spesifikasi sebagai berikut :

Project Name Dialog Box

Build Target 22

Package Name com.example.android.dialogbox

Min SDK 15

2. Lalu buatlah activity_main.xml seperti code dibawah ini.

<?​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​> 

3. Lalu buatlah juga pada MainActivity.java.

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

Beri nama Activitinya GoFood, selebihnya tinggal di next dan di finish.

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 :

Splash Screen Facebook Splash Screen Twitter

Adapun urutan urutan pembuatan Splash Screen adalah sebagai berikut


1. Membuat New Activity untuk SplashActivity
2. Menata layout di activity_splash.xml
3. Memberikan logic di SplashActivity.java
4. Setting SplashActivity sebagai Launcher di Manifest

45
1. Membuat New Activity untuk SplashActivity

Beri nama filenya SplashActivity, klik next dan finish.

2. Menata layout di activity_splash.xml


Buka file activity_splash.xml dan ketikan kode berikut ini

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​> 

Tampilan Splash Screen

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​); 
 
   } 

 

Di SplashActivity.java, telah dibuat handler untuk menghandle aktivitas splash itu


sendiri, (5000) menunjukan bahwa activity ini akan ditahan selama 5 detik, parameter
yang dilewatkan melalui parameter kedua ini adalah dalam milisekon. Jadi kalau ingin
Splash Screen muncul selama 10 detik, berarti parameter yang dilewatkan adalah
10000. Parameter pertama mengeksekusi souce code bagian intentnya

48
4. Setting SplashActivity sebagai Launcer di Manifest

Buka AndroidManifest.xml, kita akan melakukan pertukaran nama activity

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.

B. Kalkulasi Biaya di App Gojek

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

Lanjut kita masuk ke BiayaOjek.java dan masukkan kode 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); 
   } 

C. Menampilkan Data via Toast


Setelah aplikasi berjalan dengan lancar, kita akan menampilkannya dalam bentuk
pesan Toast nih, caranya tinggal masukkan kode dibawah ini pada method totalBiaya

Toast.​makeText​(​this​, ​""​+hasil, Toast.​LENGTH_SHORT​).show(); 

Atau lengkapnya seperti ini

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.

1. Bukalah Gojek yang telah kita buat.


2. Buatlah 2 Activity baru dengan nama “GoFood” dan “OrderFood”.

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
​a​ndroid​: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​> 
 

5. ​Copykan kode dibawah ini di ke GoFood.java

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​); 

Bundle b = ​new ​Bundle();


b.putString(​"nama"​, ​nama​.getText().toString());

62
​b.putString(​"alamat"​, ​alamat​.getText().toString()); 
               b.putString(​"pesan"​, ​pesan​.getText().toString()); 
 
               intent.putExtras(b); 
 
               startActivity(intent); 
           } 
       }); 
   } 

6. ​Lalu pastekan kode ini juga di OrderFood.java

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;

public class ​OrderFood ​extends ​AppCompatActivity {

​@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

Jenis jenis Mode di Shared Preferences


Ada tiga jenis mode di Shared Preferences, antara lain yaitu
1. Context.MODE_PRIVATE : default value (tidak dapat diakses oleh aplikasi
lain)
2. Context.MODE_WORLD_READABLE : dapat diakses oleh aplikasi lain
3. Context.MODE_WORLD_WRITEABLE : dapat diakses dan diedit oleh aplikasi
lain.
Context di sini adalah sebuah abstract class yang menyimpan informasi global seperti
resources dalam sebuah aplikasi Android seperti drawable, values, assets dan lain
sejenisnya.

Penamaan standar file preferences oleh Google


Google merekomendasikan kepada developer yang hendak menggunakan Shared
Preferences untuk mengunakan standar penamaan file yaitu, package name + prefered
name.
Contoh :
Package name : com.example.ngojek
Prefered name : user
Name of Preferences file : com.example.ngojek.user

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​); 

Save data in Shared Preferences


Untuk menyimpan data di Shared Preferences, kita perlu menggunakan method edit()
yang ada di dalam class Shared Preferences, dan disimpan dalam objek Editor. Jika
semua data yang telah dibuat atau ditambahkan hendak di simpan, di akhir coding kita
tambahkan method commit() untuk menyimpan perubahan yang dilakukan.
Contoh :

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(); 

Read or get Data From Shared Preferences


Step 1 :
Instance class Shared Preferences yang mendefinisikan getSharedPreferences(String
key, int mode).
Step 2 :
Lakukan pengambilan data dengan method get untuk mengambil data
Contoh :

PreferencesManager preferencesManager = ​new ​PreferencesManager(​this​); 
String tampilEmail = preferencesManager.getEmail()​; 

Shared Preferences di Menu Login


Kita akan menerapkan shared preferences di Login session. Buat new project dan beri
nama file nya Sample Shared Preferences. Buka activitiy_main.xml dan ketikan kode
berikut ini :

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

A. Array dan ArrayList

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​;

Penjelasan : mencetak hasil dari arrayBilanganBulat index 0


System.​out​.print(arrayBilanganBulat[​0​]);

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:

● size(), untuk mencari panjang ArrayList


● add(), untuk menambah elemen baru
● get(), untuk mengambil elemen pada indeks tertentu
● isEmpty(), untuk memeriksa apakah ArrayList kosong atau tidak
● indexOf(), untuk mengetahui indeks dari suatu nilai
● contains(), untuk memeriksa apakah suatu nilai ada dalam ArrayList
● set(), untuk menimpa nilai pada indeks tertentu
● remove(), untuk menghapus nilai pada indeks tertentu

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​> 

Kemudian pada activity_main.xml


<?​xml version=​"1.0" ​encoding=​"utf-8"​?> 
 
<​LinearLayout​ ​xmlns:​android​=​"http://schemas.android.com/apk/res/android" 

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​> 

Kemudian kita buat 4 activity baru dengan nama NumberActivity, ActivityFamily,


ActivityColors, PhrasesActivity.

Selanjutnya pada MainActivity.java implementasikan method onClick tadi dan berikan


Intent didalamnya yang menuju NumberAcivity

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); 
           } 
       }); 
   } 

Selanjutnya pada NumberActivity berikan kode


NumberActivity.java
package ​com.example.android.miwok; 
 
import ​android.os.Bundle; 
import ​android.support.v7.app.AppCompatActivity; 
import ​android.widget.ListView; 
 
import ​java.util.ArrayList; 
 
public class ​NumbersActivity ​extends ​AppCompatActivity { 
 
   ​@Override 
   ​protected void ​onCreate(Bundle savedInstanceState) { 
       ​super​.onCreate(savedInstanceState); 

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​> 

Dan buat lagi layout dengan nama word_list.xml

<?​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" ​/> 

Selanjutnya buat class baru dengan nama Word.java

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​; 
   } 
 

Kemudian buat sebuah adapter dengan nama WordAdapter.java

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; 
   } 

 

Sekarang coba jalankan.

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 .

Layout Manager of RecylerView


Layout manager adalah sebuah konsep baru yang ditawarkan di RecylerView yang
tidak ada di ListView dan GridView. Layout Manager mempunyai tiga tipe antara lain
yaitu
1. LinearLayoutManager
Digunakan untuk menampilkan list data dalam bentuk VERTICAL atau
HORISONTAL.
Nilai default LinearLayoutManager adalah VERTICAL.

LinearLayout VERTICAL LinearLayout HORISONTAL

Source of picture : ​www.abhiandroid.com

92
2. GridLayoutManager
Digunakan untuk menampiikan list data dalam bentuk Grid. Nilai Orientasinya juga
ada dua yaitu VERTICAL DAN HORISONTAL.

Source of picture : ​www.abhiandroid.com

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​> 

Misal kita buat MovieAdapter, maka akan menjadi seperti ini :

public class MovieAdapter extends 
RecyclerView.Adapter<MovieAdapter.MovieViewHolder> 

Membuat RecyclerView dengan LinearLayoutManager


Untuk membuat ini langkah-langkahnya adalah sebagai berikut
1. Membuat project baru dengan nama Recycler Linear
Untuk langkah pertama, kami rasa sudah cukup jelas
2. Menambah libary RecylerView dan CardView ke dalam gradle (Module:app)
Silahkan tambahkan library berikut di dependency nya

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.c​om
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. M​emasukan 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​> 

5. Membuat list_item_olahraga.xml untuk tampilan datanya.


list_item_olahraga.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" 

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​> 

Preview dari code di atas adalah sebagai berikut

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(); 
   } 
 
 

Penjelasan dari kode di atas adalah sebagai berikut :

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​); 

Membuat view dari layout parent (from(parent.getContext())) yang akan dijadikan


media tempel dari layout anak (.inflate(R.layout.list_item_olahraga))

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

1. Pertama start new project dengan nama aplikasi Media Player


2. Kemudian siapkan file mp3 dan simpan di folder raw.

Cara membuat folder raw ​res -> new -> Android resource directory

Kemudian pilih ​raw ​lalu pilih ​OK ​.

106
3. ​Setelah itu pastekan lagu yang ingin kita putar.

4. ​Lalu ubahlah xmlnya seperti dibawah ini.

<?​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​> 
 

5. ​Kemudian ubah juga mainactivity.java dengan kode dibawah ini.

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

A. Network Library OkHttp


Dalam membangun sebuah aplikasi Android tentu tidak bisa terlepas dari networking.
Untuk membangun sebuah aplikasi yang bisa terhubung ke jaringan di mana kita bisa
melakukan proses memesan (REQUEST) dan proses menerima pesanan
(RESPONSE) dibutuhkan sebuah library tambahan untuk melakukannya. Pada diklat
kali ini dibahas mengenai Library yang paling simple dalam pengodingannya, yaitu
okHttp, cocok bagi yang baru mau terjun dalam hal network library untuk menguatkan
konsep dasarnya.
Sebelum membahas terlalu dalam mengenai okHttp, kita harus paham dulu konsep
Thread yang ada di Android. Thread adalah sebuah wadah atau tempat untuk di mana
code yang kita tuliskan dieksekusi. Main Thread di android adalah UI (User Interface)
thread, jadi Thread networking yang hendak kita buat jangan di taruh di Main UI, karena
proses rendering layoutnya akan berat, hal ini dikarenakan networking butuh resource
yang besar. Oleh karena itu, Thread networking akan ditaruh di Background thread.
Untuk menangani telah disiapkan class Asyntask untuk menghbungkan UI thread
dengan Background.

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().

D. Get simple Data from Internet


Kita akan buat sebuah aplikasi yang mengambil data berupa kalimat dari sebuah web
menggunakan library OkHttp, adapun langkah langkahnya sebagai berikut :
1. Buat Project baru dengan nama Sample OkHttp
2. Tambahkan library OkHttp di device
Tambahkan baris berikut di gradle (Module: app), dibagian dependencies

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​> 

5. Membuat logic di MainActivity.java


MainActivity.java
package ​com.example.wakhyudi.sampleokhttp; 
 
import ​android.app.DownloadManager; 
import ​android.support.v7.app.AppCompatActivity; 
import ​android.os.Bundle; 
import ​android.view.View; 
import ​android.widget.TextView; 
import ​android.widget.Toast; 
 
import ​java.io.IOException; 
 
import ​okhttp3.Call; 
import ​okhttp3.Callback; 
import ​okhttp3.OkHttpClient; 
import ​okhttp3.Request; 
import ​okhttp3.Response; 
 
public class ​MainActivity ​extends ​AppCompatActivity { 
TextView ​tvTampil​; 
private final  ​String ​url ​= ​"http://www.gookkis.com/hello.html"​; 
 
@Override 
protected void ​onCreate(Bundle savedInstanceState) { 
       ​super​.onCreate(savedInstanceState); 
       setContentView(R.layout.​activity_main​); 
       ​tvTampil ​= (TextView)findViewById(R.id.​tv_tampil​); 

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” 
 
                          } 
 
                      ] 
 

Tanda {} menunjukan JSON Object, sedangkan tanda [] menunjukan JSONArray. JSON


Object merupakan pasangan ​key dan ​value ​yang diapit tanda kurung kurawal. Contoh
di atas misalkan {“Judul” : “Tutorial JSON”}. ​Key ​nya adalah “Judul”, sedangkan
Valuenya ​adalah “Tutorial JSON”. Untuk JSON Object tidak bersifat sequence (urut),
yang bersifat sequence adalah JSON Array.

E. Mengambil Data JSON


Kita akan mencoba mengambil data JSON dari link bit.ly/JadwalDonor, dan
memasukannya ke dalam RecyclerView di Android kita. Adapun langkah langkahnya
adalah sebagai berikut :

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' 

Untuk setting layoutnya silakan tambahkan recyclerView di 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=​"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 :

Untuk menentukan widget apa saja yang di layout_list_item_jadwal.xml, kita harus


melihat dulu data json yang ada di API web yang akan diambil datanya, Silakan dilihat
data JSON nya yang ada di bit.ly/JadwalDonor

​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
p​ackage ​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

Setelah adapter dan viewholdernya sudah dibentuk, tinggal melakukan finalisasi di


MainActivity dengan menambahkan kode berikut ini :

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); 
                   } 
               }); 
 
           } 
});

}
}

Adapun penjelasan kode di atas adalah sebagai berikut :

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

F. Parsing JSON dengan Variasi Struktur Data


Misal kita akan melakukan parsing JSON dengan struktur data yang berbeda dari
pembelajaran yang diuraikan, misalnya seperti ini :

{
"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

Silakan register terlebih dahulu di ​www.themoviedb.org untuk mendapatkan api key,


simpan api key nya, karena ketika akan mengakses API web ini akan diminta api key
milik kita. Secara garis besar berikut langkah langkah dalam pengerjaan project movie
kali ini :
1. Membuat project baru dengan nama Movie Db.
2. Menambahkan permission internet di manifest.
3. Menambahkan library RecylerView, CardView, OkHttp dan glide di dependency.
4. Membuat layout list_item_movie.xml untuk menampilkan data yang akan
dimunculkan.
5. Memasukan RecylerView dan menu search di layout activity_main.xml.
6. Membuat class Movie.java untuk menyimpan data.
7. Membuat MovieAdapter dan MovieViewHolder yang mengextends Adapter dan
ViewHolder milik RecylerView.

139
8. Membuat Logic di MainActivity.java.
Langkah satu sampai dua kami rasa sudah cukup jelas di materi sebelumnya.

Menambahkan library yang dibutuhkan


compile ​'com.github.bumptech.glide:glide:3.8.0' 
compile ​'com.squareup.okhttp3:okhttp:3.8.0' 
compile ​'com.android.support:recyclerview-v7:25.3.1' 
compile ​'com.android.support:cardview-v7:25.3.1' 

Membuat Layout list_item_movie


Silakan lihat data yang muncul dari menu search movie via web API nya

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.

Setting layout activity_main.xml


Kita akan memasukan widget RecyclerView sebagai jalur “masuk” list_item_movie ke
activity_main. Masukan juga EditText dan Button sebagai proses request ke server

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 :

Membuat Class Movie


Data yang kita dapatkan dari server akan kita simpan dalam Object Movie yang
merupakan instance dari Class Movie. Adapun coding dari Class Movie adalah sebagai
berikut :
Movie.java
package ​com.example.wakhyudi.moviedb.model; 
 
import ​java.util.ArrayList; 
 
/** 
* Created by wakhyudi on 03/06/17. 
*/ 
 
public class ​Movie { 
   ​private ​String ​posterPath​; 
   ​private ​String ​title​;   
   ​private ​String ​releaseDate​; 
   
   
   ​public ​Movie(String posterPath,String title,String releaseDate) 
          { 

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.

Membuat MovieAdapter dan MovieViewHolder


Buatlah MovieAdapter dan MovieViewHolder yang menginduk kepada Adapter dan
ViewHolder yang dimiliki oleh RecyclerView

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

Membuat Aplikasi Company Profile

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

<?​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"
​android​:orientation=​"vertical"
​android​:padding=​"12dp"
​tools​:context=​"com.tubagushaidirali.companyprofile.MainActivity"​>

<​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

public class ​MainActivity ​extends ​AppCompatActivity {

​@Override
​protected void ​onCreate(Bundle savedInstanceState) {
​super​.onCreate(savedInstanceState);
setContentView(R.layout.​activity_main​);
}

​public void ​aboutUsKlik(View view) {


Intent intent = ​new ​Intent(​this​, AboutUs.​class​);

158
startActivity(intent);
}

​public void ​protofolioKlik(View view) {


Intent intent = ​new ​Intent(​this​, Protofolio.​class​);
startActivity(intent);
}

​public void ​contactKlik(View view) {


Intent intent = ​new ​Intent(​this​, Contact.​class​);
startActivity(intent);
}
}

8. Masuk ke layout dan pada masukkan kode berikut.

9. Activity_about_us.xml

<?​xml version=​"1.0" ​encoding=​"utf-8"​?>


<​ScrollView
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=​"vertical"​>

<​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

<?​xml version=​"1.0" ​encoding=​"utf-8"​?>


<​ScrollView
xmlns:​android​=​"http://schemas.android.com/apk/res/android"

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

Kemudian klik tombol NEXT

Kemudian pilih format (bentuk) iklan yang mau ditampilkan

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); 
   } 
}

Preview dari source code di atas :

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

Anda mungkin juga menyukai