Jelajahi eBook
Kategori
Jelajahi Buku audio
Kategori
Jelajahi Majalah
Kategori
Jelajahi Dokumen
Kategori
Android adalah sistem operasi yang dikeluarkan oleh Google khususnya untuk
smartphone dan tablet. Berbagai macam produsen telah menggunakan Android
sebagai sistem operasi untuk device yang mereka produksi. Android juga mempunyai
store dimana terdapat 1 miliar pengguna aktif.
Mengapa Android
Muncul pertanyaan kenapa menggunakan Android ? Android memanjakan
penggunanya dengan fiturnya yang sangat canggih seperti tampilan ui yang bagus
baik dari segi user interface dan user experience, dapat digunakan sebagai alat
multimedia seperti pemutar musik dan video, dan juga menggunakan perangkat keras
seperti akselerometer, gyroscope dan sensor lainnya ke dalam aplikasi. Disamping itu
ada beberapa hal yang membuat Android sebagai sistem operasi yang memang layak
digunakan oleh pengguna atau dikembangkan oleh para developer, seperti yang akan
dijelaskan berikut ini.
Sistem Operasi SmartphoneTerpopuler
Sejak direlease pada tahun 2008, Android mengeluarkan beberapa versi dan hingga
saat ini yang terbaru adalah Nougat yang di release pada tahun 2016. Pada tahun
2013 Android menjadi best-selling OS pada tablet dan menjadi os yang majoritas
digunakan oleh pengguna smartphone. Tercatat pada tahun 2016 store Android
memiliki lebih dari 2.7 juta aplikasi dan lebih dari 2 miliar penggunaaktif tiap bulannya.
Android menarik untuk para perusahaan teknologi yang membutuhkan barang siap
jadi, biaya rendah dan kustomisasi os untuk perangkat teknologi tinggi mereka.
Dengan beberapa kelebihan tersebut membuat perusahaan-perusahaan besar
mengeluarkan produknya dengan menggunakan sistemoperasi Android.
Source code dari Android dikeluarkan oleh Google dengan memiliki lisensi open
source, sehingga menarik para komunitas developer dan entusias untuk
menggunakannya dalam project komunitas.
Store
Aplikasi Android bisa di distribusikan dengan menggunakan web, copy apk, email dan
store. Store Android yaitu Google Play merupakan cara termudah bagi para developer
untuk medistribusikan aplikasinya ke pasar yang memiliki jutaan pengguna.
Google play merupakan store resmi Android yang dikelola oleh Google, pengguna
bisa mencari dan download aplikasi yang di kembangkan dengan menggunakan
Android Software Development Kit. Disamping aplikasi beberapa servis yang
ditawarkan di dalam Google Play adalah media digital, music, buku, majalah, film dan
program televisi.
Bagaimana para developer memonetisasi aplikasi yang ada di dalam Google Play?
Strategi monetisasi aplikasi yang di tawarkan Google Play bermacam-macam dimulai
dari paid distribution (app berbayar), in-app produk, subscriptions, dan ads. Tentunya
developer harus mengikuti aturan yang ada untuk memastikan bahwa pengguna
mendapatkan user experience yang paling bagus.
Sejarah Android
Dibawah ini berupa list sejarah dari Android yang resmi di release oleh Google.
First
Release API
Version Code name DVM/ART Distribution devices to
date level
run version
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-
138363.html
Biasanya muncul pertanyaan? Apakah JRE cukup? Tidak, JRE adalah Java Runtime
Environment yang berfungsi sebagai Virtual Machine untuk menjalankan program
Java. Sedangkan JDK merupakan Java SE Development Kit, dimana JRE juga di ada
di dalamnya. Dan yang lebih penting adalah di dalamnya terdapat compiler dan tools
untuk membuat dan compile program.
Sederhananya JRE untuk menjalankan program, JDK untuk membuat program.
Mari kita mulai dengan proses instalasi dari JDK.
1. Langsung saja buka link di atas menggunakan browser Anda, dan pilih Java
Platform (JDK), tampilan dari layout download dari JDK.
2. Lalu pilihlah yang sesuai dengan device dan os yang Anda pakai.
3. Setelah proses download selesai, langsung install ke device Anda dan ikuti
petunjuknya sampai selesai.
Android Studio
Pada akademi kali ini kita akan menggunakan Android Studio sebagai IDE (Integrated
Development Environment). Android Studio di release 16 May 2013 pada Google IO.
Android Studio berbasiskan JetBrains Intellij IDEA, dan dikhususkan untuk
mengembangkan software berplatform Android.
Untuk Android Studio bisa download dari website resmi google :
https://developer.android.com/studio/index.html
1. Dalam dialog ini kita bisa memberi nama dari aplikasi kita, dan company
domain. Company domain akan di gunakan dalam identifikasi unik dari
aplikasi kita ketika sudah di-publish. Kita juga dapat mengganti dari direktori
dimana project kita akan disimpan.
2. Dialog selanjutnya adalah target devices, di dalam dialog ini kita bisa memilih
target devices dari aplikasi yang akan kita buat. Kita juga bisa mengganti nilai
minimum SDK yang akan di kover oleh aplikasi kita.
4. Dialog selanjutnya adalah nama dari activity yang pertama kali kita buat.
Android Manifest
Manifest adalah salah satu file yang harus ada di dalam sebuah project Android.
Manifest berfungsi sebagai file yang memberikan informasi penting dari sebuah
aplikasi ke sistem Android. Sistem perlu mengetahui apa yang akan digunakan oleh
aplikasi sebelum bisa mulai dijalankan.
Beberapa fungsi yang ada di dalam manifest adalah sebagai berikut.
Nama Package
1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2. package="com.dicoding.myapplication">
Komponen Aplikasi
Berfungsi untuk mendiskripsikan komponen dari aplikasi mulai dari activity,
services, broadcast receiver, dan content provider.
1. <application
2. android:allowBackup="true"
3. android:icon="@mipmap/ic_launcher"
4. android:label="@string/app_name"
5. android:roundIcon="@mipmap/ic_launcher_round"
6. android:supportsRtl="true"
7. android:theme="@style/AppTheme">
8. <activity android:name=".MainActivity">
9. <intent-filter>
10. <action android:name="android.intent.action.MAIN" />
11.
12. <category android:name="android.intent.category.LAUNCHER
" />
13. </intent-filter>
14. </activity>
15.
16. <service
17. android:name=".MyIntentService"
18. android:exported="false" />
19.
20. <receiver
21. android:name=".MyReceiver"
22. android:enabled="true"
23. android:exported="true"></receiver>
24. </application>
Permission
Mendeklarasikan permission apa saja yang harus dimiliki oleh aplikasi untuk
akses ke dalam komponen API seperti internet, external storage, contact, dan
juga untuk berinteraksi kepada aplikasi lainnya.
Gradle
Gradle merupakan open source build automation system. Automation system
berguna untuk mengotomatisasi proses pembuatan dari software build dan proses-
proses terkait lainnya termasuk compile source code menjadi binary code,
packaging binary code, dan menjalankan automated test.
Android Settings
Di dalam block android kita bisa menetapkan compileSDKVersion dan
buildToolsVersion.
Default Config
Di dalamnya terdapat properties seperti applicationID, minSdkVersion,
targetSdkVersion dan test information.
Build Types
Di dalamnya terdapat properties dari debuggable, ProGuard enabling, debug
signing, version name suffix dan test information.
Dependencies
Di dalamnya terdapat `informasi tentang library yang digunakan oleh aplikasi.
Sync Project
Setiap kali terjadi perubahan informasi di dalam build.gradle maka kita harus
melakukan sinkronisasi terlebih dahulu. Tombol sync now akan muncul pada
sebelah kanan atas ketika terjadi perubahan.
Setelah proses sinkronisasi selesai maka akan muncul informasi pada log apakah
proses sinkronisasi berhasil atau tidak.
Testing aplikasi sudah merupakan kewajiban yang harus dilakukan oleh seorang
developer. Proses running atau debugging bisa dilakukan dengan dua cara yaitu
dengan emulator atau device asli. Baik emulator atau device asli memiliki kelebihan
dan kekurangan masing-masing, kita sebagai developer tinggal memilih mana yang
sesuai dengan keperluan kita.
Running menggunakan emulator
Ikuti langkah-langkah berikut untuk run aplikasi kita dengan menggunakan emulator
built-in dari Android Studio.
1. Jalankan icon run, kemudian akan muncul dialog seperti ini. Mari kita coba buat
emulator baru dengan memilih Create New Virtual Device.
2. Akan muncul dialog dengan pilihan beberapa emulator device yang bisa
langsung anda gunakan.
3. Jika anda ingin membuat spesifikasi hardware sendiri bisa dengan memilih
pilihan New Hardware Profile. Maka akan muncul dialog seperti dibawah ini.
Konfigurasi hardware terserah dengan preferensi dari pengguna, yang perlu
diingat adalah gunakanlah konfigurasi emulator yang sesuai dengan
kemampuan dari laptop atau computer yang Anda gunakan. Run emulator
perlu di perhatikan karena emulator akan memakan resource yang cukup
lumayan banyak.
4. Anda dapat membuat hardware emulator baru atau bisa juga memilih dari
hardware emulator yang sudah ada. Setelah memilih hardware emulator
langsung ke langkah selanjutnya yaitu akan muncul dialog seperti ini.
Pada dialog ini anda akan memilih versi android dari emulator yang akan anda
buat. Pada dialog diatas dipilih versi yang sudah terdownload yaitu Nougat.
Tombol download di sebelah kanan versi menunjukkan bahwa anda perlu men-
download-nya terlebih dahulu jika ingin menggunakannya.
5. Selanjutnya klik Next, dan akan muncul dialog verify configuration. Pada dialog
ini anda bisa sekali lagi memverifikasi configurasi dari emulator yang anda pilih.
Di bawah kiri ada tombol Show Advanced Settings, coba anda klik dan akan
muncul tampilan dialog baru seperti ini.
Dari tampilan advanced setting anda bisa kustomisasi hardware yang telah kita
pilih sebelumnya.
6. Jika sudah selesai klik finish dan langsung launch emulatornya dengan
menekan tombol hijau yang ada di sebelah kanan.
7. Okay, selesai setting emulatornya dan bisa langsung dijalankan.
Catatan :
Jika muncul warning bahwa haxm not installed bisa langsung download
dengan mengikuti link download yang disediakan.
Jika muncul warning bahwa VT-x disabled in BIOS maka anda perlu
restart komputer anda, kemudian masuk ke layar BIOS, dan ubah
virtualization-nya menjadi enabled.
1. Lebih cepat
2. Fitur seperti geo-location, push notif bisa digunakan
3. Bisa mengetahui daya serap baterai terhadap aplikasi
4. Lebih mudah
Dengan menggunakan device smartphone asli maka kita dapat mengetahui keadaan
(environment) aplikasi ketika dijalankan di device asli. Dengan memastikan bahwa
aplikasi kita berjalan secara wajar di device asli maka sudah cukup memberikan
jaminan kepada aplikasi kita ketika nantinya di pasarkan (store). Akan tetapi kadang
kala dengan hanya run di satu device belum cukup untuk merepresentasikan
berjalannya aplikasi kita di store, dikarenakan banyaknya model device Android yang
ada di pasaran saat ini. Tapi kita tidak akan membahas masalah ini di dalam akademi
kita.
Mari ikuti langkah-langkah berikut untuk run atau debug di dalam device. Tampilan
dari langkah berikut bisa dipastikan akan berbeda dengan device yang Anda pakai,
akan tetapi secara garis besar langkahnya akan sama meskipun berbeda device
1. Pastikan device yang akan dipakai sesuai dengan target SDK atau paling tidak
min SDK version dari aplikasi kita.
2. Buka setting dan masuk ke dalam menu About. Di dalam about cari informasi
tentang build number.
3. Kemudian tekan build number sebanyak 7 kali.
4. Kembali ke menu setting di awal dan akan muncul menu baru di bawah about
yaitu Developer Options. Selamat anda sudah resmi menjadi seorang
Developer Android.
5. Masuk ke dalam menu Developer options dan pastikan opsi USB Debugging
Mode sudah nyala.
6. Oke selesai setting pada device langsung saja koneksikan dengan laptop atau
computer yang anda pakai.
Hal terakhir setelah mengembangkan aplikasi di Android adalah membuat file
executable dalam bentuk format APK (Android Application Package) yang dapat
didistribusikan agar aplikasi kita dapat sampai ke tangan pengguna. Jika kamu belum
mengerti tentang apk, ini seperti file exe di windows atau ipa di iOS yang akan
didapatkan oleh pengguna untuk melakukan instalasi (pemasangan) aplikasi di device
android. File inilah yang akan nantinya kamu upload ke Google Play agar pengguna
bisa mendownload aplikasi kamu. Kelebihan dari file apk ini adalah kemampuannya
untuk didistribusikan melalui non market aplikasi, bisa melalui website, email, bahkan
flashdisk. Namun, jika aplikasi mu ingin lebih menjangkau lebih jauh pengguna
disarankan tetap melakukan publish aplikasi kamu ke Google Play Store.
Cara membuat file apk di android pun cukup mudah via wizard atau via command line.
Pada sesi kali ini kita akan memfokuskan pada penggunaan wizard untuk melakukan
proses generate apk yang akan kita bagi menjadi dua :
Keystore merupakan sebuah file penting yang kamu harus benar-benar bisa menjaga,
terlebih jika aplikasi buatan kamu adalah calon-calon aplikasi dengan jumlah
download yang besar dan memberikan manfaat banyak. Karna kalau kamu lalai
akibatnya adalah file apk kamu tidak dapat terupdate dan hal terburuknya kamu harus
melakukan dari awal lagi. Berikut adalah tips yang bisa kamu pahami untuk
mengamankan keystore :
1. Plih password yang sulit ditebak, kombinasikan angka, alphabet dan simbol
dalam membuatnya.
2. Bedakan antara keystore password dan keypassword ketika membuat file apk
dengan kustom keystore.
3. Jangan memberikan keystore kepada orang yang tidak dipercaya apalagi kamu
meletakannya didalam file project aplikasi.
App Signing
Jika kamu ingin menemukan dimana default keystore kamu yang berupa
debug.keystore kamu bisa mendapatkannya di ~/.android/debug.keystore Pada mac
dan C:\User\YourUser\.android\debug.keystore pada windows.
Tenang pada latihan kali ini kita sama sekali tidak melakukan pengkodean. Mari kita
mulai dengan yang pertama :
3. Lalu perhatikan secara otomatis pada status bar gradle akan menjalankan
sebuah proses untuk melakukan proses generate apk. Proses ini bergantung
pada seberapa kompleks aplikasi kamu dan seberapa banyak dependensi
dengan library yang kamu gunakan.
4. Ketika berhasil maka di sudut kanan atas android studio kamu akan muncul
notifikasi sebagai berikut :
Sekarang tinggal kamu klik link yangterdapat pada notifikasi tersebut dan
secara otomatis akan diarahkan dimana file apk tersebut berada biasanya pada
struktur seperti berikut project-name/module-name/build/outputs/apk/dan jika
disesuaikan dengan project yang sedang digunakan maka akan menjadi
sepertiberikut MyBroadcastReceiver/app/build/outputs/apk/apk-
debug.apk
5. Tadaaaa… sekarang kamu sudah berhasil membuat apk dengan
menggunakan default keystore. Ingat, apk yang baru saja kamu generate
akan ditolak oleh Google Play Store jika kamu mencoba mengupload dan
publish ke Google Play Store. Agar dapat diterima oleh Google Play Store
kamu harus melakukan signed atau generate dengan menggunakan kustom
keystore.
6. Sekarang coba kamu pindahkan file apk yang barusan kamu buat ke dalam
device kamu (tentunya dengan yang sebelumnya kamu copot (uninstall)
terlebih dahulu) dan dengan file explorer pada device kamu, temukan dan
lakukan instalasi aplikasi seperti biasa dan whoillaaa aplikasi android kamu
bisa terinstal di device! File ini bisa kamu berikan ke kakak, nenek, mbah atau
opung kamu untuk memamerkan kalau kamu sudah bisa bikin aplikasi di
Android yeahh.
7. Mudah bukan ? Sekarang kita lanjut membuat apk dengan kustom keystore.
8. Langkah pertama klik Build → Generate Signed APK
9. Selanjutnya klik next pada dialog dibawah ini :
10. Selanjutnya, pilih create new… pada form yang tampil lengkapi isian
didalamnya menjadi sebagai berikut (ingat ini hanya contoh)
13. Jika ditanyakan tentang password seperti ini, masukan password yang kamu
gunakan untuk device laptop mu.
14. Selanjutnya tentukan dimana kamu menyimpan apk yang dihasilkan. Disini
kami membiarkan secara default. Klik finish untuk memulai signed/generate
apk.
15. Perhatikan pada gradle proses di status bar bagian bawah untuk melihat
progress signed/generate apk
17. Selamat apk production kamu berhasil digenerate. Ingat, ini dilakukan ketika
kamu ingin melakukan upload/reupload plus publish aplikasi kamu di Google
Play dan jangan lupa setiap kamu melakukan update aplikasi jangan lupa untuk
merubah nilai dari
1. versionCode 1 (Incremental)
2. versionName "1.0"
Sebelum melakukan upload update aplikasi. Kalau tidak dirubah siap-siap apk
baru yang akan kamu upload akan ditolak oleh Google Play Store.
Activity Lifecycle
LifeCycle
Proses penghancuran aplikasi bukan hanya pada saat ketika sistem menghancurkan
activity karena membutuhkan memori untuk proses lain; akan tetapi terjadi juga ketika
terjadi perubahan konfigurasi seperti orientation changes, keyboard avalaibility,
dan language. Beberapa proses tersebut ketika terjadi akan
menjalankan onDestroy kemudian langsung memanggil onCreate. Behavior
tersebut dimaksudkan agar activity dapat menyesuaikan dengan konfigurasi yang
baru seperti menyesuaikan ukuran layar.
Hal yang perlu diingat ketika
menggunakan onSaveInstanceState adalah Bundle tidak diperuntukkan
menyimpan data yang besar seperti bitmaps dan Bundle harus melalui proses
serialize serta deserialize yang akan memakan memori.
Tujuan
Logika Dasar
1. Buat Project Baru dengan klik File -> New -> New Project... pada Android
Studio anda
3. Kemudian pilih tipe device untuk aplikasi beserta target minimum SDK yang
akan kita gunakan. Pilihan target Android SDK yang kita pilih akan
mempengaruhi banyaknya device yang bisa menggunakan aplikasi buatan
kita. Disini kita pilih untuk tipe device Phone and Tablet dengan minimum
SDK diset ke Level 15 (Ice Cream Sandwich)/ Klik Next untuk melanjutkan.
4. Pada bagian ini kita akan memilih tipe Activity awal dari template yang telah
disediakan. Saat ini Android Studio sudah menyediakan berbagai macam
template Activity dari yang paling sederhana hingga yang paling kompleks
seperti :
Add No Activity : Tidak ada Activity yang ditambahkan
Basic Activity : Activity dengan template komponen
material design seperti FloatingActionButton
Empty Activity : Activity dalam bentuk yang paling dasar
Fullscreen Activity : Activity fullscreen tanpa status bar
Google AdMob Ads Activity : Activity dengan default konfigurasi iklan
Admob
Google Maps Activity : Activity dengan menyediakan konfigurasi
dasar Google Maps
Login Activity : Activity untuk halaman login
Master / Detail Flow : Activity yang diperuntukan untuk alur
aplikasi Master Detail pada device tablet
Navigation Drawer Activity : Activity dengan tampilan side bar menu
Scrolling Activity : Activity dengan kemampuan Scroll konten
didalamnya secara vertical
Settings Activity : Activity yang diperuntukan untuk
Konfigurasi Aplikasi
Tabbed Activity : Activity yang diperuntukan untuk
menampilkan lebih dari satu tampilan, dapat digeser ke kanan dan ke kiri
(Swipe) dan dengan menggunakan komponen ViewPager
Saat ini kita pilih tipe Empty Activity, klik Next untuk melanjutkan.
5. Selanjutnya, tentukan nama Activity pertama kita, saat ini kita biarkan pada
kondisi apa adanya. Ingat, jika suatu saat nanti kita ingin melakukan
penambahan Activity, best practice nya adalah dengan menambahkan
Activity setelah kata nama kelas yang akan kita buat. Misal: ProfileActivity,
SettingsActivity dan lain sebagainya. Klik Finish untuk menyelesaikan.
6. Selamat!, Anda telah berhasil membuat sebuah project baru Android. Layar
anda pasti akan seperti dibawah ini:
7. Di sebelah kanan anda adalah workspace dimana Activity anda berada dan
bernama MainActivity.java dengan layoutnya activity_main.xml. Di sebelah
kiri anda terdapat struktur project anda dimana nanti kita akan banyak
menambahkan berbagai komponen, asset dan library. Untuk lebih mengenal
Android Studio lebih dalam silakan baca materi
ini https://developer.android.com/studio/intro/index.html
Selanjutnya kita akan mulai melakukan pengkodean aplikasi atau lebih enaknya
disebut ngoding. Berikut flow umumnya.
Ngoding Layout untuk User Interface aplikasi
Ngoding Activity untuk menambahkan logika aplikasi
Jangan ngetik saja atau ngoding polos, Gunakan ctrl + space untuk
menggunakan code completion dari Android Studio agar mengoptimasi import
package dari komponen yang digunakan.
Dilarang Keras untuk copy - paste! Ngoding pelan-pelan akan membuat anda
lebih jago di masa depan.
Selamat ngoding!
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr
oid"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:paddingBottom="@dimen/activity_vertical_margin"
6. android:paddingLeft="@dimen/activity_horizontal_margin"
7. android:paddingRight="@dimen/activity_horizontal_margin"
8. android:paddingTop="@dimen/activity_vertical_margin"
9. android:orientation="vertical"
10. tools:context="com.dicoding.associate.barvolume.MainActivity">
11. <TextView
12. android:layout_width="match_parent"
13. android:layout_height="wrap_content"
14. android:text="Panjang"
15. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
16. <EditText
17. android:id="@+id/edt_length"
18. android:layout_width="match_parent"
19. android:layout_height="wrap_content"
20. android:inputType="numberDecimal"
21. android:lines="1"
22. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
23. <TextView
24. android:layout_width="match_parent"
25. android:layout_height="wrap_content"
26. android:text="Lebar"
27. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
28. <EditText
29. android:id="@+id/edt_width"
30. android:layout_width="match_parent"
31. android:layout_height="wrap_content"
32. android:inputType="numberDecimal"
33. android:lines="1"
34. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
35. <TextView
36. android:layout_width="match_parent"
37. android:layout_height="wrap_content"
38. android:text="Tinggi"
39. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
40. <EditText
41. android:id="@+id/edt_height"
42. android:layout_width="match_parent"
43. android:layout_height="wrap_content"
44. android:inputType="numberDecimal"
45. android:lines="1"
46. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
47. <Button
48. android:id="@+id/btn_calculate"
49. android:layout_width="match_parent"
50. android:layout_height="wrap_content"
51. android:text="Hitung"
52. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
53. <TextView
54. android:id="@+id/tv_result"
55. android:layout_width="match_parent"
56. android:layout_height="wrap_content"
57. android:text="Hasil"
58. android:gravity="center"
59. android:textSize="24sp"
60. android:textStyle="bold"
61. android:layout_marginBottom="@dimen/activity_vertical_margin
"/>
62. </LinearLayout>
2. Akan muncul warning pada attribut android:text pada layout tersebut. Ini
disebabkan karena kita hardcode code string kita. Mari kita hilangkan code
warning tersebut dengan menekan alt+enter pada attribut android:text. Akan
muncul dialog seperti ini, pilihlah extract string resource.
3. Kemudian akan muncul dialog seperti dibawah ini, sesuaikan dengan nama
yang ada.
5. Jika terjadi error pada attribut dimens, maka kita perlu menambahkan file
dimens.xml di dalam res → values → dimens.xml. Error ini disebabkan
karena pada Android Studio 2.3 file dimens.xml sudah tidak di generate
secara otomatis ketika sebuah project dibuat. Langsung saja tambahkan
dengan cara klik kanan pada directory res. Akan muncul dialog seperti ini.
6. Kemudian isikan sesuai di bawah ini.
7. Jika file dimens.xml sudah terbuat, sesuaikan isi dari dimens.xml menjadi
seperti berikut.
1. <resources>
2. <!-- Default screen margins, per the Android Design guidelines.
-->
3. <dimen name="activity_horizontal_margin">16dp</dimen>
4. <dimen name="activity_vertical_margin">16dp</dimen>
5. </resources>
Itu tandanya adb (Android Debugger) device yang anda punya telah
terkoneksi dengan Android Studio. Jika anda tidak memiliki device silakan
gunakan emulator. Ikuti materinya
disini https://developer.android.com/studio/run/managing-avds.html.
Kemudian tambahkan juga beberapa baris berikut pada baris terakhir method
onCreate
9. if (savedInstanceState != null){
10. String hasil = savedInstanceState.getString(STATE_HASIL);
11. tvResult.setText(hasil);
12. }
4. Silakan jalankan aplikasi kembali kemudian coba lakukan perhitungan dan
ganti orientasi device. Jika sudah benar maka hasil perhitungan akan dijaga.
Bedah Kode
1. xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
1. tools:context="com.dicoding.associate.barvolume.MainActivity"
1. <TextView
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:text="Panjang"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
match_parent: Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan
ukuran layar secara horizontal jika pada layout_width dan vertikal jika
pada layout_height.
wrap_content : Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan
ukuran konten didalamnya baik secara horizontal pada layout_width dan vertikal
jika pada layout_height.
@dimen/activity_vertical_margin: Value activity_vertical_margin berasal dari file
resource dimens.xml yang bisa anda lihat dengan cara menekan dan tahan
tombol ctrl (atau command) + arahkan kursor keatasnya dan kemudian klik sekali.
Penggunaan centralize resource value akan memudahkan anda sewaktu
developmen aplikasi Android. Penggunaan cara tersebut supaya tidak menulis value
yang sama berulang-ulang.
Apa itu ‘@+id/’ ?
Salah satu contoh penerapan penggunaan @+id/ sebagai berikut:
1. <Button
2. android:id="@+id/btn_calculate"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:text="Hitung"
6. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
1. android:id="@+id/btn_calculate"
Jika kita memberikan id pada sebuah View maka kita telah memberikan identifier
untuk View tersebut agar:
Bisa kita manipulasi/dikontrol pada level logic di komponen
seperti Activity atau Fragment. ID ini akan diciptakan di file R.java kedalam bentuk
nilai hexa bertipe data Integer à public static final int btn_calculate=0x7f0b0057;
Sebagai acuan untuk penyusunan tampilan pada RelativeLayout (akan dibahas
pada modul selanjutnya).
1. implements View.OnClickListener
Ini adalah listener yang kita implementasikan untuk melakukan proses event klik
pada komponen tombol (button)
Jangan khawatir, silakan klik ke atas baris merah tersebut dan silakan klik pada
icon atau dengan tekan tombol (Alt + Enter) lalu pilih implements method
Deklarasi semua komponen View yang akan dimanipulasi. Kita deklarasikan secara
global agar bisa dikenal di keseluruhan bagian kelas.
1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.activity_main);
5. edtWidth = (EditText)findViewById(R.id.edt_width);
6. edtHeight = (EditText)findViewById(R.id.edt_height);
7. edtLength = (EditText)findViewById(R.id.edt_length);
8. btnCalculate = (Button)findViewById(R.id.btn_calculate);
9. tvResult = (TextView)findViewById(R.id.tv_result);
10. btnCalculate.setOnClickListener(this);
11. }
Method onCreate() merupakan method utama pada Activity. Di sinilah kita dapat
mengatur layout xml dan semua proses inisialisasi komponen yang akan digunakan
diciptakan. Pada method ini kita casting semua komponen View yang kita telah
deklarasikan sebelumnya, agar dapat kita manipulasi.
1. setContentView(R.layout.activity_main);
Maksud baris diatas adalah bahwa kelas MainActivity akan menampilkan tampilan
yang berasal dari layout activity_main.xml
1. edtWidth = (EditText)findViewById(R.id.edt_width);
Maksud dari baris diatas adalah obyek EditText edtWidth disesuaikan (Cast)
dengan komponen EditText ber-ID edt_width di layout xml melalui
method findViewById()
1. btnCalculate.setOnClickListener(this);
Set Event Click Listener untuk obyek btnCalculate sehingga dapat melakukan
sebuah aksi ketika pengguna melakukan Klik. Keyword this menekankan pada
obyek Activity saat ini yang telah mengimplementasikan
listener OnClickListener sebelumnya.
Pembahasan saveInstanceState
1. @Override
2. protected void onSaveInstanceState(Bundle outState) {
3.
4. outState.putString(STATE_HASIL, tvResult.getText().toString());
5. super.onSaveInstanceState(outState);
6. }
1. if (savedInstanceState != null){
2. String hasil = savedInstanceState.getString(STATE_HASIL);
3. tvResult.setText(hasil);
4. }
Pada onCreate inilah kita menggunakan nilai bundle yang telah kita simpan tadi
pada onSaveInstanceState kemudian kita isikan kembali pada tvResult.
Teori
Intent adalah mekanisme untuk melakukan sebuah action dan komunikasi antar
komponen aplikasi misal Activity, Services, dan Broadcast Receiver. Ada tiga
penggunaan umum Intent dalam aplikasi Android yaitu:
Memindahkan satu Activity ke Activity lain dengan atau tidak membawa data.
Menjalankan background Service misal melakukan sinkronisasi ke server dan
menjalankan proses berulang (periodic/scheduler task).
Mengirimkan obyek broadcast ke app yang membutuhkan. Misal jika aplikasi
membutuhkan proses menjalankan sebuah background service setiap aplikasi
selesai melakukan booting. Aplikasi harus bisa menerima obyek Broadcast
yang dikirimkan oleh sistem Android untuk event booting tersebut.
Starting an activity
An Activity represents a single screen in an app. You can start a new instance of
an Activity by passing an Intent to startActivity(). The Intent describes the
activity to start and carries any necessary data.
If you want to receive a result from the activity when it finishes,
call startActivityForResult(). Your activity receives the result as a
separate Intent object in your activity's onActivityResult() callback. For more
information, see the Activities guide.
Starting a service
A Service is a component that performs operations in the background without a user
interface. With Android 5.0 (API level 21) and later, you can start a service
with JobScheduler. For more information about JobScheduler, see its API-reference
documentation.
For versions earlier than Android 5.0 (API level 21), you can start a service by using methods
of theService class. You can start a service to perform a one-time operation (such as
downloading a file) by passing an Intent to startService(). The Intent describes the
service to start and carries any necessary data.
If the service is designed with a client-server interface, you can bind to the service from
another component by passing an Intent to bindService(). For more information, see
the Services guide.
Delivering a broadcast
A broadcast is a message that any app can receive. The system delivers various broadcasts for
system events, such as when the system boots up or the device starts charging. You can
deliver a broadcast to other apps by passing
an Intent to sendBroadcast() or sendOrderedBroadcast().
The rest of this page explains how intents work and how to use them. For related information,
see Interacting with Other Apps and Sharing Content.
Intent types
Explicit intents specify which application will satisfy the intent, by supplying either the
target app's package name or a fully-qualified component class name. You'll typically use an
explicit intent to start a component in your own app, because you know the class name of the
activity or service you want to start. For example, you might start a new activity within your
app in response to a user action, or start a service to download a file in the background.
Implicit intents do not name a specific component, but instead declare a general action to
perform, which allows a component from another app to handle it. For example, if you want
to show the user a location on a map, you can use an implicit intent to request that another
capable app show a specified location on a map.
Figure 1 shows how an intent is used when starting an activity. When the Intent object
names a specific activity component explicitly, the system immediately starts that
component.
Figure 1. How an implicit intent is delivered through the system to start another activity: [1] Activity
A creates anIntent with an action description and passes it to startActivity(). [2] The Android
System searches all apps for an intent filter that matches the intent. When a match is found, [3] the system
starts the matching activity (Activity B) by invoking its onCreate() method and passing it the Intent.
When you use an implicit intent, the Android system finds the appropriate component to start
by comparing the contents of the intent to the intent filters declared in the manifest file of
other apps on the device. If the intent matches an intent filter, the system starts that
component and delivers it the Intent object. If multiple intent filters are compatible, the
system displays a dialog so the user can pick which app to use.
An intent filter is an expression in an app's manifest file that specifies the type of intents that
the component would like to receive. For instance, by declaring an intent filter for an activity,
you make it possible for other apps to directly start your activity with a certain kind of intent.
Likewise, if you do notdeclare any intent filters for an activity, then it can be started only
with an explicit intent.
Caution: To ensure that your app is secure, always use an explicit intent when starting a Service and do
not declare intent filters for your services. Using an implicit intent to start a service is a security hazard
because you can't be certain what service will respond to the intent, and the user can't see which service
starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you
call bindService() with an implicit intent.
Building an intent
An Intent object carries information that the Android system uses to determine which
component to start (such as the exact component name or component category that should
receive the intent), plus information that the recipient component uses in order to properly
perform the action (such as the action to take and the data to act upon).
Component name
This is optional, but it's the critical piece of information that makes an intent explicit,
meaning that the intent should be delivered only to the app component defined by the
component name. Without a component name, the intent is implicit and the system
decides which component should receive the intent based on the other intent
information (such as the action, data, and category—described below). If you need to
start a specific component in your app, you should specify the component name.
Note: When starting a Service, always specify the component name. Otherwise, you cannot be
certain what service will respond to the intent, and the user cannot see which service starts.
This field of the Intent is a ComponentName object, which you can specify using a
fully qualified class name of the target component, including the package name of the
app, for example,com.example.ExampleActivity. You can set the component
name with setComponent(), setClass(), setClassName(), or with
the Intent constructor.
Action
A string that specifies the generic action to perform (such as view or pick).
In the case of a broadcast intent, this is the action that took place and is being
reported. The action largely determines how the rest of the intent is structured—
particularly the information that is contained in the data and extras.
You can specify your own actions for use by intents within your app (or for use by
other apps to invoke components in your app), but you usually specify action
constants defined by the Intent class or other framework classes. Here are some
common actions for starting an activity:
ACTION_VIEW
Use this action in an intent with startActivity() when you have some
information that an activity can show to the user, such as a photo to view in a gallery
app, or an address to view in a map app.
ACTION_SEND
Also known as the share intent, you should use this in an intent
with startActivity() when you have some data that the user can share through
another app, such as an email app or social sharing app.
See the Intent class reference for more constants that define generic actions. Other
actions are defined elsewhere in the Android framework, such as in Settings for
actions that open specific screens in the system's Settings app.
You can specify the action for an intent with setAction() or with
an Intent constructor.
If you define your own actions, be sure to include your app's package name as a
prefix, as shown in the following example:
Data
The URI (a Uri object) that references the data to be acted on and/or the MIME type
of that data. The type of data supplied is generally dictated by the intent's action. For
example, if the action is ACTION_EDIT, the data should contain the URI of the
document to edit.
When creating an intent, it's often important to specify the type of data (its MIME
type) in addition to its URI. For example, an activity that's able to display images
probably won't be able to play an audio file, even though the URI formats could be
similar. Specifying the MIME type of your data helps the Android system find the
best component to receive your intent. However, the MIME type can sometimes be
inferred from the URI—particularly when the data is a content: URI.
A content: URI indicates the data is located on the device and controlled by
a ContentProvider, which makes the data MIME type visible to the system.
To set only the data URI, call setData(). To set only the MIME type,
call setType(). If necessary, you can set both explicitly with setDataAndType().
Category
A string containing additional information about the kind of component that should
handle the intent. Any number of category descriptions can be placed in an intent, but
most intents do not require a category. Here are some common categories:
CATEGORY_BROWSABLE
The target activity allows itself to be started by a web browser to display data
referenced by a link, such as an image or an e-mail message.
CATEGORY_LAUNCHER
The activity is the initial activity of a task and is listed in the system's application
launcher.
See the Intent class description for the full list of categories.
These properties listed above (component name, action, data, and category) represent the
defining characteristics of an intent. By reading these properties, the Android system is able
to resolve which app component it should start. However, an intent can carry additional
information that does not affect how it is resolved to an app component. An intent can also
supply the following information:
Extras
Key-value pairs that carry additional information required to accomplish the requested
action. Just as some actions use particular kinds of data URIs, some actions also use
particular extras.
You can add extra data with various putExtra() methods, each accepting two
parameters: the key name and the value. You can also create a Bundle object with all
the extra data, then insert the Bundle in the Intent with putExtras().
For example, when creating an intent to send an email with ACTION_SEND, you can
specify the to recipient with the EXTRA_EMAIL key, and specify the subject with
the EXTRA_SUBJECT key.
The Intent class specifies many EXTRA_* constants for standardized data types. If
you need to declare your own extra keys (for intents that your app receives), be sure
to include your app's package name as a prefix, as shown in the following example:
Caution: Do not use Parcelable or Serializable data when sending an intent that you
expect another app to receive. If an app attempts to access data in a Bundle object but does not
have access to the parceled or serialized class, the system raises a RuntimeException.
Flags
Flags are defined in the Intent class that function as metadata for the intent. The
flags may instruct the Android system how to launch an activity (for example,
which task the activity should belong to) and how to treat it after it's launched (for
example, whether it belongs in the list of recent activities).
For example, if you built a service in your app, named DownloadService, designed to
download a file from the web, you can start it with the following code:
The Intent(Context, Class) constructor supplies the app Context and the component
a Class object. As such, this intent explicitly starts the DownloadService class in the app.
For more information about building and starting a service, see the Services guide.
For example, if you have content that you want the user to share with other people, create an
intent with the ACTION_SEND action and add extras that specify the content to share. When
you call startActivity() with that intent, the user can pick an app through which to share
the content.
Caution: It's possible that a user won't have any apps that handle the implicit intent you send
to startActivity(). Or, an app may be inaccessible because of profile restrictions or settings put into
place by an administrator. If that happens, the call fails and your app crashes. To verify that an activity will
receive the intent, call resolveActivity()on your Intent object. If the result is non-null, there is at
least one app that can handle the intent and it's safe to callstartActivity(). If the result is null, do not
use the intent and, if possible, you should disable the feature that issues the intent. The following example
shows how to verify that the intent resolves to an activity. This example doesn't use a URI, but the intent's
data type is declared to specify the content carried by the extras.
When startActivity() is called, the system examines all of the installed apps to
determine which ones can handle this kind of intent (an intent with the ACTION_SEND action
and that carries "text/plain" data). If there's only one app that can handle it, that app opens
immediately and is given the intent. If multiple activities accept the intent, the system
displays a dialog such as the one shown in Figure 2, so the user can pick which app to use.
More information about launching other apps is also provided in Sending the User to Another
App.
However, if multiple apps can respond to the intent and the user might want to use a different
app each time, you should explicitly show a chooser dialog. The chooser dialog asks the user
to select which app to use for the action (the user cannot select a default app for the action).
For example, when your app performs "share" with the ACTION_SEND action, users may
want to share using a different app depending on their current situation, so you should always
use the chooser dialog, as shown in Figure 2.
To advertise which implicit intents your app can receive, declare one or more intent filters for
each of your app components with an <intent-filter> element in your manifest file.
Each intent filter specifies the type of intents it accepts based on the intent's action, data, and
category. The system delivers an implicit intent to your app component only if the intent can
pass through one of your intent filters.
Note: An explicit intent is always delivered to its target, regardless of any intent filters the component
declares.
An app component should declare separate filters for each unique job it can do. For example,
one activity in an image gallery app may have two filters: one filter to view an image, and
another filter to edit an image. When the activity starts, it inspects the Intent and decides
how to behave based on the information in the Intent (such as to show the editor controls or
not).
Each intent filter is defined by an <intent-filter> element in the app's manifest file,
nested in the corresponding app component (such as an <activity> element). Inside
the <intent-filter>, you can specify the type of intents to accept using one or more of
these three elements:
<action>
Declares the intent action accepted, in the name attribute. The value must be the
literal string value of an action, not the class constant.
<data>
Declares the type of data accepted, using one or more attributes that specify various
aspects of the data URI (scheme, host, port, path) and MIME type.
<category>
Declares the intent category accepted, in the name attribute. The value must be the
literal string value of an action, not the class constant.
Note: To receive implicit intents, you must include the CATEGORY_DEFAULT category in the
intent filter. The methods startActivity() and startActivityForResult() treat all
intents as if they declared the CATEGORY_DEFAULT category. If you do not declare this category
in your intent filter, no implicit intents will resolve to your activity.
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
You can create a filter that includes more than one instance of <action>, <data>,
or <category>. If you do, you need to be certain that the component can handle any and all
combinations of those filter elements.
When you want to handle multiple kinds of intents, but only in specific combinations of
action, data, and category type, then you need to create multiple intent filters.
Restricting access to components
Using an intent filter is not a secure way to prevent other apps from starting your
components. Although intent filters restrict a component to respond to only certain kinds of
implicit intents, another app can potentially start your app component by using an explicit
intent if the developer determines your component names. If it's important that only your own
app is able to start one of your components, do not declare intent filters in your manifest.
Instead, set the exported attribute to "false" for that component.
An implicit intent is tested against a filter by comparing the intent to each of the three
elements. To be delivered to the component, the intent must pass all three tests. If it fails to
match even one of them, the Android system won't deliver the intent to the component.
However, because a component may have multiple intent filters, an intent that does not pass
through one of a component's filters might make it through on another filter. More
information about how the system resolves intents is provided in the section below
about Intent Resolution.
Caution: To avoid inadvertently running a different app's Service, always use an explicit intent to start
your own service and do not declare intent filters for your service.
Note: For all activities, you must declare your intent filters in the manifest file. However, filters for
broadcast receivers can be registered dynamically by calling registerReceiver(). You can then
unregister the receiver with unregisterReceiver(). Doing so allows your app to listen for specific
broadcasts during only a specified period of time while your app is running.
Example filters
To demonstrate some of the intent filter behaviors, here is an example from the manifest file
of a social-sharing app:
<activity android:name="MainActivity">
<!-- This activity is the main entry, should appear in app launcher
-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ShareActivity">
<!-- This activity handles "SEND" actions with text data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<!-- This activity also handles "SEND" and "SEND_MULTIPLE" with
media data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:mimeType="application/vnd.google.panorama360+jpg"/>
<data android:mimeType="image/*"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
The first activity, MainActivity, is the app's main entry point—the activity that opens
when the user initially launches the app with the launcher icon:
The ACTION_MAIN action indicates this is the main entry point and does not expect any
intent data.
The CATEGORY_LAUNCHER category indicates that this activity's icon should be placed in the
system's app launcher. If the <activity> element does not specify an icon with icon, then
the system uses the icon from the <application> element.
These two must be paired together in order for the activity to appear in the app launcher.
The second activity, ShareActivity, is intended to facilitate sharing text and media
content. Although users might enter this activity by navigating to it from MainActivity,
they can also enter ShareActivity directly from another app that issues an implicit intent
matching one of the two intent filters.
Unless your app is receiving pending intents from other apps, the above methods to create
a PendingIntent are probably the only PendingIntent methods you'll ever need.
Each method takes the current app Context, the Intent you want to wrap, and one or more
flags that specify how the intent should be used (such as whether the intent can be used more
than once).
For more information about using pending intents, see the documentation for each of the
respective use cases, such as in the Notifications and App Widgets API guides.
Intent resolution
When the system receives an implicit intent to start an activity, it searches for the best
activity for the intent by comparing it to intent filters based on three aspects:
Action.
Data (both URI and data type).
Category.
The following sections describe how intents are matched to the appropriate components
according to the intent filter declaration in an app's manifest file.
Action test
To specify accepted intent actions, an intent filter can declare zero or
more <action> elements, as shown in the following example:
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
...
</intent-filter>
To pass this filter, the action specified in the Intent must match one of the actions listed in
the filter.
If the filter does not list any actions, there is nothing for an intent to match, so all intents fail
the test. However, if an Intent does not specify an action, it passes the test as long as the
filter contains at least one action.
Category test
To specify accepted intent categories, an intent filter can declare zero or
more <category> elements, as shown in the following example:
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
For an intent to pass the category test, every category in the Intent must match a category
in the filter. The reverse is not necessary—the intent filter may declare more categories than
are specified in the Intent and theIntent still passes. Therefore, an intent with no
categories always passes this test, regardless of what categories are declared in the filter.
Note: Android automatically applies the CATEGORY_DEFAULT category to all implicit intents passed
to startActivity() and startActivityForResult(). If you want your activity to receive implicit
intents, it must include a category for "android.intent.category.DEFAULT" in its intent filters, as
shown in the previous <intent-filter> example.
Data test
To specify accepted intent data, an intent filter can declare zero or more <data> elements, as
shown in the following example:
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
...
</intent-filter>
Each <data> element can specify a URI structure and a data type (MIME media type). Each
part of the URI is a separate attribute: scheme, host, port, and path:
<scheme>://<host>:<port>/<path>
content://com.example.project:200/folder/subfolder/etc
In this URI, the scheme is content, the host is com.example.project, the port is 200,
and the path is folder/subfolder/etc.
Each of these attributes is optional in a <data> element, but there are linear dependencies:
When the URI in an intent is compared to a URI specification in a filter, it's compared only to
the parts of the URI included in the filter. For example:
If a filter specifies only a scheme, all URIs with that scheme match the filter.
If a filter specifies a scheme and an authority but no path, all URIs with the same scheme and
authority pass the filter, regardless of their paths.
If a filter specifies a scheme, an authority, and a path, only URIs with the same scheme,
authority, and path pass the filter.
Note: A path specification can contain a wildcard asterisk (*) to require only a partial match of the path
name.
The data test compares both the URI and the MIME type in the intent to a URI and MIME
type specified in the filter. The rules are as follows:
1. An intent that contains neither a URI nor a MIME type passes the test only if the filter does
not specify any URIs or MIME types.
2. An intent that contains a URI but no MIME type (neither explicit nor inferable from the URI)
passes the test only if its URI matches the filter's URI format and the filter likewise does not
specify a MIME type.
3. An intent that contains a MIME type but not a URI passes the test only if the filter lists the
same MIME type and does not specify a URI format.
4. An intent that contains both a URI and a MIME type (either explicit or inferable from the
URI) passes the MIME type part of the test only if that type matches a type listed in the filter.
It passes the URI part of the test either if its URI matches a URI in the filter or if it has
a content: or file: URI and the filter does not specify a URI. In other words, a
component is presumed to support content: and file: data if its filter lists only a MIME
type.
This last rule, rule (d), reflects the expectation that components are able to get local data from
a file or content provider. Therefore, their filters can list just a data type and don't need to
explicitly name the content: and file: schemes. The following example shows a typical
case in which a <data> element tells Android that the component can get image data from a
content provider and display it:
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>
Filters that specify a data type but not a URI are perhaps the most common because most
available data is dispensed by content providers.
Another common configuration is a filter with a scheme and a data type. For example,
a <data> element like the following tells Android that the component can retrieve video data
from the network in order to perform the action:
<intent-filter>
<data android:scheme="http" android:type="video/*" />
...
</intent-filter>
Intent matching
Intents are matched against intent filters not only to discover a target component to activate,
but also to discover something about the set of components on the device. For example, the
Home app populates the app launcher by finding all the activities with intent filters that
specify the ACTION_MAIN action and CATEGORY_LAUNCHERcategory. A match is only
successful if the actions and categories in the Intent match against the filter, as described in
the documentation for the IntentFilter class.
Your application can use intent matching in a manner similar to what the Home app does.
The PackageManagerhas a set of query...() methods that return all components that can
accept a particular intent and a similar series of resolve...() methods that determine the
best component to respond to an intent. For example,queryIntentActivities() returns
a list of all activities that can perform the intent passed as an argument,
and queryIntentServices() returns a similar list of services. Neither method activates
the components; they just list the ones that can respond. There's a similar
method, queryBroadcastReceivers(), for broadcast receivers.
Tujuan
Codelab ini menitik beratkan pada implementasi Intent untuk melakukan perpindahan
dari Activity ke Activity dengan atau tidak membawa data. Beberapa bagian dari code
lab ini akan menjawab beberapa pertanyaan umum dalam pengembangan aplikasi
Android sebagai berikut:
Logika Dasar
Berpindah dari satu Activity ke Activity lain dengan membawa data. Activity asal
akan mengirimkan data melalui Intent dan Activity tujuan akan menerima data yang
dikirimkan.
Jangan lupa untuk menambahkan file dimens.xml secara manual di dalam res
→ values. Dan isikan file dimens.xml seperti berikut
19. <resources>
20. <!-- Default screen margins, per the Android Design guidelines. -
->
21. <dimen name="activity_horizontal_margin">16dp</dimen>
22. <dimen name="activity_vertical_margin">16dp</dimen>
23. </resources>
4. Lalu untuk MainActivity.java tambahkan beberapa baris seperti ini.
Selesai! Langkah pertama untuk memindahkan satu Activity ke Activity lain sudah
selesai, sekarang silakan jalankan aplikasi anda dengan mengklik tombol pada
menu bar. Seharusnya sekarang anda sudah bisa memindahkan Activity dengan
mengklik tombol ‘Pindah Activity’.
Bedah Kode
Kita telah belajar bagaimana membuat sebuah Activity baru, di materi sebelumnya
syarat sebuah Activity harus terdaftar pada file AndroidManifest.xml dan semenjak
menggunakan Android Studio proses pendaftaran Activity ke
file AndroidManifest.xml dilakukan secara otomatis tidak manual seperti di era
eclipse.
1. <intent-filter>
2. <action android:name="android.intent.action.MAIN" />
3. <category android:name="android.intent.category.LAUNCHER" />
4. </intent-filter>
Baris diatas bermakna bahwa MainActivity memiliki Intent Action utama dari
keseluruhan Activity yang ada di sebuah Aplikasi. Sedangkan
Kita membuat sebuah obyek Intent dengan cara seperti diatas dengan memberikan
Kelas Activity Asal (MainActivity.this) dan Kelas Activity
tujuan (MoveActivity.class) pada kontruktor kelas Intent (constructor).
Kelas asal selalu ditekankan dengan .this yang menandakan obyek kelas saat ini dan
kelas tujuan selalu ditekankan .class.
Jika kita membiarkan code assistant dari Android Studio, maka akan tampil
rekomendasi (code hint) sebagai berikut:
Pada konteks diatas kita memilih Context packageContext, Class<?> cls sebagai
inputan untuk nilai kontruktor Intent.
Setelah kita telah berhasil memindahkan satu Activity ke Activity lain dengan
tidak membawa data. Nah, pada bagian selanjutnya kita akan membuat sebuah
Intent yang didalamnya akan membawa data ke Activity tujuan.
elanjutnya adalah kita akan membuat sebuah Intent yang didalamnya akan membawa
data ke Activity tujuan. Siap?
1. Ayo buka activity_main.xml lagi dan tambahkan satu tombol lagi dibawah
tombol sebelumnya sehingga kode activity_main.xml kita menjadi seperti ini.
25. <resources>
26. <!-- Default screen margins, per the Android Design guidelines. -
->
27. <dimen name="activity_horizontal_margin">16dp</dimen>
28. <dimen name="activity_vertical_margin">16dp</dimen>
29. </resources>
2. Setelah selesai dengan penambahan pada file activity_main.xml, maka
dilanjutkan dengan menambahkan beberapa baris berikut
di MainActivity.java (yang ditebalkan).
Perbedaan mendasar antara memindahkan Activity dengan membawa data dan tidak
adalah dengan menempatkan data yang akan dikirim ke Activity tujuan pada baris ini.
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcade
my Boy");
2. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
Hampir semua tipe data untuk input value disupport oleh method putExtra().
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME,"DicodingAcadem
y Boy");
Catatan : Key yang dikirimkan via putExtra() harus sama dengan Key sewaktu
mengambil nilai dari data yang dikirimkan melalui getStringExtra()
Dalam konteks diatas key yang dikirimkan dan key sewaktu mengambil nilai data
adalah sama yaitu EXTRA_NAME (yang bernilai “extra_name”) dan nilai dari data
yang dikirimkan via Intent disimpan kedalam variable name bertipe data String.
Begitu juga dengan,
Sekali lagi selamat! Anda telah mempelajari dua Intent explicit dengan atau tidak
membawa data. Sebelumnya, mengirimkan data bernilai tunggal dari satu Activity ke
Activity lain adalah hal yang mudah. Bernilai tunggal karena data yang dikirimkan
berasal dari satu tipe data. Misal diatas, pengiriman nilai data name dan age dilakukan
secara sendiri-sendiri, yang satu bertipe data String dan yang lainnya bertipe data
integer. Sekarang pertanyaanya bagaimana anda bisa mengirimkan data dalam
bentuk Plain Old Java Object (POJO) dari satu Activity ke Activity lain melalui Intent?
Caranya adalah dengan mengkonversi Object POJO yang anda miliki ke dalam
bentuk parcelable object.
Pada kelas ini tidak akan dijelaskan tentang parcelable object. Untuk materi
yang lebih lengkap dan komprehensif mengenai parcelable object bisa
langsung daftar kelas Menjadi Android Developer Expert.
aik, anda sudah belajar bagaimana menggunakan Intent dengan tipe eksplisit,
sekarang saat-nya anda melanjutkan ke Intent dengan tipe implicit.
2. <Button
3. android:id="@+id/btn_dial_number"
4. android:layout_width="match_parent"
5. android:layout_height="wrap_content"
6. android:text="Dial a Number"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
Setelah selesai, silakan jalankan lagi aplikasi anda dan yeay, anda sudah bisa
men-dial sebuah nomor telepon melalui aplikasi telepon bawaan dari
Android/Device anda. Selamat!
Bedah Kode
Intent
Buat yang belum tau apa itu Uri, berikut penjelasan singkatnya :
Uri adalah sebuah untaian karakter yang digunakan untuk mengidentifikasi nama,
sumber, atau layanan di Internet sesuai dengan RFC 2396.
Pada Uri.parse("tel:"+phoneNumber) kita melakukan parsing Uri dari bentuk teks
String menjadi sebuah obyek Uri dengan menggunakan method
static parse(String). Secara struktur dibagi menjadi :
Dimana “tel” adalah sebuah skema yang disepakati untuk sumber daya telepon dan
phoneNumber adalah variabel String yang bernilai “081210841382”. Skema lain dari
Uri seperti “geo” untuk peta, “http” untuk browser sisanya bisa dilihat di halaman ini :
Common Intents
Pada prosesnya, pemanggilan Intent secara implicit akan berjalan sesuai dengan
diagram dibawah ini.
Masih ada satu lagi yang belum dibahas yaitu Intent ResultActivity, akan tetapi
materi tersebut tidak akan di bahas di dalam kelas ini. Untuk materi yang lebih
lengkap dan komprehensif mengenai Intent ResultActivity bisa langsung daftar
kelas Menjadi Android Developer Expert.
Pada modul sebelumnya anda telah belajar bagaimana mengenal dan memahami
komponen fundamental aplikasi di Android berikut dengan penggunaan beberapa
komponen pembentuk tampilan aplikasi seperti Button dan TextViewagar pengguna
dapat memberikan input dan berinteraksi dengan aplikasi.
Pada bagian ini anda akan mempelajari lebih dalam tentang konsep dasar
pembentukan tampilan antar muka pengguna seperti pemanfaatan komponen-
komponen berbasis View dan ViewGroup yang berkolaborasi sehingga membentuk
sebuah tampilan antar muka pengguna. Contohnya seperti ini,
Salah satu contoh dari tampilan dalam file layout xml untuk merepresentasikan
kolaborasi View dan ViewGroupseperti ini :
LinearLayout
Akan menempatkan komponen-komponen di dalamnya secara horizontal atau
vertikal. LinearLayout memilikiatribut weight untuk masing-masing child view yang
berguna untuk mengontrol porsi ukuran view secara Relatif dalam sebuah ruang
(space) yangtersedia.
android:orientation=”vertical” android:orientation=”horizontal”
Cek link ini tentang linearlayout :
Linear Layout
RelativeLayout
Layout yang paling fleksible dikarenakan posisi dari masing-masing komponen di
dalamnya dapat mengacu secara relatif pada komponen yang lainnya dan juga dapat
mengacu secara relatif ke batas layar.
Cek link ini tentang relativelayout
Relative Layout
FrameLayout
Layout ini adalah layout yang paling sederhana. Layout ini akan membuat komponen
yang ada di dalamnya menjadi menumpuk atau saling menutupi satu dengan yang
lainnya. Komponen yang paling pertama pada layout ini akan menjadi bagian bawah
dari komponen-komponen di atasnya. Pada materi penggunaan fragment di materi
sebelumnya, FrameLayout memiliki kemampuan untuk menjadi kontainer
buat fragment-fragment di dalam sebuah Activity. Berikut ilustrasi dari
penggunaan FrameLayout terhadap child view yang dimiliki di dalamnya.
TableLayout
Susunan komponen di dalam TableLayout akan berada dalam baris dan kolom.
Namun jangan berharap layout jenis ini akan menampilkan garis pembatas untuk
baris, kolom atau cell-nya menggunakan konsep yang sama pada pengembangan
aplikasi berbasis web.
Cek link ini tentang TableLayout :
Grid Layout
Jika anda sadari sebetulnya perbedaan dari masing-masing layout yang dijelaskan di
atas terletak pada susunan komponen view di dalamnya. Itu saja.
Lalu pertanyaannya kapan kita
menggunakan LinearLayout, RelativeLayout, FrameLayout dan TableLayout ?
Jawabannya adalah relatif tergantung pada kebutuhan dan performa.
Salah satu tips performa dari aplikasi android adalah dengan membuat susunan
hierarki layout dalam sebuah file layout xml secara sederhana dan flat dalam artian
kedalaman penggunaan nested layout atau layout bersarang tidak terlalu dalam.
Selain itu, pemahaman yang baik terhadap dasar-dasar pembangunan UI di android,
pengalaman, feeling, dan selalu mencari tahu best-practice seperti apa.
Semua tergantung latihan dan seberapa sering kita berhadapan dengan kasus-kasus
melakukan transformasi UI dari bentuk mockup ke dalam bentuk kode xml di Android.
Dengan membiasakan melakukan penulisan kode sisi UI di xml tanpa penggunaan
drag and drop akan membentuk pola pikir dan feeling kita dalam membangun dan
mentransformasi UI ke dalam bentuk yang dibutuhkan. Ini bersifat Relatif, mungkin
cara membentuk UI dari satu developer android dengan developer android lainnya
akan berbeda.
Untuk lebih detail pemahaman tentang layout dapat dicek pada halaman ini :
Declaring Layout
Kelemahan dari layout-layout tersebut adalah ketidakmampuan untuk melakukan
scroll konten secara vertikal atau horizontal. Jelas, adakalanya tampilan aplikasi anda
memuat informasi yang panjangnya melebihi layar yang ada, jika hanya bergantung
pada layout-layout yang dijelaskan sebelumnya maka tampilan aplikasi anda akan
terpotong. Di situlah peran ScrollView membantu untuk memberikan solusi.
ScrollView
Adalah layout yang akan membuat komponen di dalamnya dapat digeser (scroll)
secara vertical dan horizontal. Komponen di dalam Scrollview hanya diperbolehkan
memiliki 1 parent utama dari LayoutLinear, RelativeLayout, FrameLayout,
atau TableLayout.
ScrollView
Contoh 1 :
Misalkan ada dua tablet 7-inch (ukuran diagonal layar), tablet pertama (A) memiliki
resolusi layar 1200x1920px 320dpi dan yang lainnya (B) beresolusi 2048x1536px
326dpi. Membuat button dengan ukuran 300x300px mungkin akan tampak normal
pada tablet A tapi akan tampak kecil di tablet B.
Tapi akan berbeda jika kita spesifikasikan ukuran button-nya dengan ukuran yang
bergantung pada density layar alias menggunakan dip misal 300x300dp. Secara fisik
ukuran button tersebut akan selalu sama pada ukuran layar yang berbeda.
Contoh 2 :
Pada gambar di atas ukuran 200dp akan dikonversi pada device mdpi (device dengan
density 160dpi/dots per inch) menjadi 200px dan menjadi 400px pada device xhdpi
(density 420dpi) misal pada nexus 4. Sehingga ukuran tersebut tampak sama dan
konsisten secara fisik untuk beragam device dengan ukuran layar yang berbeda.
Link-link berikut akan membantu anda untuk jauh lebih memahami bagaimana aplikasi
anda bisa mendukung banyak layar device.
Terasa kurang jika pemahaman esensi materi di atas tidak dilengkapi dengan praktik
langsung. Jadi, siap untuk ngoding lagi ?
Tujuan
Pada latihan kali ini anda akan mengembangkan sebuah halaman detail yang di
dalamnya terdiri beberapa implementasi View dan ViewGroup Layout. Tampilan
akhir aplikasi kita akan seperti ini :
Codelab Views and ViewGroup
1. Buat project baru di android studio dengan nama MyViewAndViews untuk API
level 15 dan emptyactivity.
2. Lalu buka file build.gradle (Module: app) dan tambahkan satu baris ini di
bagian dependecies :
1. compile 'de.hdodenhof:circleimageview:2.1.0'
7. Lakukan juga untuk warning dari android:text lainnya dari semua view yang ada
pada activity_main.xml. Kemudian buka res → strings.xml, maka isi dari xmlnya
akan menjadi seperti berikut.
1. <resources>
2. <string name="app_name">MyViewAndViews</string>
3. <string name="content_text">Google officially announced its much-
anticipated Pixel phones; the Pixel and Pixel XL, on October 4. We at
tended Google’s London UK event, mirroring the main one taking place
in San Francisco, US, where the firm unwrapped the new Android 7.1 No
ugat devices which will apparently usurp Google’s long-standing Nexus
series.</string>
4. <string name="content_specs_display">5.0 inches\n
5. FHD AMOLED at 441ppi\n
6. 2.5D Corning® Gorilla® Glass 4</string>
7. <string name="content_specs_size">5.6 x 2.7 x 0.2 ~ 0.3 inches 14
3.8 x 69.5 x 7.3 ~ 8.5 mm</string>
8. <string name="content_specs_battery">2,770 mAh battery\n
9. Standby time (LTE): up to 19 days\n
10. Talk time (3g/WCDMA): up to 26 hours\n
11. Internet use time (Wi-Fi): up to 13 hours\n
12. Internet use time (LTE): up to 13 hours\n
13. Video playback: up to 13 hours\n
14. Audio playback (via headset): up to 110 hours\n
15. Fast charging: up to 7 hours of use from only 15 minutes of c
harging</string>
16. <string name="stock_hanya_5_buah">Stock hanya 5 buah</string>
17. <string name="spesifikasi">Spesifikasi</string>
18. <string name="display">Display</string>
19. <string name="size">Size</string>
20. <string name="battery">Battery</string>
21. <string name="dijual_oleh">Dijual oleh</string>
22. <string name="narenda_wicaksono">Narenda Wicaksono</string>
23. <string name="beli">Beli</string>
24. <string name="_735">$735</string>
25. <string name="_6_photos">6 photos</string>
26. </resources>
8. Diketik ya, lumayan panjang bukan?. Oke terakhir
pada MainActivity tambahkan satu baris berikut :
1. getSupportActionBar().setTitle("Google Pixel");
Bedah Kode
Tidak ada yang rumit dibagian ini karena anda hanya berhadapan dengan bagaimana
membentuk sebuah tampilan aplikasi android yang bagus di file layout xml.
Di awal kita melakukan penambahan dependency untuk menampilkan sebuah custom
ImageView dalam bentuk lingkaran dengan menggunakan
library CircleImageView yang dibuat oleh Henning Dodenhoff. Library ini cukup
populer dan selalu di-maintain dengan baik.
1. compile 'de.hdodenhof:circleimageview:2.1.0'
Dan jika anda perhatikan, jika kita ingin menampilkan teks‘content_specs_size’ hanya
perlu menuliskan sebagai nilai atribut di dalam obyekTextView yang diinginkan.
1. <TextView
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:textSize="14sp"
5. android:layout_weight="1"
6. android:text="@string/content_specs_size"
7. android:textColor="@android:color/black"/>
Dan ya, dengan memanfaatkan strings.xml akan membuat anda lebih mudah
nantinya dalam membuat aplikasi ke dalam banyak bahasa.
Jika anda telah membaca dan memahami materi tentang Activity sebelumnya maka
seharusnya anda tidak akan bingung dengan atribut dan namespace yang digunakan
ketika kita membuat sebuah tampilan aplikasi pada file layout xml. Jadi silakan dibaca
kembali jika anda merasa lupa atau kurang paham.
1. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:id="@+id/activity_main"
4. android:layout_width="match_parent"
5. android:layout_height="match_parent"
6. android:background="@android:color/white"
7. tools:context="com.dicoding.myviewandviews.MainActivity">
8.
9. ...
10.
11. </ScrollView>
Ingat, semua komponen View dan ViewGroup memiliki dua buah atribut terpenting
yang harus selalu diberikan nilai untuk mengatur posisi dirinya di dalam sebuat layout,
yaitu :
layout_width
layout_height
Kita akan menggunakan sebuah obyek ScrollView yang akan menjadi Root untuk
tampilan halaman aplikasi. Kenapa menggunakan ScrollView sebagai root / parent
karena kita ingin tampilan halaman dari aplikasi kita bisa di scroll ke bawah dan ke
atas sehingga pengguna dapat melihat tampilan secara menyeluruh.
1. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:id="@+id/activity_main"
4. android:layout_width="match_parent"
5. android:layout_height="match_parent"
6. android:background="@android:color/white"
7. tools:context="com.dicoding.myviewandviews.MainActivity">
8. <LinearLayout
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:orientation="vertical">
12. ...
13. </LinearLayout>
14. </ScrollView>
1. <FrameLayout
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content">
4. <ImageView
5. android:layout_width="match_parent"
6. android:layout_height="wrap_content"
7. android:adjustViewBounds="true"
8. android:src="@drawable/pixel_google"
9. android:scaleType="fitXY"/>
10. <TextView
11. android:layout_width="wrap_content"
12. android:layout_height="wrap_content"
13. android:padding="8dp"
14. android:text="6 Photos"
15. android:gravity="center_vertical"
16. android:drawableLeft="@drawable/ic_collections_white_18dp"
17. android:drawablePadding="4dp"
18. android:textAppearance="@style/TextAppearance.AppCompat.Small"
19. android:background="#4D000000"
20. android:textColor="@android:color/white"
21. android:layout_marginLeft="@dimen/activity_horizontal_margin"
22. android:layout_marginBottom="@dimen/activity_vertical_margin"
23. android:layout_gravity="bottom" />
24. </FrameLayout>
Gambar pixel_google yang tampil akan menjadi alas bagi obyek TextView yang
berada di atasnya. Ini seperti sifat dari komponen FrameLayout itu sendiri terhadap
urutan posisi atau struktur di dalamnya.
1. <TableLayout
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:layout_marginLeft="@dimen/activity_horizontal_margin"
5. android:layout_marginRight="@dimen/activity_horizontal_margin"
6. android:layout_marginBottom="@dimen/activity_vertical_margin">
7. <TableRow
8. android:layout_width="match_parent"
9. android:layout_height="wrap_content"
10. android:layout_marginBottom="8dp">
11. <TextView
12. android:layout_width="wrap_content"
13. android:layout_height="wrap_content"
14. android:textSize="14sp"
15. android:layout_marginRight="@dimen/activity_vertical_margin"
16. android:text="Display"/>
17. <TextView
18. android:layout_width="match_parent"
19. android:layout_height="wrap_content"
20. android:textSize="14sp"
21. android:layout_weight="1"
22. android:text="@string/content_specs_display"
23. android:textColor="@android:color/black"/>
24. </TableRow>
25. <TableRow
26. android:layout_width="match_parent"
27. android:layout_height="wrap_content"
28. android:layout_marginBottom="8dp">
29. <TextView
30. android:layout_width="wrap_content"
31. android:layout_height="wrap_content"
32. android:textSize="14sp"
33. android:layout_marginRight="@dimen/activity_vertical_margin"
34. android:text="Size"/>
35. <TextView
36. android:layout_width="match_parent"
37. android:layout_height="wrap_content"
38. android:textSize="14sp"
39. android:layout_weight="1"
40. android:text="@string/content_specs_size"
41. android:textColor="@android:color/black"/>
42. </TableRow>
43. <TableRow
44. android:layout_width="match_parent"
45. android:layout_height="wrap_content"
46. android:layout_marginBottom="8dp">
47. <TextView
48. android:layout_width="wrap_content"
49. android:layout_height="wrap_content"
50. android:textSize="14sp"
51. android:layout_marginRight="@dimen/activity_vertical_margin"
52. android:text="Battery"/>
53. <TextView
54. android:layout_width="match_parent"
55. android:layout_height="wrap_content"
56. android:textSize="14sp"
57. android:layout_weight="1"
58. android:text="@string/content_specs_battery"
59. android:textColor="@android:color/black"/>
60. </TableRow>
61. </TableLayout>
1. <RelativeLayout
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:layout_marginLeft="@dimen/activity_horizontal_margin"
5. android:layout_marginRight="@dimen/activity_horizontal_margin"
6. android:layout_marginBottom="@dimen/activity_vertical_margin">
7. <de.hdodenhof.circleimageview.CircleImageView
8. android:layout_width="56dp"
9. android:layout_height="56dp"
10. android:src="@drawable/photo_2"
11. android:layout_centerVertical="true"
12. android:id="@+id/profile_image"
13. android:layout_marginRight="@dimen/activity_horizontal_margin"/>
14. <TextView
15. android:layout_width="match_parent"
16. android:layout_height="wrap_content"
17. android:layout_toRightOf="@id/profile_image"
18. android:text="Narenda Wicaksono"
19. android:textColor="@android:color/black"
20. android:layout_centerVertical="true"/>
21. </RelativeLayout>
1. getSupportActionBar().setTitle("Google Pixel");
Baris di atas akan mengganti nilai dari judul halaman pada ActionBar di
dalam MainActivity. Kenapa menggunakan getSupportActionBar() ? Karena
kelas MainActivity inherit kepada AppCompatActivity yang merupakan kelas
turunan Activity. Kelas tersebut sudah menyediakan fasilitas
komponen ActionBar dan mampu mendukung untuk kompabilitas ke semua versi OS
android.
Selamat ! Anda sudah belajar tentang layout, view, dan ViewGroup sejauh ini dan
semakin sering anda berlatih untuk mentransformasikan sebuah desain menjadi
sebuah file layout xml tampilan aplikasi android maka akan semakin mahir anda.
Setelah ini silakan anda main-main lebih dalam lagi dan mencari tahu tentang
implementasi material design di aplikasi android.
Anda bisa mengunjungi tiga website ini untuk mencari inspirasi ketika membangun
sebuah User Interface untuk aplikasi anda.
Pada bagian ini anda akan belajar dengan prinsip desain yang ada di android dan
bagaimana mengimplementasikan sebuah struktur yang mendefinisikan tampilan
sebuah view dan tampilan komponen aplikasi secara menyeluruh dalam sebuah file
style. Prinsip dasar dalam merancang antarmuka aplikasi android harus mematuhi
kaidah yang ditetapkan oleh Design Guideline yang dibuat oleh tim Android di
Google. Diantaranya adalah sebagai berikut :
Best Practice
Terdapat beberapa langkah-langkah terbaik (best practice) yang harus diperhatikan
ketika mengembangkan sebuah aplikasi android, ini korelasi antara User Interface dan
menuliskan kode dari sisi logika aplikasi.
1. Desain yang baik untuk performa aplikasi
Aplikasi yang dirancang dengan baik harus dapat dijalankan dengan cepat dan
jika terdapat proses yang memakan waktu, maka lakukan secara background
dan asynchronous
2. Desain yang baik agar aplikasi dapat bersifat responsif
Berikan feedback ke pengguna terhadap sebuah aksi yang dilakukan
contohnya jika pengguna menekan sebuah tombol di aplikasi maka harus
menampilkan efek tekan.
3. Desain yang mengakomodasi kebutuhan informasi yang dibutuhkan
pengguna
Aplikasi anda harus menampilkan informasi yang dibutuhkan oleh pengguna
dan jika diperlukan aplikasi bisa menampilkan informasi terakhir yang diperoleh
atau dijalankan sebelumnya sehingga pengguna tidak perlu lagi menunggu
aplikasi melakukan load data dari server.
4. Desain untuk optimasi menggunakan baterai
Usahakan aplikasi anda menggunakan daya baterai yang kecil. Minimalisir
penggunaan dari background service yang tidak perlu dan stop semua listener
jika aplikasi tidak sedang dijalankan.
Manfaatkan GcmNetworkManager dan JobScheduler jika memang terdapat
task yang harus dilakukan secara periodik.
5. Desain untuk menggunakan koneksi jaringan yang efisien.
Aplikasi yang baik adalah salah satunya pintar dalam melakukan efisiensi
koneksi ke jaringan internet dan memilah-milah mana task yang harus
dijalankan pada saat posisi device pengguna terhubung ke wifi (unmetered
network) atau pun network lain. Penggunaan koneksi jaringan yang baik akan
menjadi hal wajib jika aplikasi andaingin tetap digunakan oleh pengguna.
Ternyata tidak sedikit bukan aturan dalam mengembangkan aplikasi android yang
baik. Nilai yang bagus pada poin tampilan akan menopang kualitas fungsi di aplikasi
yang anda buat. Jangan sampai fungsi dari aplikasi anda bagus namun secara
tampilan jelek dan begitu pula sebaliknya. Pengguna akan mempertahankan aplikasi
andadan tetap menggunakannya selama aplikasi anda memang dibutuhkan dan
memenuhi poin-poin di atas.
Kembali lagi pada topik style dan theme. Jika anda pernah mengembangkan sebuah
aplikasi berbasis web seharusnya anda sudah tidak asing lagi dengan
file CSS (Cascading Style Sheet) yang merupakan sebuah file yang mendefinisikan
bagaimana komponen dan tampilan sebuah halaman website. Pendekatan yang
serupa juga berlaku di android, ini yang dinamakan style.
Style merupakan sebuah kumpulan property yang dibutuhkan untuk mendefinisikan
bagaimana sebuah komponen View dan layar jendela
(bisa Activity maupun fragment) ditampilkan seperti
property height, width, background_color dan lain sebagainya. Style terdefinisi
dalam file xml sendiri, anda bisa menemukannya di res → values → styles.xml.
Contoh umumnya anda memiliki sebuah TextView yang berisi berbagai attribute
seperti ini. Let’s say ini adalah obyek TextView untuk menampilkan konten dari detail
informasi yang terdapat di keseluruhan aplikasi dan diimplementasikan di banyak file
layout xml.
1. <TextView
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:textColor="#00FF00"
5. android:typeface="monospace"
6. android:text="@string/hello" />
Akan sangat tidak efektif jika kita hanya melakukan copy paste dari satu layout xml ke
layout xml lainnya yang sebetulnya bisa kita sederhanakan seperti ini :
1. <TextView
2. style="@style/CodeFont"
3. android:text="@string/hello" />
Beberapa aturan yang harus diperhatikan ketika kita menggunakan styles yaitu:
Parent : Nilai style yang akan mewarisi dari style (berikut dengan attribute
di dalamnya) yang telah ada, umumnya bawaan dari sdk ataupun platform.
Style yang akan kita warisi akan dapat anda ubah dan tambahkan nilai attribute
dalam style baru yang anda buat. Di android sendiri sudah menyediakan
beragam style yang bisa anda gunakan untuk beragam tampilan.
3. Semua attribut yang akan didefinisikan dalam sebuah style harus berada
dalam tag <item></item
1. <item name="android:layout_width">match_parent</item>
Andaikan dalam satu kasus anda ingin membuat varian dari style yang telah anda
buat. Misal untuk style CodeFrontanda ingin ada yang berwarna merah anda bisa
menambahkan style baru dengan hanya menambahkan prefix dari style sebelumnya
dan nama dari style yang baru dipisahkan oleh titik seperti ini :
1. <style name="CodeFont.Red">
2. <item name="android:textColor">#FF0000</item>
3. </style>
atau berwarna merah dan juga dengan ukuran yang besar menjadi seperti ini :
1. <style name="CodeFont.Red">
2. <item name="android:textColor">#FF0000</item>
3. <item name="android:textSize">30sp</item>
4. </style>
Mudah bukan? Anda baru saja belajar tentang bagaimana sebuah style dibuat dan
diimplementasikan, selanjutnya bagaimana dengan theme?
Theme atau tema itu sendiri merupakan sebuah style yang diimplementasikan
khusus untuk Activity dan Applicationpada file AndroidManifest.xml. Pada project
sebelumnya kita mendefinisikannya seperti ini :
1. android:theme="@style/AppTheme"
1. <resources>
2. <!-- Base application theme. -->
3. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
4. <!-- Customize your theme here. -->
5. <item name="colorPrimary">@color/colorPrimary</item>
6. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
7. <item name="colorAccent">@color/colorAccent</item>
8. </style>
9. </resources>
Sebuah styles yang inherit ke tema AppCompat untuk varian light dan
memiliki DarkActionBar. Semua nilai pada atribut terdapat pada file colors.xml yang
berisi
1. <resources>
2. <color name="colorPrimary">#3F51B5</color>
3. <color name="colorPrimaryDark">#303F9F</color>
4. <color name="colorAccent">#FF4081</color>
5. </resources>
Material Design
Semenjak konsep material design ditetapkan sebagai acuan utama untuk
pengembangan user interface dan userexperience terdapat penyederhanaan
dalam pendefinisian komponen inti dari atribut yang digunakan. Pada gambar di atas
bisa dilihat titik-titik mana saja yang hanya kita gunakan untuk menjadi fondasi dasar
tampilan style aplikasi yang kita buat.
Kalau anda penasaran dengan versi sebelum material design maka anda harus
melihat video ini :
Ok, saya tahu anda sudah tidak sabar ingin ngoding dan tenang tidak akan banyak
kode yang anda tulis kali ini.
Kita akan memodifikasi dari project sebelumnya dan mengimplementasikan teori di
atas.
Tujuan
Pada Codelab kali kita akan menerapkan Style dan Theme pada sample aplikasi
yang telah kita buat sebelumnya pada modul Views dan ViewsGroup. Beberapa poin
yang didapatkan pada materi ini adalah :
4. Jika selesai coba jalankan aplikasi anda dan seharusnya hasilnya menjadi
seperti ini.
Terlihat lebih bagus bukan ?
Dan perhatikan penulisan di setiap obyek TextView akan menjadi lebih
sederhana contohnya sebagai berikut :
1. <TextView
2. style="@style/TextContent.Subtitle"
3. android:text="@string/dijual_oleh"
4. android:layout_marginBottom="8dp"/>
5. Hmm ada yang kurang lengkap rasanya, tombol kita masih dalam posisi
default. Sekarang, kita coba ubah agar lebih menyatu dengan tema aplikasi
kita saat ini. Buka kembali styles.xml dan tambahkan baris-baris ini di atas
tag </resources>
1. <style name="ButtonGeneral" parent="@style/Widget.AppCompat.Button.C
olored">
2. <item name="android:layout_width">match_parent</item>
3. <item name="android:layout_height">wrap_content</item>
4. <item name="android:layout_marginRight">@dimen/activity_horizont
al_margin</item>
5. <item name="android:layout_marginLeft">@dimen/activity_horizonta
l_margin</item>
6. <item name="android:layout_marginBottom">@dimen/activity_vertica
l_margin</item>
7. </style>
Selesai! Saat ini anda sudah memahami bagaimana theme dan style diterapkan
dalam membangun sebuah aplikasi di Android. Pengelompokan attribute
untuk View yang sama akan lebih memudahkan anda dalam menentukan dan
penyeragaman format View yang akan ditampilkan ke dalam layar.
Seperti biasa, untuk lebih membuat anda paham tentang materi ini kami
rekomendasikan anda untuk membaca lebih lanjut di :
Ui Theme
Material Design
Selamat ! Satu langkah besar sudah anda lalui, sekarang ayo kita lanjut ke materi
yang lebih seru!
Pada materi tentang loader sebelumnya kita telah belajar bagaimana menampilkan
kumpulan data dalam bentuk sebuah list. Kita menggunakan obyek ListView untuk
menampilkan data-data yang berasal dari kontak di device pengguna ke layar. Sangat
sederhana tapi sangat berarti. Kenapa? Pada dasarnya interaksi umum antara
pengguna dengan aplikasi dalam menampilkan data dalam jumlah yang banyak
adalah dengan menggunakan list yang bisa di-scroll ke atas dan ke bawah hanya
dengan menggunakan jempol tangan kanan.
ListView menjadi komponen pertama yang mengakomodasi hal tersebut, namun
semenjak Google merilis pendekatan desain
bernama material design, RecyclerView menjadi pilihan pertama yang harus
developer gunakan. Anda masih bisa menggunakan kedua komponen tersebut secara
berdampingan dalam satu aplikasi.
Secara definisi RecyclerView adalah sebuah komponen tampilan (widget) yang
lebih canggih ketimbang pendahulunya ListView dan bersifat lebih fleksibel. Dan
yang paling penting adalah RecyclerView memiliki kemampuan untuk menampilkan
data secara efisien dalam jumlah yang besar. Terlebih jika anda memiliki koleksi data
yang tiap elemennya mampu berubah-ubah sewaktu dijalankan (runtime) karena
interaksi pengguna atau karena adanya pengaruh dari jaringan internet.
Gambar di atas akan menjelaskan beberapa komponen yang harus anda tahu
sebelum menggunakan RecyclerView.
Untuk membuat anda makin paham tentang RecyclerView kami sarankan anda
untuk lanjut membaca materi pada link berikut
List Cards
Recycler View
Tujuan
Baik, pada Codelab kali ini kalian akan belajar menampilkan data Presiden Republik
Indonesia ke dalam sebuah RecyclerView. Beberapa poin yang akan dikover dalam
materi ini adalah :
Contoh dari RecyclerView yang akan kita buat dalam tiga bentuk :
1. Dalam bentuk List
2. Dalam bentuk Grid
3. Dan menampilkan list dengan bentuk kartu menggunakan CardView
Semuanya berada dalam satu halaman saja dengan cukup menambahkan
menuseperti berikut:
Keren bukan? Baik, agar anda tidak penasaran lagi ayo kita langsung mulai koding.
1. Buat project baru dengan nama MyRecyclerView dengan minimal level SDK
di 15 dan dengan template MainActivity di pilihan EmptyActivity.
Yang anda harus perhatikan adalah Android Studio anda harus tetap up-to-
date, baik itu dari sisi editor maupun Android SDK tools, platform tools, build
tools, dan android support repository. Anda bisa mengeceknya di menu bar
tools → Android → SDK Manager → Launch stand alone SDK Manager seperti
berikut :
6. Setelah selesai dengan model data, saatnya kita membuat sebuah item
tampilan dalam bentuk file layout xml yang akan ditampilkan di RecyclerView.
Karena pertama kali akan ditampilkan dalam bentuk list maka kita buat dengan
nama item_row_president dengan cara klik kanan pada direktori layout →
new → layout resource file dan lengkapi kodenya menjadi seperti berikut :
1. <?xml version="1.0" encoding="utf-8"?>
2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and
roid"
3. android:orientation="horizontal" android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:padding="@dimen/activity_vertical_margin">
6. <de.hdodenhof.circleimageview.CircleImageView
7. android:id="@+id/img_item_photo"
8. android:layout_width="55dp"
9. android:layout_height="55dp"
10. android:layout_marginRight="@dimen/activity_horizontal_margin"/>
11. <LinearLayout
12. android:layout_width="match_parent"
13. android:layout_height="wrap_content"
14. android:layout_toRightOf="@id/img_item_photo"
15. android:layout_centerVertical="true"
16. android:orientation="vertical">
17. <TextView
18. android:id="@+id/tv_item_name"
19. android:layout_width="match_parent"
20. android:layout_height="wrap_content"
21. android:text="Name"
22. android:textStyle="bold"
23. android:textSize="16sp"
24. android:layout_marginBottom="8dp"/>
25. <TextView
26. android:id="@+id/tv_item_remarks"
27. android:layout_width="match_parent"
28. android:layout_height="wrap_content"
29. android:text="Remarks"/>
30. </LinearLayout>
31. </RelativeLayout>
7. Setelah selesai dengan model data dan file layout xml sekarang saatnya kita
membuat sebuah kelas adapter yang akan memformat bagaimana tiap elemen
dari koleksi data yang kita punya ditampilkan. Buat kelas adapter secara
manual dengan klik kanan pada package utama → new → Java Class dan beri
nama ListPresidentAdapter. Setelah tercipta lengkapi kodenya menjadi
seperti berikut :
1. public class ListPresidentAdapter extends RecyclerView.Adapter<ListPr
esidentAdapter.CategoryViewHolder>{
2. private Context context;
3.
4. public ArrayList<President> getListPresident() {
5. return listPresident;
6. }
7. public void setListPresident(ArrayList<President> listPresident)
{
8. this.listPresident = listPresident;
9. }
10.
11. private ArrayList<President>listPresident;
12.
13. public ListPresidentAdapter(Context context) {
14. this.context = context;
15. }
16.
17. @Override
18. public CategoryViewHolder onCreateViewHolder(ViewGroup parent, in
t viewType) {
19. View itemRow = LayoutInflater.from(parent.getContext()).infla
te(R.layout.item_row_president, parent, false);
20. return new CategoryViewHolder(itemRow);
21. }
22.
23. @Override
24. public void onBindViewHolder(CategoryViewHolder holder, int posit
ion) {
25.
26. holder.tvName.setText(getListPresident().get(position).getNam
e());
27. holder.tvRemarks.setText(getListPresident().get(position).get
Remarks());
28.
29. Glide.with(context)
30. .load(getListPresident().get(position).getPhoto())
31. .override(55, 55)
32. .crossFade()
33. .into(holder.imgPhoto);
34. }
35.
36. @Override
37. public int getItemCount() {
38. return getListPresident().size();
39. }
40.
41. class CategoryViewHolder extends RecyclerView.ViewHolder{
42. TextView tvName;
43. TextView tvRemarks;
44. ImageView imgPhoto;
45.
46. public CategoryViewHolder(View itemView) {
47. super(itemView);
48. tvName = (TextView)itemView.findViewById(R.id.tv_item_nam
e);
49. tvRemarks = (TextView)itemView.findViewById(R.id.tv_item_
remarks);
50. imgPhoto = (ImageView)itemView.findViewById(R.id.img_item
_photo);
51. }
52. }
53. }
9. Karena data gambar yang kita miliki berasal dari internet maka kita harus
menambahkan sebuah permission ke dalam file AndroidManifest.xml yang
kita miliki. Tambahkan satu baru berikut di atas tag <application>
1. <uses-permission android:name="android.permission.INTERNET" />
10. Sekarang coba jalankan terlebih dahulu aplikasi yang kita buat dan seharusnya
hasilnya akan seperti berikut :
Keren..
Satu bentuk RecyclerView untuk menampilkan data Presiden Republik
Indonesia sudah tercipta.
11. Ok perhatikan pada hasil yang dijelaskan di awal kita memiliki satu mekanisme
untuk menampilkan bentuk dari RecyclerView yaitu dengan memanfaatkan
fasilitas menu, sekarang mari kita buat.
12. Selanjutnya setelah terbuat direktori menu, klik kanan pada direktori tersebut
→ new → menu resource file, beri nama menu_main pada field file name dan
setelah terbentuk lengkapi kodenya menjadi seperti berikut :
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android"
3. xmlns:app="http://schemas.android.com/apk/res-auto">
4. <item
5. android:id="@+id/action_list"
6. android:title="List"
7. app:showAsAction="never"/>
8. <item
9. android:id="@+id/action_grid"
10. android:title="Grid"
11. app:showAsAction="never"/>
12. <item
13. android:id="@+id/action_cardview"
14. android:title="with CardView"
15. app:showAsAction="never"/>
16. </menu>
Untuk dua method di atas anda bisa menggunakan ctrl (tahan) + spasi untuk
menampilkan code assistant pada android studio.
Sekarang seharusnya kelas MainActivity kita saat ini berisi seperti berikut :
o @Override
o public boolean onOptionsItemSelected(MenuItem item) {
o switch (item.getItemId()){
o case R.id.action_list:
o showRecyclerList();
o break;
o case R.id.action_grid:
o showRecyclerGrid();
o break;
o case R.id.action_cardview:
o break;
o }
o return super.onOptionsItemSelected(item);
o }
Ini akan update tampilan ketika id dari action menu yang dipilih ditekan oleh
pengguna. Sekarang coba jalankan lagi aplikasi anda, maka sekarang anda
sudah bisa menampilkan dua bentuk dari RecyclerView yaitu list dan grid.
Yeay!!
1. Tinggal satu lagi, ayo kita lanjutkan dengan membuat
bentuk RecyclerView dengan komponen CardView.
Penggunaan CardView merupakan salah satu pattern yang direkomendasikan
pada pendekatan MaterialDesignyang dimana item-item pada koleksi data
ditampilkan dengan bungkusan layaknya sebuah kartu. Penggunaan
pendekatan hanya diperuntukkan jika dalam item list tersebut memiliki lebih
dari satu action. Baik, buat kembali file layout
xml item_cardview_president dan lengkapi kodenya menjadi seperti berikut :
7. @Override
8. public boolean onOptionsItemSelected(MenuItem item) {
9.
10. switch (item.getItemId()){
11. case R.id.action_list:
12. showRecyclerList();
13. break;
14.
15. case R.id.action_grid:
16. showRecyclerGrid();
17. break;
18.
19. case R.id.action_cardview:
20. showRecyclerCardView();
21. break;
22. }
23. return super.onOptionsItemSelected(item);
24. }
5. Jalankan aplikasinya dan seharusnya anda sudah bisa menampilkan tiga
bentuk RecyclerView yang telah kita diskusikan di awal. Mantap!
6. Untuk mempercantik tampilan dan menyesuaikan dengan target yang di awal,
kita akan melakukan penambahan method untuk mengubah judul halaman
setiap kita melakukan perubahan bentuk dari RecyclerView.
1. private void setActionBarTitle(String title){
2. getSupportActionBar().setTitle(title);
3. }
4. @Override
5. public boolean onOptionsItemSelected(MenuItem item) {
6. String title = null;
7. switch (item.getItemId()){
8. case R.id.action_list:
9. title = "Mode List";
10. showRecyclerList();
11. break;
12. case R.id.action_grid:
13. showRecyclerGrid();
14. title = "Mode Grid";
15. break;
16.
17. case R.id.action_cardview:
18. title = "Mode CardView";
19. showRecyclerCardView();
20. break;
21. }
22. setActionBarTitle(title);
23. return super.onOptionsItemSelected(item);
24. }
7. Jalankan kembali aplikasinya dan sekarang ketika anda berpindah dari satu
bentuk RecyclerView ke bentuk yang lain maka tiap itu pula terjadi perubahan
judul. Keren euy!
1. Tidak seperti ListView yang memiliki listener untuk melakukan sebuah aksi
ketika salah satu item pada list dipilih. Pada RecyclerView kita harus
membuatnya secara manual.
Namun tenang kami akan menunjukan bagaimana caranya menghandle
ketika salah satu item pada list di RecyclerView dipilih.
Pertama buat file bernama ids pada direktori values. Klik kanan pada values
→ new → Value resource file dan isikan ids pada field file name.
Setelah terbentuk lengkapi kodenya menjadi seperti berikut :
1. <?xmlversion="1.0" encoding="utf-8"?>
2. <resources>
3. <item name="item_click_support"type="id" />
4. </resources>
2. Selanjutnya buat kelas baru dengan nama ItemClickSupport dan lengkapi
kodenya menjadi seperti berikut :
1. public class ItemClickSupport {
2. private final RecyclerView mRecyclerView;
3. private OnItemClickListener mOnItemClickListener;
4. private OnItemLongClickListener mOnItemLongClickListener;
5.
6. private ItemClickSupport(RecyclerView recyclerView) {
7. mRecyclerView = recyclerView;
8. mRecyclerView.setTag(R.id.item_click_support, this);
9. mRecyclerView.addOnChildAttachStateChangeListener(mAttachLis
tener);
10. }
11.
12. private View.OnClickListener mOnClickListener = new View.OnClick
Listener() {
13.
14. @Override
15. public void onClick(View v) {
16. if (mOnItemClickListener != null) {
17. RecyclerView.ViewHolder holder = mRecyclerView.getCh
ildViewHolder(v);
18. mOnItemClickListener.onItemClicked(mRecyclerView, ho
lder.getAdapterPosition(), v);
19. }
20. }
21. };
22. private View.OnLongClickListener mOnLongClickListener = new View
.OnLongClickListener() {
23.
24. @Override
25. public boolean onLongClick(View v) {
26. if (mOnItemLongClickListener != null) {
27. RecyclerView.ViewHolder holder = mRecyclerView.getCh
ildViewHolder(v);
28. return mOnItemLongClickListener.onItemLongClicked(mR
ecyclerView, holder.getAdapterPosition(), v);
29. }
30. return false;
31. }
32. };
33. private RecyclerView.OnChildAttachStateChangeListener mAttachLis
tener
34. = new RecyclerView.OnChildAttachStateChangeListener() {
35.
36. @Override
37. public void onChildViewAttachedToWindow(View view) {
38. if (mOnItemClickListener != null) {
39. view.setOnClickListener(mOnClickListener);
40. }
41. if (mOnItemLongClickListener != null) {
42. view.setOnLongClickListener(mOnLongClickListener);
43. }
44. }
45.
46. @Override
47. public void onChildViewDetachedFromWindow(View view) {
48. }
49. };
50. public static ItemClickSupport addTo(RecyclerView view) {
51. ItemClickSupport support = (ItemClickSupport) view.getTag(R.
id.item_click_support);
52. if (support == null) {
53. support = new ItemClickSupport(view);
54. }
55. return support;
56. }
57. public static ItemClickSupport removeFrom(RecyclerView view) {
58. ItemClickSupport support = (ItemClickSupport) view.getTag(R.
id.item_click_support);
59. if (support != null) {
60. support.detach(view);
61. }
62. return support;
63. }
64. public ItemClickSupport setOnItemClickListener(OnItemClickListen
er listener) {
65. mOnItemClickListener = listener;
66. return this;
67. }
68. public ItemClickSupport setOnItemLongClickListener(OnItemLongCli
ckListener listener) {
69. mOnItemLongClickListener = listener;
70. return this;
71. }
72. private void detach(RecyclerView view) {
73. view.removeOnChildAttachStateChangeListener(mAttachListener)
;
74. view.setTag(R.id.item_click_support, null);
75. }
76. public interface OnItemClickListener {
77. void onItemClicked(RecyclerView recyclerView, int position,
View v);
78. }
79. public interface OnItemLongClickListener {
80. boolean onItemLongClicked(RecyclerView recyclerView, int pos
ition, View v);
81. }
82. }
Pada prinsipnya kelas ItemClickSupport akan menjadi satu kelas handler
untuk melakukan action ketika pengguna menekan atau melakukan klik yang
lama (long clicked) terhadap salah satu item pada RecyclerView.
3. Setelah selesai, mari kita pasang pada MainActivity dan tambahkan satu
method ini untuk menandakan item mana yang dipilih.
1. private void showSelectedPresident(President president){
2. Toast.makeText(this, "Kamu memilih "+president.getName(), Toast.
LENGTH_SHORT).show();
3. }
Dan tambahkan pada masing-masing method di list dan grid seperti berikut :
Bedah Kode
Pendekatan umum dalam mengembangkan aplikasi mobile terletak pada bentuk list
to detail dengan artian menampilkan sejumlah informasi dalam bentuk list dan
kemudian pengguna melakukan klik untuk mendapatkan detail informasi pada item
pada list yang dipilih.
1. @Override
2. public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType
) {
3. View itemRow = LayoutInflater.from(parent.getContext()).inflate(R.layou
t.item_row_president, parent, false);
4. return new CategoryViewHolder(itemRow);
5. }
6.
7. @Override
8. public void onBindViewHolder(CategoryViewHolder holder, int position) {
9. holder.tvName.setText(getListPresident().get(position).getName());
10. holder.tvRemarks.setText(getListPresident().get(position).getRemarks())
;
11.
12. Glide.with(context)
13. .load(getListPresident().get(position).getPhoto())
14. .override(55, 55)
15. .crossFade()
16. .into(holder.imgPhoto);
17. }
18.
19. class CategoryViewHolder extends RecyclerView.ViewHolder{
20. TextView tvName;
21. TextView tvRemarks;
22. ImageView imgPhoto;
23.
24. public CategoryViewHolder(View itemView) {
25. super(itemView);
26. tvName = (TextView)itemView.findViewById(R.id.tv_item_name);
27. tvRemarks = (TextView)itemView.findViewById(R.id.tv_item_remarks);
28. imgPhoto = (ImageView)itemView.findViewById(R.id.img_item_photo);
29. }
30. }
1. rvCategory.setHasFixedSize(true);
Menjelaskan bahwa jika kita set nilai true, RecyclerView secara otomatis dapat
melakukan optimasi untuk ukuran lebar dan tinggi RecyclerView adalah konstan.
Terlebih jika kita memiliki koleksi data yang dinamis untuk proses penambahan,
perpindahan, dan pengurangan item dari koleksi data.
Kita menggunakan library keren bernama Glide untuk menampilkan foto dari URL
yang diberikan secara asynchronous.
Pada sisi fleksibilitas, RecyclerView memiliki beragam bentuk yang disesuaikan
dengan design yang diinginkan, kita hanya perlu set nilai pada
method setLayoutManager() saja untuk menentukan
bagaimana RecyclerViewditampilkan.
1. rvCategory.setLayoutManager(new LinearLayoutManager(this));
atau
Terakhir, untuk membuat kamu lebih paham tentang RecyclerView beberapa link di
bawah ini wajib kamu baca :
RecylerView
Using the RecyclerView
Fundamentals for ListView
RecyclerView Animator