Tutorial Lengkap Belajar Android
Tutorial Lengkap Belajar Android
0: Pengantar Android
Materi:
Sebagai platform perangkat seluler paling populer di dunia, Android mendukung ratusan juta
perangkat seluler di lebih dari 190 negara di seluruh dunia. Android memiliki basis pemasangan
terbesar dari platform seluler apa pun dan masih tumbuh dengan cepat. Setiap hari, jutaan
pengguna lain menyalakan perangkat Android mereka untuk pertama kalinya dan mulai mencari
aplikasi, game, dan materi digital lainnya.
Android menyediakan antarmuka pengguna (UI) layar sentuh untuk berinteraksi dengan aplikasi.
Antarmuka pengguna Android sebagian besar berdasarkan pada manipulasi langsung,
menggunakan isyarat sentuhan seperti menggesek, mengetuk, dan mencubit untuk memanipulasi
objek di layar. Selain keyboard, ada keyboard virtual yang bisa disesuaikan untuk masukan teks.
Android juga bisa mendukung pengontrol game dan keyboard fisik berukuran penuh yang
dihubungkan dengan Bluetooth atau USB.
Layar utama Android bisa berisi sejumlah laman ikon aplikasi, yang akan meluncurkan aplikasi
terkait, dan widget, dengan menampilkan materi langsung yang diperbarui secara otomatis
seperti cuaca, kotak masuk email pengguna, atau ticker berita. Android juga bisa memutar materi
multimedia seperti musik, animasi, dan video. Gambar di atas menampilkan ikon aplikasi pada
layar utama (kiri), musik yang diputar (tengah), dan widget yang ditampilkan (kanan). Sepanjang
bagian atas layar terdapat bilah status, yang menampilkan informasi tentang perangkat dan
konektivitasnya. Layar utama Android bisa terdiri dari sejumlah laman, yang bisa digesek
mundur dan maju oleh pengguna.
Android didesain untuk menyediakan respons cepat terhadap masukan pengguna. Selain
antarmuka sentuh yang berubah-ubah, kemampuan getaran perangkat Android bisa menyediakan
umpan balik sentuhan. Perangkat keras internal seperti akselerometer, giroskop, dan sensor
kedekatan, digunakan oleh banyak aplikasi untuk merespons tindakan pengguna tambahan.
Sensor tersebut bisa mendeteksi rotasi layar dari potret ke lanskap untuk tampilan yang lebih
lebar atau sensor bisa memungkinkan pengguna untuk menyetir kendaraan virtual dengan
memutar perangkat seolah-olah setir mobil.
Platform Android, berdasarkan pada kernel Linux, terutama didesain untuk perangkat seluler
layar sentuh seperti ponsel cerdas dan tablet. Karena perangkat Android biasanya bertenaga
baterai, Android didesain untuk mengelola proses guna menjaga konsumsi daya tetap minimum,
sehingga menyediakan penggunaan baterai lebih lama.
Gunakan Android Software Development Kit (SDK) Android untuk mengembangkan aplikasi
yang memanfaatkan UI dan sistem operasi Android. SDK terdiri dari serangkaian alat
development menyeluruh yang menyertakan debugger, pustaka perangkat lunak kode pratulis,
emulator perangkat, dokumentasi, kode contoh, dan tutorial. Gunakan alat-alat ini untuk
membuat aplikasi yang terlihat hebat dan manfaatkan kemampuan perangkat keras yang tersedia
di setiap perangkat.
Untuk mengembangkan aplikasi menggunakan SDK, gunakan bahasa pemrograman Java untuk
mengembangkan aplikasi dan file Extensible Markup Language (XML) untuk menjelaskan
sumber daya data. Dengan menulis kode di Java dan membuat biner aplikasi tunggal, Anda akan
memiliki aplikasi yang bisa berjalan pada faktor bentuk ponsel dan tablet. Anda bisa
mendeklarasikan UI dalam rangkaian sumber daya XML ringan, satu rangkaian untuk bagian UI
yang umum bagi semua faktor bentuk, dan rangkaian lain untuk fitur yang khusus bagi ponsel
atau tablet. Pada waktu proses, Android menerapkan rangkaian sumber daya yang tepat
berdasarkan ukuran layar, kepadatan, lokal, dan sebagainya.
Android menyediakan arsitektur development yang kaya. Anda tidak perlu mengetahui banyak
tentang komponen arsitektur ini, namun perlu mengetahui apa yang tersedia dalam sistem yang
digunakan untuk aplikasi Anda. Diagram berikut menampilkan komponen utama sistem
tumpukan Android — sistem operasi dan arsitektur development.
1. Aplikasi: Aplikasi berada pada tingkat ini, bersama dengan aplikasi sistem inti untuk
email, perpesanan SMS, kalender, penjelajahan Internet, atau kontak.
2. Kerangka Kerja API Java: Semua fitur Android tersedia untuk developer melalui
antarmuka pemograman aplikasi (API) yang ditulis dalam bahasa Java. Anda tidak perlu
mengetahui detail semua API untuk mempelajari cara mengembangkan aplikasi Android,
namun Anda bisa mengetahui selengkapnya tentang API berikut ini, yang berguna untuk
membuat aplikasi:
o Sistem Tampilan digunakan untuk membangun UI aplikasi, termasuk daftar,
tombol, dan menu.
o Pengelola Referensi digunakan untuk mengakses sumber daya non-kode seperti
string, grafik, dan file layout yang dilokalkan.
o Pengelola Notifikasi digunakan untuk menampilkan peringatan khusus di bilah
status.
o Pengelola Aktivitas yang mengelola daur hidup aplikasi.
o Penyedia Materi yang memungkinkan aplikasi untuk mengakses data dari aplikasi
lain.
o Semua API kerangka kerja yang digunakan aplikasi sistem Android.
3. Pustaka dan Waktu Proses Android:Setiap aplikasi berjalan dalam prosesnya sendiri
dan dengan instance Android Runtime sendiri, yang memungkinkan beberapa mesin
sekaligus virtual pada perangkat bermemori rendah. Android juga menyertakan rangkaian
pustaka waktu proses inti yang menyediakan sebagian besar fungsionalitas bahasa
pemrograman Java, termasuk beberapa fitur bahasa Java 8 yang digunakan kerangka
kerja Java API. Banyak layanan dan komponen sistem Android inti dibangun dari kode
asli yang memerlukan pustaka asli yang ditulis dalam C dan C++. Pustaka asli tersebut
tersedia untuk aplikasi melalui kerangka kerja Java API.
4. Hardware Abstraction Layer (HAL): Lapisan ini menyediakan antarmuka standar yang
menunjukkan kemampuan perangkat keras di perangkat ke kerangka kerja Java API yang
lebih tinggi. HAL terdiri atas beberapa modul pustaka, masing-masing
mengimplementasikan antarmuka untuk komponen perangkat keras tertentu, seperti
modul kamera atau bluetooth.
5. Kernel Linux: Fondasi platform Android adalah kernel Linux. Lapisan di atas
mengandalkan kernel Linux untuk fungsionalitas pokok seperti threading dan manajemen
memori tingkat rendah. Menggunakan kernel Linux memungkinkan Android
memanfaatkan fitur keamanan utama dan memungkinkan produsen perangkat
mengembangkan driver perangkat keras untuk kernel yang cukup dikenal.
Anda bisa mendistribusikan aplikasi Android dalam banyak cara: email, situs web, atau pasar
aplikasi seperti Google Play. Pengguna Android mengunduh jutaan aplikasi dan game dari
Google Play store setiap bulan (ditampilkan dalam gambar di bawah ini). Google Play adalah
layanan distribusi digital, yang dioperasikan dan dikembangkan oleh Google, yang berfungsi
sebagai toko aplikasi resmi untuk Android, yang memungkinkan konsumen menjelajah dan
mengunduh aplikasi yang dikembangkan dengan Android SDK dan dipublikasikan melalui
Google.
Versi Android
Google menyediakan peningkatan versi bertahap utama untuk sistem operasi Android setiap enam
hingga sembilan bulan, menggunakan nama bertema makanan. Rilis utama yang terbaru adalah Android
7.0 "Nougat".
Froyo
Lollipop
Dasbor untuk Versi Platform diperbarui secara berkala untuk menampilkan distribusi perangkat
aktif yang menjalankan setiap versi Android, berdasarkan jumlah perangkat yang mengunjungi
Google Play Store. Mendukung sekitar 90% perangkat aktif adalah praktik yang baik, sekaligus
menargetkan aplikasi Anda ke versi terbaru.
Catatan: Untuk menyediakan fitur dan fungsionalitas terbaik di seluruh versi Android, gunakan
Pustaka Dukungan Android di aplikasi Anda. Pustaka dukungan ini memungkinkan aplikasi
Anda menggunakan API platform terbaru di perangkat lama.
Anda.
Sebagai tambahan, produsen perangkat mungkin menambahkan elemen UI, gaya, dan warna
sendiri untuk membedakan produk mereka. Setiap produsen menawarkan fitur berbeda dalam hal
bentuk keyboard, ukuran layar, atau tombol kamera. Aplikasi yang berjalan pada satu perangkat
mungkin terlihat sedikit berbeda di perangkat lain. Tantangan bagi sebagian besar developer
adalah untuk mendesain elemen UI yang bisa bekerja di semua perangkat Selain itu, developer
juga bertanggung jawab untuk menyediakan sumber daya aplikasi seperti ikon, logo, grafik lain,
dan gaya teks untuk mempertahankan keseragaman penampilan di seluruh perangkat yang
berbeda.
Kinerja aplikasi, seberapa cepat aplikasi berjalan, seberapa mudah aplikasi menghubungkan ke
jaringan, dan seberapa baik aplikasi mengelola baterai dan penggunaan memori, dipengaruhi
oleh beberapa faktor seperti daya tahan baterai, materi multimedia, dan akses Internet. Anda
harus memperhatikan batasan tersebut dan menulis kode sedemikian rupa sehingga penggunaan
sumber daya diseimbangkan dan didistribusikan secara optimal. Misalnya, Anda harus
menyeimbangkan layanan latar belakang dengan mengaktifkannya hanya jika perlu; hal ini akan
menghemat daya tahan baterai perangkat pengguna.
Anda perlu melakukan tindakan pencegahan untuk mengamankan kode dan pengalaman
pengguna saat menggunakan aplikasi. Gunakan alat seperti ProGuard (disediakan di Android
Studio), yang mendeteksi dan membuang kelas, bidang, metode, dan atribut yang tidak
digunakan serta mengenkripsi semua kode dan sumber daya aplikasi sewaktu memaketkan
aplikasi. Untuk melindungi informasi penting milik pengguna seperti proses masuk dan sandi,
Anda harus mengamankan saluran komunikasi untuk melindungi data yang bergerak (di Internet)
serta data yang tidak bergerak (di perangkat).
Pertimbangkan cara menambahkan fitur versi platform Android baru ke aplikasi, sambil
memastikan bahwa aplikasi masih bisa berjalan pada perangkat dengan versi platform yang lebih
lama. Hal ini tidak akan bermanfaat untuk hanya fokus pada versi Android terbaru, karena tidak
semua pengguna sudah meningkatkan versi atau dapat meningkatkan versi perangkat mereka.
Ketahui selengkapnya
Cerita Android
Panduan Android API, bagian "Kembangkan":
o Pengantar Android
o Arsitektur Platform
o Ringkasan UI
o Versi Platform
Lainnya:
o Panduan Pengguna Android Studio: Image Asset Studio
Proses development
Menggunakan Android Studio
Menjelajahi proyek
Menampilkan dan mengedit kode Java
Menampilkan dan mengedit layout
Memahami proses pembangunan
Menjalankan aplikasi di emulator atau perangkat
Menggunakan log
Praktik terkait
Ketahui selengkapnya
Bab ini menjelaskan cara mengembangkan aplikasi menggunakan Android Studio Integrated
Development Environment (IDE).
Proses development
Proyek aplikasi Android dimulai dengan ide dan definisi persyaratan yang diperlukan untuk
mewujudkan ide tersebut. Saat proyek berjalan, maka akan melalui desain, development, dan
pengujian.
Diagram di atas adalah gambar proses development tingkat tinggi, dengan langkah-langkah
berikut:
Mendefinisikan ide dan persyaratannya: Sebagian besar aplikasi dimulai dengan ide
tentang hal yang harus dilakukan, yang didukung pasar dan penelitian pengguna. Selama
tahap ini, persyaratan aplikasi didefinisikan.
Membuat prototipe antarmuka pengguna: Gunakan gambar, rekaan, dan prototipe untuk
menampilkan tampilan antarmuka pengguna nantinya, dan cara kerjanya.
Mengembangkan dan menguji aplikasi: Aplikasi terdiri dari satu atau beberapa aktivitas.
Untuk setiap aktivitas, Anda bisa menggunakan Android Studio untuk melakukan hal
berikut, tidak dalam urutan tertentu:
o Buat layout: Tempatkan elemen UI pada layar di layout, dan tetapkan sumber
daya string serta item menu, menggunakan Extensible Markup Language (XML).
o Tulis kode Java: Buat referensi kode sumber untuk komponen dan pengujian,
serta gunakan alat pengujian dan debug.
o Daftarkan aktivitas: Deklarasikan aktivitas dalam file manifes.
Setelah berhasil memasang Android Studio IDE, klik dua kali ikon aplikasi Android Studio untuk
memulainya. Pilih Start a new Android Studio project di jendela Welcome, dan beri nama
proyek dengan nama yang sama yang ingin Anda gunakan untuk aplikasi.
Saat memilih Domain Perusahaan unik, ingat bahwa aplikasi yang dipublikasikan ke Google
Play harus memiliki nama paket unik. Karena domain bersifat unik, yang mengawali nama
aplikasi dengan nama Anda, atau nama domain perusahaan, sebaiknya sediakan nama paket unik
yang memadai. Jika tidak berencana untuk mempublikasikan aplikasi, Anda bisa menerima
domain contoh default. Ketahuilah bahwa mengubah nama paket di lain waktu memerlukan kerja
tambahan.
Saat memilih Target Android Devices, Phone and Tablet dipilih secara default, seperti yang
ditampilkan dalam gambar di bawah ini. Pilihan yang ditampilkan dalam gambar untuk
Minimum SDK — API 15: Android 4.0.3 (IceCreamSandwich) — membuat aplikasi Anda
kompatibel dengan 97% perangkat Android yang aktif di Google Play Store.
Perangkat berbeda menjalankan versi sistem Android yang berbeda, seperti Android 4.0.3 atau
Android 4.4. Setiap versi yang berurutan umumnya menambahkan API baru yang tidak tersedia
di versi sebelumnya. Untuk menunjukkan rangkaian API yang tersedia, setiap versi menetapkan
API level. Misalnya, Android 1.0 adalah API level 1 dan Android 4.0.3 adalah API level 15.
Minimum SDK mendeklarasikan versi Android minimum untuk aplikasi Anda. Setiap versi
Android yang berurutan menyediakan kompatibilitas untuk aplikasi yang dibangun
menggunakan API dari versi sebelumnya, sehingga aplikasi Anda akan selalu kompatibel dengan
versi Android mendatang sambil menggunakan Android API yang didokumentasikan.
Memilih template
Android Studio mengumpulkan terlebih dulu proyek Anda dengan kode minimum untuk
aktivitas dan layout layar berdasarkan template. Tersedia berbagai macam template, mulai dari
template kosong virtual (Add No Activity) hingga beragam tipe aktivitas.
Anda bisa menyesuaikan aktivitas setelah memilih template. Misalnya, template Empty Activity
menyediakan satu aktivitas yang disertai satu sumber daya layout untuk layar. Anda bisa memilih
untuk menerima nama yang biasa digunakan untuk aktivitas (seperti MainActivity) atau
mengubah nama di layar Customize Activity . Selain itu, jika Anda menggunakan template
Empty Activity, pastikan memeriksa yang berikut ini jika belum diperiksa:
Generate Layout File: Biarkan ini dicentang untuk membuat sumber daya layout yang
terhubung dengan aktivitas ini, yang biasanya diberi nama activity_main.xml. Layout
mendefinisikan antarmuka pengguna untuk aktivitas.
Backwards Compatibility (AppCompat): Biarkan ini dicentang untuk menyertakan
pustaka AppCompat sehingga aplikasi kompatibel dengan Android versi sebelumnya
bahkan jika menggunakan fitur yang hanya ditemukan di versi yang lebih baru.
Android Studio membuat folder untuk proyek yang baru saja dibuat di folder
AndroidStudioProjects pada komputer Anda.
1. Bilah Alat. Bilah alat menjalankan beragam tindakan, termasuk menjalankan aplikasi
Android dan meluncurkan alat Android.
2. Bilah Navigasi. Bilah navigasi memungkinkan navigasi melalui proyek dan membuka
file untuk pengeditan. Bilah navigasi menyediakan tampilan struktur proyek yang lebih
ringkas.
3. Panel Editor. Panel ini menampilkan materi file yang dipilih dalam proyek. Misalnya,
setelah memilih layout (seperti yang ditampilkan dalam gambar), panel ini menampilkan
editor layout dengan alat untuk mengedit layout. Setelah memilih file kode Java, panel ini
menampilkan kode dengan alat untuk mengedit kode.
4. Bilah Status. Bilah status menampilkan status proyek dan Android Studio itu sendiri,
serta peringatan atau pesan apa pun. Anda bisa mengamati kemajuan pembangunan di
bilah status.
5. Panel Project. Panel proyek menampilkan file proyek dan hierarki proyek.
6. Panel Monitor. Panel monitor menawarkan akses ke daftar TODO untuk mengelola
tugas, Android Monitor untuk memantau eksekusi aplikasi (ditampilkan dalam gambar),
logcat untuk menampilkan pesan log, dan aplikasi Terminal untuk melakukan aktivitas
Terminal.
Tip: Anda bisa mengatur jendela utama untuk memberi Anda lebih banyak ruang layar dengan
menyembunyikan atau memindahkan panel. Anda juga bisa menggunakan pintasan keyboard
untuk mengakses lebih banyak fitur. Lihat Pintasan Keyboard untuk daftar lengkap.
Menjelajahi proyek
Setiap proyek di Android Studio berisi file AndroidManifest.xml, file kode sumber komponen,
dan file sumber daya terkait. Secara default, Android Studio mengatur file proyek Anda
berdasarkan jenis file, dan menampilkannya dalam proyek: Tampilan Android di panel alat
(bantu) kiri, seperti yang ditampilkan di bawah ini. Tampilan menyediakan akses cepat ke file
kunci proyek Anda.
Untuk beralih kembali ke tampilan ini dari tampilan lainnya, klik tab Project vertikal di kolom
paling kiri panel Project, dan pilih Android dari menu munculan di bagian atas panel Project,
seperti yang ditampilkan dalam gambar di bawah ini.
Sebelum sistem Android bisa memulai komponen aplikasi, sistem harus mengetahui bahwa
komponen ada dengan membaca file AndroidManifest.xml aplikasi. Aplikasi harus
mendeklarasikan semua komponennya dalam file ini, yang harus berada pada akar direktori
proyek aplikasi.
Untuk menampilkan file ini, luaskan folder manifes di Project: Tampilan Android, dan klik dua
kali file (AndroidManifest.xml). Isinya muncul di panel pengeditan seperti yang ditampilkan
dalam gambar di bawah ini.
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.helloworld">
Ekspresi package menampilkan nama paket unik aplikasi baru. Jangan mengubah ini setelah
aplikasi dipublikasikan.
<application
...
</application>
Cadangan otomatis
...
android:allowBackup="true"
...
Untuk aplikasi dengan versi SDK target berupa Android 6.0 (API level 23) dan yang lebih tinggi,
perangkat yang menjalankan Android 6.0 dan yang lebih tinggi secara otomatis membuat
cadangan data aplikasi ke awan karena atribut android:allowBackup default ke true jika
dihilangkan. Untuk aplikasi < API level 22, Anda harus secara eksplisit menambahkan atribut
android:allowBackup dan menyetelnya ke true.
Tip: Untuk mengetahui selengkapnya tentang pencadangan otomatis untuk aplikasi, lihat
Mengonfigurasi Cadangan Otomatis untuk Aplikasi.
Ikon aplikasi
...
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
...
Atribut android:icon menetapkan ikon di folder mipmap (di dalam folder res di Project:
tampilan Android) untuk aplikasi. Ikon muncul di Peluncur untuk meluncurkan aplikasi. Ikon
juga digunakan sebagai ikon default untuk komponen aplikasi.
Sumber daya string dan label aplikasi
Seperti yang bisa Anda lihat di gambar sebelumnya, atribut android:label menampilkan string
"Hello World" yang disorot. Jika Anda mengeklik string ini, maka string berubah untuk
menampilkan sumber daya string @string/app_name:
...
android:label="@string/app_name"
...
Tip: Ctrl - klik atau klik-kanan app_name di panel edit untuk melihat menu konteks. Pilih Go To
> Declaration untuk melihat lokasi sumber daya string dideklarasikan: dalam file strings.xml.
Bila Anda memilih Go To > Declaration atau membuka file dengan mengeklik dua kali
strings.xml di Project: Tampilan Android (di dalam folder values), isinya muncul di panel
pengeditan.
Setelah membuka file strings.xml, Anda bisa melihat bahwa nama string app_name disetel ke
Hello World. Anda bisa mengubah nama aplikasi dengan mengubah string Hello World ke hal
lain. Sumber daya string dijelaskan dalam pelajaran terpisah.
Tema aplikasi
...
android:theme="@style/AppTheme">
...
Atribut theme disetel ke tema standar AppTheme. Tema dijelaskan dalam pelajaran terpisah.
Perangkat yang berbeda mungkin menjalankan versi sistem Android yang berbeda, seperti
Android 4.0 atau Android 4.4. Setiap versi yang berurutan bisa menambahkan API baru yang
tidak tersedia di versi sebelumnya. Untuk menunjukkan rangkaian API yang tersedia, setiap versi
menetapkan API level. Misalnya, Android 1.0 adalah API level 1 dan Android 4.4 adalah API
level 19.
API level memungkinkan developer untuk mendeklarasikan versi minimum dengan aplikasi
yang kompatibel, menggunakan tag manifes <uses-sdk> dan atribut minSdkVersion . Misalnya,
Calendar Provider API telah ditambahkan di Android 4.0 (API level 14). Jika aplikasi Anda tidak
berfungsi tanpa API tersebut, deklarasikan API level 14 sebagai versi yang didukung minimum
aplikasi seperti ini:
Atribut targetSdkVersion tidak mencegah aplikasi dipasang pada versi Android yang lebih
tinggi (yang lebih baru) dibandingkan nilai yang ditetapkan, namun hal ini penting karena
menunjukkan pada sistem apakah aplikasi harus mewarisi perubahan perilaku di versi yang baru.
Jika Anda tidak memperbarui targetSdkVersion ke versi terbaru, sistem akan menganggap
bahwa aplikasi memerlukan perilaku kompatibilitas mundur saat dijalankan pada versi terbaru.
Misalnya, di antara perubahan perilaku di Android 4.4, alarm yang dibuat dengan AlarmManager
API saat ini tidak tepat secara default sehingga sistem bisa mengumpulkan alarm aplikasi dan
mempertahankan kekuatan sistem, namun sistem akan menahan perilaku API sebelumnya untuk
aplikasi jika API level target Anda lebih rendah daripada "19".
1. Klik folder modul untuk meluaskan dan menampilkan file MainActivity untuk aktivitas
yang ditulis di Java (kelas MainActivity ).
2. Klik dua kali MainActivity untuk melihat file sumber di panel pengeditan, seperti yang
ditampilkan dalam gambar di bawah ini.
Bagian paling atas file MainActivity.java adalah pernyataan package yang mendefinisikan paket
aplikasi. Ini diikuti dengan blok import yang diringkas dalam gambar di atas, dengan "...".
Klik titik untuk meluaskan blok guna menampilkannya. Pernyataan import akan mengimpor
pustaka yang diperlukan untuk aplikasi, seperti berikut ini, yang mengimpor pustaka
AppCompatActivity:
import android.support.v7.app.AppCompatActivity;
Setiap aktivitas dalam aplikasi diimplementasikan sebagai kelas Java. Deklarasi kelas berikut
memperluas kelas AppCompatActivity untuk mengimplementasikan fitur dengan cara yang
kompatibel-mundur dengan Android versi sebelumnya:
Seperti yang Anda pelajari terdahulu, sebelum sistem Android bisa memulai komponen aplikasi
seperti aktivitas, sistem harus mengetahui bahwa aktivitas ada dengan membaca file
AndroidManifest.xml aplikasi. Oleh karena itu, setiap aktivitas harus dicantumkan di file
AndroidManifest.xml.
Android Studio menampilkan tampilan Desain layout, seperti yang ditampilkan dalam gambar di
bawah ini. Tampilan ini menyediakan panel Palette elemen antarmuka pengguna, dan petak yang
menampilkan layout layar.
Android Studio menggunakan Gradle sebagai dasar sistem pembangunan, dengan kemampuan
khusus Android lebih banyak yang disediakan oleh Android Plugin for Gradle. Sistem
pembangunan ini berjalan sebagai alat (bantu) terintegrasi dari menu Android Studio.
Bila Anda membuat proyek, Android Studio secara otomatis menghasilkan file pembangunan
penting di folder Gradle Scripts dalam Project: Tampilan Android. File pembangunan Android
Studio diberi nama build.gradle seperti yang ditampilkan di bawah ini:
Ini adalah file pembangunan tingkat atas untuk keseluruhan proyek, berada di akar direktori
proyek, yang mendefinisikan konfigurasi pembangunan yang berlaku untuk semua modul di
proyek Anda. File ini, yang dihasilkan oleh Android Studio, tidak boleh diedit untuk
menyertakan dependensi aplikasi.
Android Studio membuat file build.gradle (Module: app) terpisah untuk setiap modul. Anda
bisa mengedit setelan pembangunan guna menyediakan opsi pemaketan khusus untuk setiap
modul, seperti tipe pembangunan tambahan dan ragam produk, dan untuk menggantikan setelan
di file manifes atau build.gradle tingkat atas. File ini paling sering adalah file untuk mengedit
ketika mengubah konfigurasi tingkat aplikasi, seperti mendeklarasikan dependensi di bagian
dependencies . Yang berikut ini menampilkan isi file build.gradle (Module: app) proyek:
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.example.android.helloworld2"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
rilis {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-
core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
File build.gradle menggunakan sintaks Gradle. Gradle adalah Domain Specific Language (DSL)
untuk menjelaskan dan memanipulasi logika pembangunan dengan menggunakan Groovy, yang
merupakan bahasa dinamis untuk Java Virtual Machine (JVM). Anda tidak perlu mempelajari
Groovy untuk melakukan perubahan, karena Android Plugin for Gradle memperkenalkan
sebagian besar elemen DSL yang Anda perlukan.
Tip: Untuk mengetahui selengkapnya tentang DSL plugin Android, baca Dokumentasi referensi
DSL.
Dalam file build.gradle (Module: app) di atas, pernyataan pertama menerapkan tugas
pembangunan plug-in Gradle khusus Android:
android {
...
}
Blok defaultConfig
Setelan inti dan entri untuk aplikasi ditetapkan di blok defaultConfig { } dalam android { }
block:
...
defaultConfig {
applicationId "com.example.hello.helloworld"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
...
Tipe pembangunan
Tipe pembangunan untuk aplikasi ditetapkan di blok buildTypes { } , yang mengontrol cara
aplikasi dibangun dan dipaketkan.
...
buildTypes {
rilis {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
...
Tipe pembangunan yang ditetapkan adalah release untuk rilis aplikasi. Tipe pembangunan
umum lainnya adalah debug. Mengonfigurasi tipe pembangunan dijelaskan dalam pelajaran
terpisah.
Dependensi
...
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',
{
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.0'
testCompile 'junit:junit:4.12'
}
Bila Anda membuat perubahan pada file konfigurasi pembangunan dalam proyek, Android
Studio akan mengharuskan Anda untuk melakukan sinkronisasi file proyek sehingga Android
Studio bisa mengimpor perubahan konfigurasi pembangunan dan menjalankan beberapa
pemeriksaan untuk memastikan konfigurasi tidak akan menimbulkan kesalahan pembangunan.
Untuk menyinkronkan file proyek, klik Sync Now di bilah notifikasi yang muncul saat membuat
perubahan, atau klik Sync Project dari bilah menu. Jika Android Studio memperlihatkan
kesalahan apa pun dengan konfigurasi — misalnya, jika kode sumber menggunakan fitur API
yang hanya tersedia di API level yang lebih tinggi dari compileSdkVersion — jendela
Messages muncul untuk menjelaskan masalah.
Pengelola Android Virtual Device (AVD) membuat perangkat virtual atau emulator yang
menyimulasikan konfigurasi untuk tipe perangkat Android tertentu. Gunakan AVD Manager
untuk mendefinisikan karakteristik perangkat keras perangkat dan API levelnya, dan untuk
menyimpannya sebagai konfigurasi perangkat virtual. Ketika Anda memulai emulator Android,
emulator akan membaca konfigurasi yang ditetapkan dan membuat perangkat emulasi pada
komputer yang berperilaku sama persis dengan versi fisik perangkat.
Layar "Your Virtual Devices" muncul menampilkan semua perangkat virtual yang dibuat
sebelumnya. Klik tombol +Create Virtual Device untuk membuat perangkat virtual baru.
Anda bisa memilih perangkat dari daftar perangkat keras yang telah didefinisikan sebelumnya.
Untuk setiap perangkat, tabel menampilkan ukuran tampilan diagonal (Size), resolusi layar
dalam piksel (Resolution), dan kepadatan piksel (Density). Misalnya, kepadatan piksel perangkat
Nexus 5 adalah xxhdpi, artinya aplikasi menggunakan ikon di folder xxhdpi dari folder
mipmap. Selain itu, aplikasi akan menggunakan layout dan sumber daya dapat digambar dari
folder yang didefinisikan untuk kepadatan tersebut.
Anda juga memilih versi sistem Android untuk perangkat. Tab Recommended menampilkan
sistem yang disarankan untuk perangkat. Lebih banyak versi tersedia di dalam tab x86 Images
dan Other Images.
Untuk menjalankan aplikasi pada perangkat virtual yang Anda buat di bagian sebelumnya, ikuti
langkah-langkah ini:
1. Di Android Studio, pilih Run > Run app atau klik Run icon di bilah alat.
2. Di jendela Select Deployment Target, pada Emulator yang tersedia, pilih perangkat
virtual yang Anda buat, dan klik OK.
Emulator memulai dan mem-booting seperti perangkat fisik. Ini memerlukan waktu beberapa
saat, bergantung pada kecepatan komputer Anda. Aplikasi membangun, dan setelah emulator
siap, Android Studio mengunggah aplikasi ke emulator dan menjalankannya.
Anda harus melihat aplikasi yang dibuat dari template Empty Activity ("Hello World") seperti
yang ditampilkan dalam gambar berikut ini, yang juga menampilkan panel Run Android Studio
yang menampilkan tindakan yang dilakukan untuk menjalankan aplikasi di emulator.
Catatan: Saat menguji pada emulator, praktik yang baik adalah memulainya sekali pada awal
sesi, dan jangan menutupnya hingga selesai sehingga tidak perlu melalui proses booting kembali.
Selalu uji aplikasi Anda pada perangkat fisik, karena pengguna akan menggunakan aplikasi pada
perangkat fisik. Meskipun emulator cukup bagus, emulator tidak bisa menampilkan semua
kemungkinan keadaan perangkat, seperti yang terjadi jika ada panggilan masuk sewaktu aplikasi
berjalan. Untuk menjalankan aplikasi pada perangkat fisik, Anda memerlukan hal berikut ini:
1. Pada perangkat fisik, buka Settings dan pilih About phone di bagian bawah layar
Settings.
2. Ketuk informasi Build number tujuh kali.
3. Kembali ke layar sebelumnya (Settings). Developer Options saat ini muncul di bagian
bawah layar. Ketuk Developer options.
4. Pilih USB Debugging.
Untuk melihat panel Android Monitor, klik tombol Android Monitor di bagian bawah jendela
utama Android Studio. Android Monitor menawarkan dua tab:
Tab logcat. Tab logcat menampilkan pesan log tentang aplikasi saat aplikasi berjalan.
Jika menambahkan pernyataan logging ke aplikasi, pesan log Anda dari pernyataan
tersebut muncul dengan pesan log lain di bawah tab ini.
Tab Monitors. Tab Monitors memantau kinerja aplikasi, yang bisa digunakan untuk
men-debug dan menyesuaikan kode Anda.
Pernyataan log menambahkan pesan apa pun yang Anda tetapkan ke log. Menambahkan
pernyataan log di titik tertentu dalam kode memungkinkan developer melihat nilai, jalur
eksekusi, dan pengecualian.
Misalnya, pernyataan log berikut menambahkan "MainActivity" dan "Hello World" ke log:
"MainActivity": Argumen pertama adalah log tag yang bisa digunakan untuk memfilter
pesan pada tab logcat. Ini biasanya merupakan nama aktivitas tempat pesan berasal. Akan
tetapi, Anda bisa membuatnya menjadi apa saja yang berguna bagi Anda untuk men-
debug aplikasi. Praktik terbaik adalah untuk menggunakan konstanta sebagai tag log,
seperti berikut:
1. Definisikan tag log sebagai konstanta sebelum menggunakannya dalam pernyataan log:
2. private static final String LOG_TAG =
3. MainActivity.class.getSimpleName();
4. Gunakan konstanta dalam pernyataan log:
5. Log.d(LOG_TAG, "Hello World");
6. "Hello World": Argumen kedua adalah pesan sebenarnya yang muncul setelah log level
dan tag log pada tab logcat.
Panel Run muncul di tempat panel Android Monitor bila Anda menjalankan aplikasi di emulator
atau perangkat. Setelah mulai menjalankan aplikasi, klik tombol Android Monitor di bagian
bawah jendela utama, kemudian klik tab logcat di panel Android Monitor jika belum dipilih.
Secara default, tampilan log disetel ke Verbose di menu tarik-turun di bagian atas tampilan
logcat untuk menampilkan semua pesan. Anda bisa mengubahnya menjadi Debug untuk melihat
pesan yang dimulai dengan Log.d, atau mengubahnya menjadi Error untuk melihat pesan yang
dimulai dengan Log.e, dan seterusnya.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dokumentasi Android Studio:
o Mengenal Android Studio
o Arsitektur Platform
o Ringkasan UI
o Versi Platform
Lainnya:
o Panduan Pengguna Android Studio: Image Asset Studio
o Situs Gradle
Pola model-view-presenter
Tampilan
Praktik terkait
Ketahui selengkapnya
Bab ini menjelaskan layout antarmuka pengguna di layar dan sumber daya lain yang Anda buat
untuk aplikasi, dan kode yang akan digunakan untuk merespons ketukan pengguna pada elemen
antarmuka pengguna.
Pola model-view-presenter
Menautkan aktivitas ke sumber daya layout adalah contoh dari bagian pola arsitektur model-
view-presenter (MVP). Pola MVP adalah cara yang sudah umum digunakan untuk
mengelompokkan fungsi aplikasi:
Tampilan. Tampilan adalah elemen antarmuka pengguna yang menampilkan data dan respons
terhadap tindakan pengguna. Setiap elemen layar adalah tampilan. Sistem Android menyediakan
berbagai jenis tampilan.
Presenter. Presenter menghubungkan tampilan aplikasi ke model. Presenter menyediakan
tampilan dengan data sebagaimana ditetapkan oleh model, dan juga menyediakan masukan
pengguna dari tampilan kepada model.
Model. Model menetapkan struktur data aplikasi dan kode untuk mengakses dan memanipulasi
data. Beberapa aplikasi yang Anda buat dalam pelajaran bisa digunakan bersama model untuk
mengakses data. Aplikasi Hello Toast tidak menggunakan model data, namun Anda bisa
memikirkan logikanya — menampilkan pesan, dan meningkatkan penghitung ketukan — sebagai
model.
Tampilan
UI terdiri dari hierarki objek yang disebut tampilan, setiap elemen layar adalah tampilan. Kelas
View menyatakan blok pembangunan dasar untuk semua komponen UI, dan kelas dasar untuk
kelas yang menyediakan komponen UI interaktif seperti tombol, kotak centang, dan bidang entri
teks.
Tampilan memiliki lokasi, yang dinyatakan sebagai pasangan koordinat kiri dan atas, dan dua
dimensi, yang dinyatakan sebagai lebar dan tinggi. Unit untuk lokasi dan dimensi adalah piksel
yang tidak tergantung perangkat (dp).
Sistem Android menyediakan ratusan tampilan yang telah didefinisikan sebelumnya, termasuk
yang menampilkan:
Teks (TextView)
Bidang untuk memasukkan dan mengedit teks (EditText)
Teks yang bisa digulir (ScrollView) dan item yang bisa digulir (RecyclerView)
Gambar (ImageView)
Anda bisa mendefinisikan tampilan untuk muncul di layar dan merespons ketukan pengguna.
Tampilan juga bisa didefinisikan untuk menerima masukan teks, atau tidak terlihat hingga
diperlukan.
Anda bisa menetapkan tampilan di file sumber daya layout XML. Sumber daya layout ditulis
dalam XML dan dicantumkan dalam folder layout di folder res dalam Project: Tampilan
Android.
Grup tampilan
Tampilan bisa dikelompokkan bersama di dalam grup tampilan (ViewGroup), yang berfungsi
sebagai kontainer tampilan. Hubungannya adalah induk-anak, dalam hal ini induk adalah grup
tampilan, dan anak adalah tampilan atau grup tampilan dalam grup. Berikut ini adalah grup
tampilan yang umum:
ScrollView: Grup yang berisi satu tampilan anak lainnya dan memungkinkan pengguliran
tampilan anak.
RecyclerView: Grup yang berisi daftar tampilan atau grup tampilan lainnya dan memungkinkan
penggulirannya dengan menambahkan dan membuang tampilan secara dinamis dari layar.
Tampilan untuk layar dikelola dalam hierarki. Di akar hierarki ini adalah ViewGroup yang berisi
layout keseluruhan layar. Layar anak grup tampilan bisa menjadi tampilan atau grup tampilan
lain seperti yang ditampilkan dalam gambar berikut.
Beberapa grup tampilan ditandai sebagai layout karena grup tampilan tersebut mengelola
tampilan anak dalam cara khusus dan umumnya digunakan sebagai grup tampilan akar. Beberapa
contoh layout adalah:
LinearLayout: Grup tampilan anak yang diposisikan dan disejajarkan secara horizontal atau
secara vertikal.
RelativeLayout: Grup tampilan anak yang setiap tampilannya diposisikan dan disejajarkan relatif
terhadap tampilan dalam grup tampilan. Dengan kata lain, posisi tampilan anak bisa dijelaskan
dalam hubungan satu sama lain atau dengan grup tampilan induk.
ConstraintLayout: Grup tampilan anak yang menggunakan titik jangkar, tepi, dan panduan untuk
mengontrol cara memosisikan tampilan relatif terhadap elemen lain di layout. ConstraintLayout
didesain untuk mempermudah saat menyeret dan melepaskan tampilan di editor layout.
TableLayout: Grup tampilan anak yang disusun ke dalam baris dan kolom.
AbsoluteLayout: Grup yang memungkinkan Anda menetapkan lokasi pasti (koordinat x/y)
tampilan anaknya. Layout mutlak bersifat kurang fleksibel dan lebih sulit dikelola daripada tipe
layout lainnya tanpa pemosisian mutlak.
FrameLayout: Grup tampilan anak bertumpuk. FrameLayout didesain untuk memblokir area di
layar guna menampilkan satu tampilan. Tampilan anak digambar bertumpuk, dengan anak yang
baru saja ditambahkan di atas. Ukuran FrameLayout adalah ukuran tampilan anak terbesarnya.
GridLayout: Grup yang menempatkan layar anaknya dalam kotak persegi panjang yang bisa
digulir.
Tip: Ketahui selengkapnya tentang tipe layout yang berbeda di Objek Layout Umum.
Contoh sederhana dari layout dengan tampilan anak adalah aplikasi Hello Toast di salah satu
pelajaran awal. Tampilan aplikasi Hello Toast muncul dalam gambar di bawah ini sebagai
diagram file layout (activity_main.xml), bersama diagram hierarki (kanan atas) dan tangkapan
layar layout yang benar-benar selesai (kanan bawah).
1. Layout akar LinearLayout, yang berisi semua tampilan anak, disetel ke orientasi vertikal.
2. Button (button_toast) tampilan anak. Sebagai tampilan anak pertama, muncul di bagian atas
di layout linear.
3. TextView (show_count) tampilan anak. Sebagai tampilan anak kedua, muncul di bawah
tampilan anak pertama di layout linear.
4. Button (button_count) tampilan anak. Sebagai tampilan anak ketiga, muncul di bawah
tampilan anak kedua di layout linear.
Hierarki tampilan bisa tumbuh menjadi kompleks untuk aplikasi yang menampilkan banyak
tampilan di layar. Penting untuk memahami hierarki tampilan, karena akan memengaruhi apakah
tampilan terlihat dan apakah digambar secara efisien.
Tip: Anda bisa menjelajahi hierarki tampilan aplikasi menggunakan Hierarchy Viewer.
Hierarchy Viewer menampilkan tampilan pohon hierarki dan memungkinkan Anda menganalisis
kinerja tampilan di perangkat Android. Masalah kinerja dibahas di bab berikutnya.
Anda mendefinisikan tampilan di editor layout, atau dengan memasukkan kode XML. Editor
layout menunjukkan representasi visual kode XML.
Gunakan editor layout untuk mengedit file layout. Anda bisa menyeret dan melepas objek
tampilan ke dalam panel grafik, serta menyusun, mengubah ukuran, dan menetapkan
propertinya. Anda akan segera melihat efek perubahan yang dilakukan.
Untuk menggunakan editor layout, buka file layout XML. Editor layout muncul bersama tab
Design di bagian bawah yang disorot. (Jika tab Text disorot dan Anda melihat kode XML, klik
tab Design.) Untuk template Empty Activity, layout seperti yang ditampilkan dalam gambar di
bawah ini.
1. File XML layout. File layout XML, biasanya diberi nama file activiy_main.xml. Klik dua kali untuk
membuka editor layout.
2. Palet elemen UI (tampilan). Panel Palette menyediakan daftar elemen UI dan layout. Tambahkan
elemen atau layout ke UI dengan menyeretnya ke panel desain.
3. Bilah alat desain. Bilah alat panel desain menyediakan tombol untuk mengonfigurasi
penampilan layout dalam panel desain dan untuk mengedit properti layout. Lihat gambar
di bawah ini untuk detail.
Tip: Arahkan kursor ke atas setiap ikon untuk menampilkan keterangan alat yang
merangkum fungsinya.
4. Panel Properties. Panel Properties menyediakan kontrol properti untuk tampilan yang dipilih.
5. Kontrol properti. Kontrol properti sesuai dengan atribut XML. Yang ditampilkan dalam gambar
adalah properti Text dari TextView yang dipilih, yang disetel ke Hello World!.
6. Panel desain. Seret tampilan dari panel Palette ke panel desain untuk memosisikannya di layout.
7. Component Tree. Panel Component Tree menampilkan hierarki tampilan. Klik tampilan atau
grup tampilan dalam panel ini untuk memilihnya. Gambar menampilkan TextView yang dipilih.
8. Tab Design dan Text. Klik Design untuk melihat editor layout, atau Text untuk melihat kode XML.
Bilah alat (bantu) desain editor layout menawarkan deretan tombol yang memungkinkan Anda
mengonfigurasi penampilan layout:
1. Design, Blueprint, dan Both: Klik ikon Design (ikon pertama) untuk menampilkan pratinjau
warna layout. Klik ikon Blueprint (ikon tengah) untuk hanya menampilkan ringkasan setiap
tampilan. Anda bisa melihat kedua tampilan bersebelahan dengan mengeklik ikon ketiga.
2. Orientasi layar: Klik untuk memutar perangkat antara lanskap dan potret.
3. Tipe dan ukuran perangkat: Pilih tipe perangkat (ponsel/tablet, Android TV, atau Android Wear)
dan konfigurasi layar (ukuran dan kepadatan).
4. Versi API: Pilih versi Android yang digunakan untuk pratinjau layout.
6. Bahasa: Pilih bahasa untuk menampilkan string UI Anda. Daftar ini hanya menampilkan bahasa
yang tersedia dalam sumber daya string.
7. Varian Layout: Alihkan ke salah satu layout alternatif untuk file ini, atau buat yang baru.
Editor layout menawarkan lebih banyak fitur di tab Design bila Anda menggunakan
ConstraintLayout, termasuk tuas untuk mendefinisikan pembatas. Pembatas adalah koneksi atau
penyejajaran ke tampilan lainnya, ke layout induk, atau ke panduan yang tidak terlihat. Setiap
pembatas muncul sebagai garis yang membentang dari tuas melingkar. Setiap tampilan memiliki
tuas pembatas melingkar di bagian tengah setiap sisi. Setelah memilih tampilan di panel
Component Tree atau mengekliknya di layout, tampilan juga menampilkan tuas pengubah ukuran
pada setiap sudut.
3. Tuas patokan. Tuas patokan menyejajarkan patokan teks tampilan ke patokan tampilan lainnya.
Menggunakan XML
Terkadang lebih cepat dan lebih mudah mengedit kode XML secara langsung, terutama saat
menyalin dan menempelkan kode untuk tampilan serupa.
Untuk menampilkan dan mengedit kode XML, buka file layout XML. Editor layout muncul
bersama tab Design di bagian bawah yang disorot. Klik tab Text untuk melihat kode XML. Yang
berikut ini menampilkan cuplikan kode XML untuk LinearLayout dengan Button dan TextView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
... >
<Button
android:id="@+id/button_toast"
android:layout_width="@dimen/my_view_width"
android:layout_height="wrap_content"
... />
<TextView
android:id="@+id/show_count"
android:layout_width="@dimen/my_view_width"
android:layout_height="@dimen/counter_height"
... />
...
</LinearLayout>
<TextView
android:id="@+id/show_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/myBackgroundColor"
android:textStyle="bold"
android:text="@string/count_initial_value"
/>
android:attribute_name="value"
attribute_name adalah nama atribut. value adalah string dengan nilai untuk atribut. Misalnya:
android:textStyle="bold"
Jika value adalah sumber daya, seperti warna, simbol @ menetapkan jenis sumber dayanya.
Misalnya:
android:background="@color/myBackgroundColor"
Atribut latar belakang disetel ke sumber daya warna yang diidentifikasi sebagai
myBackgroundColor, yang dideklarasikan sebagai #FFF043. Sumber daya warna dijelaskan
dalam "Atribut terkait gaya" dalam bab ini.
Setiap tampilan dan grup tampilan mendukung berbagai atribut XML-nya sendiri. Beberapa
atribut telah ditetapkan untuk tampilan (misalnya, TextView mendukung atribut textSize ),
namun atribut-atribut ini juga diwarisi oleh tampilan apa pun yang mungkin memperluas kelas
TextView. Sebagian bersifat umum untuk semua tampilan, karena diwarisi dari kelas View akar
(seperti atribut android:id ). Untuk keterangan atribut khusus, lihat bagian ringkasan
dokumentasi kelas View.
Mengidentifikasi tampilan
Untuk mengidentifikasi tampilan secara unik dan merujuknya dari kode, Anda harus memberikan
ID. Atribut android:id memungkinkan Anda menetapkan id yang unik— yakni identifier
sumber daya untuk tampilan.
Misalnya:
android:id="@+id/button_count"
Bagian "@+id/button_count" dari atribut di atas akan membuat id baru yang disebut
button_count untuk tampilan. Anda menggunakan simbol plus (+) untuk menunjukkan bahwa
Anda sedang membuat baru id.
Merujuk tampilan
Untuk merujuk ke identifier sumber daya yang ada, hilangkan simbol plus (+). Misalnya, untuk
merujuk tampilan berdasarkan id -nya dalam atribut lain, misalnya android:layout_toLeftOf
(yang dijelaskan di bagian berikutnya) untuk mengontrol posisi tampilan, Anda perlu
menggunakan:
android:layout_toLeftOf="@id/show_count"
Dalam atribut di atas, "@id/show_count" merujuk ke tampilan dengan identifier sumber daya
show_count. Atribut memosisikan tampilan agar "ke kiri dari" tampilan show_count .
Memosisikan tampilan
Beberapa atribut pemosisian yang terkait layout diperlukan untuk tampilan, dan secara otomatis
muncul bila Anda menambahkan tampilan ke layout XML, siap untuk Anda tambahkan nilainya.
Pemosisian LinearLayout
android:orientation
match_parent akan meluaskan tampilan untuk mengisi induknya dengan lebar dan tinggi. Bila
LinearLayout adalah tampilan akar, ia akan meluaskan ke ukuran layar perangkat. Untuk tampilan
dalam grup tampilan akar, ia akan meluaskan ke ukuran grup tampilan induk.
wrap_content akan menciutkan dimensi tampilan yang cukup besar untuk menampung isinya.
(Jika tidak ada isinya, tampilan menjadi tidak terlihat.)
Gunakan dp (piksel yang tidak tergantung perangkat) berjumlah tetap untuk menetapkan ukuran
tetap, yang disesuaikan untuk ukuran layar perangkat. Misalnya, 16dp berarti 16 piksel yang
tidak tergantung perangkat. Piksel yang tidak tergantung perangkat dan dimensi lain dijelaskan di
"Dimensi" dalam bab ini.
Ukuran tampilan menyertakan pengisinya. Berikut ini adalah atribut pengisi yang umum
digunakan:
android:paddingEnd: Menyetel pengisi, dalam piksel, tepi ujung; yang digunakan bersama
android:paddingStart.
Tip: Untuk melihat semua atribut XML untuk LinearLayout, lihat bagian Rangkuman referensi
LinearLayout di Panduan Developer. Layout akar lainnya, seperti RelativeLayout dan
AbsoluteLayout, mencantumkan atribut XML-nya di bagian Rangkuman.
Pemosisian RelativeLayout
Grup tampilan berguna lainnya untuk layout adalah RelativeLayout, yang bisa Anda gunakan
untuk memosisikan tampilan anak yang berhubungan satu sama lain atau dengan induk. Atribut
yang bisa Anda gunakan bersama RelativeLayout antara lain berikut ini:
android:layout_toLeftOf: Memosisikan tepi kanan tampilan ini ke kiri tampilan lainnya (yang
diidentifikasi melalui ID-nya).
android:layout_toRightOf: Memosisikan tepi kiri tampilan ini ke kanan tampilan lainnya (yang
diidentifikasi melalui ID-nya).
android:layout_alignParentTop: Memosisikan tepi atas tampilan ini agar cocok dengan tepi atas
induknya.
android:layout_alignParentBottom: Memosisikan tepi bawah tampilan ini agar cocok dengan tepi
bawah induknya.
Anda menetapkan atribut gaya untuk menyesuaikan penampilan tampilan. Tampilan yang tidak
memiliki atribut gaya, misalnya android:textColor, android:textSize, dan
android:background, menggunakan gaya yang didefinisikan di tema aplikasi.
Berikut ini adalah atribut terkait gaya yang digunakan dalam contoh layout XML di bagian
sebelumnya:
File sumber daya disimpan dalam folder yang berada di folder res, termasuk:
mipmap: Untuk kumpulan ikon aplikasi yang sudah dihitung dan dioptimalkan yang digunakan
oleh Peluncur
Sintaks untuk merujuk sumber daya di layout XML adalah seperti berikut:
@package_name:resource_type/resource_name
package_name adalah nama paket tempat sumber daya berada. Ini tidak diperlukan saat
merujuk sumber daya dari paket yang sama — yakni, yang disimpan di folder res proyek Anda.
resource_type adalah R subkelas untuk tipe sumber daya. Lihat Tipe Sumber Daya untuk
informasi selengkapnya tentang setiap tipe sumber daya dan cara merujuknya.
resource_name adalah nama file sumber daya tanpa ekstensi, atau nilai atribut android:name
di elemen XML.
Misalnya, pernyataan layout XML berikut menyetel atribut android:text ke sumber daya
string :
android:text="@string/button_label_toast"
resource_type adalah string.
resource_name adalah button_label_toast.
package_name tidak diperlukan karena sumber daya disimpan di proyek (dalam file strings.xml).
Contoh lainnya: pernyataan layout XML ini menyetel atribut android:background ke sumber
daya color , dan karena sumber daya didefinisikan di proyek (dalam file colors.xml),
package_name tidak ditetapkan:
android:background="@color/colorPrimary"
Dalam contoh berikut, pernyataan layout XML menyetel atribut android:textColor ke sumber
daya color . Akan tetapi, sumber daya tidak didefinisikan dalam proyek, melainkan disediakan
oleh Android, sehingga package_name android juga harus ditetapkan, yang diikuti dengan titik
dua:
android:textColor="@android:color/white"
Tip: Untuk informasi selengkapnya tentang mengakses sumber daya dari kode, lihat Mengakses
Sumber Daya. Untuk konstanta warna Android, lihat sumber daya R.color standar Android.
Menyimpan nilai sebagai string dan warna dalam file sumber daya terpisah mempermudah
pengelolaannya, terutama jika Anda menggunakannya lebih dari sekali di layout.
Misalnya, penting sekali menyimpan string dalam file sumber daya terpisah untuk
menerjemahkan dan melokalkan aplikasi, sehingga Anda bisa membuat file sumber daya string
untuk setiap bahasa tanpa mengubah kode. File sumber daya untuk gambar, warna, dimensi, dan
atribut lainnya berguna untuk mengembangkan aplikasi bagi orientasi dan ukuran layar
perangkat yang berbeda.
String
Sumber daya string berada dalam file strings.xml dalam folder values di dalam folder res saat
menggunakan Project: Tampilan Android. Anda bisa mengedit file ini secara langsung dengan
membukanya:
<resources>
<string name="app_name">Hello Toast</string>
<string name="button_label_count">Count</string>
<string name="button_label_toast">Toast</string>
<string name="count_initial_value">0</string>
</resources>
Di sini, name (misalnya, button_label_count) adalah nama sumber daya yang Anda gunakan
di kode XML, seperti dalam atribut berikut:
android:text="@string/button_label_count"
Nilai string name ini adalah kata (Count) yang dimasukkan dalam tag <string></string>
(Anda jangan menggunakan tanda kutip kecuali jika tanda kutip harus menjadi bagian dari nilai
string.)
Anda juga harus mengekstrak string hard-code dalam file layout XML ke sumber daya string.
Untuk mengekstrak string hard-code dalam layout XML, ikuti langkah-langkah ini (lihat
gambar):
1. Klik string hard-code, dan tekan Alt-Enter di Windows, atau Option-Return pada Mac OS X.
2. Pilih Extract string resource.
Selanjutnya Anda bisa menggunakan nama sumber daya di kode XML. Gunakan ekspresi
"@string/resource_name" (termasuk tanda kutip) untuk merujuk sumber daya string:
android:text="@string/button_label_count"
Warna
Sumber daya warna berada di file colors.xml dalam folder values di dalam folder res saat
menggunakan Project: Tampilan Android. Anda bisa mengedit file ini secara langsung:
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="myBackgroundColor">#FFF043</color>
</resources>
Di sini, name (misalnya, colorPrimary) adalah nama sumber daya yang Anda gunakan dalam
kode XML:
android:textColor="@color/colorPrimary"
Nilai warna name ini adalah nilai warna heksadesimal (#3F51B5) yang dimasukkan dalam tag
<color></color> . Nilai heksadesimal menetapkan nilai merah, hijau, dan biru (RGB). Nilai
selalu diawali dengan karakter pound (#), yang diikuti dengan informasi Alpha-Red-Green-Blue.
Misalnya, nilai heksadesimal hitam adalah #000000, sedangkan nilai heksadesimal untuk varian
biru langit adalah #559fe3. Nilai warna dasar dicantumkan dalam dokumentasi kelas Color.
Warna colorPrimary adalah salah satu warna dasar yang telah didefinisikan sebelumnya dan
digunakan untuk bilah aplikasi. Di aplikasi produksi, Anda bisa, misalnya, menyesuaikannya
agar sesuai dengan merek. Menggunakan warna dasar untuk elemen UI lainnya akan membuat
UI seragam.
Tip: Untuk spesifikasi desain material warna Android, lihat Gaya dan Menggunakan Tema
Material. Untuk nilai heksadesimal warna umum, lihat Kode Warna Heksadesimal. Untuk
konstanta warna Android, lihat sumber daya R.color standar Android.
Anda bisa melihat blok kecil pilihan warna di margin kiri di sebelah deklarasi sumber daya
warna di colors.xml, juga di margin kiri di sebelah atribut yang menggunakan nama sumber
Tip: Untuk melihat warna di munculan, aktifkan fitur dokumentasi Munculan otomatis. Pilih
Android Studio > Preferences > Editor > General > Code Completion, dan centang opsi
"Autopopup documentation in (ms)". Selanjutnya Anda bisa mengarahkan kursor ke atas nama
sumber daya warna untuk melihat warnanya.
Dimensi
Dimensi harus dipisahkan dari kode untuk mempermudah pengelolaannya, terutama jika Anda
perlu menyesuaikan layout untuk resolusi perangkat yang berbeda. Selain itu juga memudahkan
pengukuran yang konsisten untuk tampilan, dan untuk mengubah ukuran beberapa tampilan
dengan mengubah satu sumber daya dimensi.
Sumber daya dimensi berada di file dimens.xml dalam folder values di dalam folder res saat
menggunakan Project: Tampilan Android. dimens.xml yang ditampilkan di tampilan bisa
menjadi folder yang memiliki lebih dari satu file dimens.xml untuk resolusi perangkat yang
berbeda. Misalnya, aplikasi yang dibuat dari template Empty Activity menyediakan file
dimens.xml kedua untuk 820 dp.
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="my_view_width">300dp</dimen>
<dimen name="count_text_size">200sp</dimen>
<dimen name="counter_height">300dp</dimen>
</resources>
Di sini, name (misalnya, activity_horizontal_margin) adalah nama sumber daya yang Anda
gunakan di kode XML:
android:paddingLeft="@dimen/activity_horizontal_margin"
Nilai name ini adalah pengukuran (16dp) yang dimasukkan dalam tag <dimen></dimen> .
Anda bisa mengekstrak dimensi dengan cara yang sama seperti string:
1. Klik dimensi hard-code, dan tekan Alt-Enter di Windows, atau tekan Option-Return di Mac OS X.
2. Pilih Extract dimension resource.
Piksel yang tidak tergantung perangkat (dp) tidak tergantung resolusi layar. Misalnya, 10px (10
piksel tetap) akan terlihat sedikit lebih kecil pada layar yang beresolusi lebih tinggi, namun
Android akan menskalakan 10dp (10 piksel yang tidak tergantung perangkat) untuk melihat
langsung di layar resolusi berbeda. Ukuran teks juga bisa disetel untuk terlihat langsung di layar
resolusi berbeda dengan menggunakan ukuran piksel yang diskalakan (sp).
Tip: Untuk informasi selengkapnya tentang unit dp dan sp , lihat Mendukung Kepadatan
Berbeda.
Gaya
Gaya adalah sumber daya yang menetapkan atribut umum seperti tinggi, pengisi, warna font,
ukuran font, dan warna latar belakang. Gaya ditujukan untuk atribut yang memodifikasi rupa
tampilan.
Gaya didefinisikan di file styles.xml dalam folder values di dalam folder res saat menggunakan
Project: Tampilan Android. Anda bisa mengedit file ini secara langsung. Gaya dibahas dalam bab
berikutnya, bersama Spesifikasi Desain Material.
Android Studio mendefinisikan sumber daya lainnya yang dibahas dalam bab lain:
Gambar dan ikon. Folder drawable menyediakan sumber daya ikon dan gambar. Jika aplikasi
Anda tidak memiliki folder drawable, Anda bisa membuatnya di dalam folder res secara manual.
Untuk informasi selengkapnya tentang sumber daya dapat digambar, lihat Sumber Daya Dapat
Digambar di bagian Sumber Daya Aplikasi dari Panduan Developer Android.
Ikon yang dioptimalkan. Folder mipmap umumnya berisi kumpulan ikon aplikasi yang sudah
dihitung dan dioptimalkan, yang digunakan oleh Peluncur. Luaskan folder untuk melihat apakah
versi ikon disimpan sebagai sumber daya untuk kepadatan layar yang berbeda.
Menu. Anda bisa menggunakan file sumber daya XML untuk mendefinisikan item menu dan
menyimpannya di proyek dalam folder menu. Menu dijelaskan dalam bab berikutnya.
Pola model-view-presenter berguna untuk memahami cara merespons klik tampilan. Bila
kejadian terjadi bersama tampilan, kode presenter akan melakukan aksi yang memengaruhi kode
model. Agar pola ini berfungsi, Anda harus:
Menulis metode Java yang melakukan aksi khusus, yang ditentukan oleh logika kode model —
yakni tindakan yang bergantung pada hal yang Anda inginkan untuk dilakukan aplikasi bila
kejadian ini terjadi. Ini biasanya disebut sebagai penangan kejadian.
Mengaitkan metode penangan kejadian ini ke tampilan, sehingga metode berjalan bila kejadian
terjadi.
Atribut onClick
Android Studio menyediakan pintasan untuk mempersiapkan tampilan yang bisa diklik, dan
untuk mengaitkan penangan kejadian dengan tampilan: gunakan atribut android:onClick
bersama elemen tampilan yang bisa diklik di layout XML.
Misalnya, ekspresi XML berikut di file layout untuk serangkaian Button. showToast() sebagai
penangan kejadian:
android:onClick="showToast"
Bila tombol bdiketuk, atribut android:onClick -nya akan memanggil metode showToast() .
Tulis penangan kejadian, misalnya showToast() yang direferensikan dalam kode XML di atas,
untuk memanggil metode lain yang mengimplementasikan logika model aplikasi:
Agar dapat digunakan bersama atribut android:onClick , metode showToast() harus berupa
public, mengembalikan void, dan memerlukan parameter view agar dapat mengetahui tampilan
mana yang memanggil metode.
Android Studio menyediakan pintasan untuk membuat stub penangan kejadian (placeholder
untuk metode yang bisa Anda isi nanti) di kode Java untuk aktivitas yang terkait dengan layout
XML. Ikuti langkah-langkah ini:
1. Di dalam file layout XML (misalnya activity_main.xml), klik nama metode dalam pernyataan
atribut android:onClick .
2. Tekan Alt-Enter di Windows atau Option-Return di Mac OS X, dan pilih Create onClick event
handler.
3. Pilih aktivitas yang terkait dengan file layout (misalnya MainActivity) dan klik OK. Ini akan
membuat stub metode placeholder di MainActivity.java.
Memperbarui tampilan
Untuk memperbarui materi tampilan, misalnya mengganti teks di TextView, terlebih dahulu kode
Anda harus membuat instance objek dari tampilan. Selanjutnya kode Anda bisa memperbarui
objek, dengan demikian memperbarui tampilan.
Untuk merujuk tampilan dalam kode Anda, gunakan metode findViewById() kelas View, yang
akan mencari tampilan berdasarkan idsumber daya. Misalnya, pernyataan berikut menyetel
mShowCount menjadi TextView dengan show_countID sumber daya:
Dari poin ini, kode Anda bisa menggunakan mShowCount untuk menyatakan TextView, sehingga
bila Anda memperbarui mShowCount, tampilan akan diperbarui.
Misalnya, ketika tombol berikut dengan atribut android:onClick diketuk, onClick akan
memanggil metode countUp() :
android:onClick="countUp"
Karena Anda sudah mengaitkan mShowCount dengan TextView untuk menampilkan hitungan,
metode mShowCount.setText() memperbarui tampilan teks di layar.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dokumentasi Android Studio:
o Panduan Pengguna Android Studio
o Ringkasan UI
Desain Material:
o Gaya
Lainnya:
TextView
Tampilan bergulir
Praktik terkait
Ketahui selengkapnya
Bab ini menjelaskan salah satu tampilan yang paling sering digunakan di aplikasi: TextView,
yang menampilkan materi tekstual pada layar. TextView bisa digunakan untuk menampilkan
pesan, respons dari database, atau bahkan keseluruhan artikel bergaya majalah yang bisa digulir
pengguna. Bab ini juga menampilkan cara membuat tampilan bergulir untuk teks dan elemen
lainnya.
TextView
Satu tampilan yang mungkin sering Anda gunakan adalah kelas TextView, yang merupakan
subkelas dari kelas View yang menampilkan teks pada layar. Anda bisa menggunakan TextView
untuk tampilan berukuran apa pun, mulai dari karakter atau kata tunggal hingga teks selayar
penuh. Anda bisa menambahkan id sumber daya ke TextView dan mengontrol cara teks muncul
dengan menggunakan atribut di file layout XML.
Anda bisa merujuk tampilan TextView di kode Java dengan menggunakan idsumber dayanya,
dan memperbarui teks dari kode Anda. Jika Anda ingin memungkinkan pengguna mengedit teks,
gunakan EditText, subkelas TextView yang memungkinkan pengeditan dan masukan teks. Anda
mempelajari semua tentang EditText di bab lainnya.
Atribut TextView
android:text="Hello World!"
Anda bisa mengekstrak string teks ke dalam sumber daya string (mungkin disebut hello_world)
yang lebih mudah dikelola untuk versi aplikasi multibahasa, atau jika Anda perlu mengubah
string di lain waktu. Setelah mengekstrak string, gunakan nama sumber daya string dengan
@string/ untuk menetapkan teks:
android:text="@string/hello_world"
Atribut yang paling sering digunakan bersama TextView adalah sebagai berikut:
Misalnya, untuk menyetel atribut agar cocok dengan URL web, gunakan ini:
android:autoLink="web"
Dalam aplikasi yang mengakses artikel majalah atau koran, artikel yang muncul mungkin berasal
dari sumber online atau mungkin disimpan sebelumnya dalam database di perangkat. Anda juga
bisa membuat teks sebagai satu string panjang di sumber daya strings.xml.
Dalam kasus lain, teks bisa berisi tag HTML yang disematkan atau kode pemformatan teks
lainnya. Agar tampil dengan benar, tampilan teks harus diformat dengan aturan berikut:
Jika ada tanda apostrof (') di teks, Anda harus meloloskannya dengan mengawalinya
dengan backslash (\'). Jika menggunakan tanda kutip ganda dalam teks, Anda juga harus
meloloskannya (\"). Anda juga harus meloloskan karakter non-ASCII lainnya. Lihat
bagian "Memformat dan Menata Gaya" pada Sumber Daya String untuk detail
selengkapnya.
TextView mengabaikan semua tag HTML kecuali yang berikut ini:
o Penggunaan tag HTML dan </b> di sekitar kata yang harus ditulis tebal.
o Penggunaan tag HTML dan di sekitar kata yang harus ditulis miring. Akan tetapi
perhatikan, jika menggunakan apostrof keriting dalam frasa miring, Anda harus
menggantinya dengan apostrof tegak.
o Anda bisa mengombinasikan tebal dan miring dengan mengombinasikan tag,
seperti dalam ... kata...</i></b>.
Untuk membuat string teks panjang dalam file strings.xml, masukkan keseluruhan teks dalam
<string name="your_string_name"></string> di file strings.xml (your_string_name adalah
nama yang Anda berikan untuk sumber daya string, misalnya article_text).
Baris teks dalam file strings.xml tidak digulung ke baris berikutnya — melainkan memanjang
melebihi margin kanan. Ini adalah perilaku yang benar. Setiap baris teks baru yang dimulai dari
margin kiri menyatakan paragraf lengkap.
Masukkan \n untuk menyatakan akhir baris, dan \n lainnya untuk menyatakan baris kosong. Jika
Anda tidak menambahkan karakter penutup baris, paragraf akan saling bertabrakan saat
ditampilkan di layar.
Tip: Jika ingin melihat teks yang dibungkus dalam strings.xml, Anda bisa menekan Return atau
Enter untuk memasukkan akhiran ganti baris, atau memformat teks terlebih dahulu dalam editor
teks dengan akhiran ganti baris. Akhiran tidak akan ditampilkan di layar.
Untuk merujuk TextView di kode Java Anda, gunakan idsumber dayanya. Misalnya, untuk
memperbarui TextView dengan teks baru, Anda perlu:
Dalam hal ini, view_id adalah identifier sumber daya untuk tampilan:
Tampilan bergulir
Jika informasi yang ingin ditampilkan di aplikasi Anda lebih besar dari tampilan perangkat, Anda
bisa membuat tampilan bergulir yang bisa digulir pengguna secara vertikal dengan menggesek
ke atas atau ke bawah, atau secara horizontal dengan menggesek ke kanan atau ke kiri.
Anda biasanya akan menggunakan tampilan bergulir untuk kabar berita, artikel, atau teks
panjang lainnya yang tidak muat pada tampilan. Anda juga bisa menggunakan tampilan bergulir
untuk mengombinasikan tampilan (seperti TextView dan Button) dalam tampilan bergulir.
Meskipun Anda hanya bisa menempatkan satu tampilan anak di dalam ScrollView, tampilan anak
bisa menjadi grup tampilan dengan hierarki tampilan anak, seperti LinearLayout. Pilihan yang
bagus untuk tampilan dalam ScrollView adalah LinearLayout yang disusun dalam orientasi
vertikal.
Dengan ScrollView, semua tampilan Anda berada dalam memori dan dalam hierarki tampilan
sekalipun tidak ditampilkan di layar. Ini membuat ScrollView berguna untuk menggulir laman
teks berbentuk bebas dengan lancar, karena teks sudah ada di memori. Akan tetapi, ScrollView
bisa menggunakan banyak memori, yang bisa memengaruhi kinerja aplikasi lainnya.
Layout kompleks dengan ScrollView mungkin mengalami masalah kinerja, khususnya dengan
tampilan anak seperti gambar. Kami menyarankan agar Anda tidak menggunakan gambar
bersama ScrollView. Untuk menampilkan daftar panjang item, atau gambar, pertimbangkan
untuk menggunakan RecyclerView. Selain itu, menggunakan AsyncTask akan menyediakan cara
sederhana untuk melakukan pekerjaan di luar thread utama, seperti memuat gambar dalam thread
latar belakang, kemudian menerapkannya ke UI setelah selesai. AsyncTask dibahas di bab
lainnya.
Untuk menampilkan artikel majalah yang dapat digulir pada layar, Anda dapat menggunakan
RelativeLayout bagi layar yang menyertakan TextView terpisah untuk judul artikel, lainnya
untuk subjudul artikel, dan TextView ketiga untuk teks artikel bergulir (lihat gambar di bawah
ini), yang disetel dalam ScrollView. Satu-satunya bagian layar yang bergulir adalah ScrollView
dengan teks artikel.
Grup tampilan ScrollView hanya bisa berisi satu tampilan; akan tetapi, tampilan tersebut bisa
berupa grup tampilan yang berisi beberapa tampilan, misalnya LinearLayout. Anda bisa
menyarangkan grup tampilan seperti LinearLayout dalam grup tampilan ScrollView, sehingga
menggulir apa pun yang ada di dalam LinearLayout.
Misalnya, jika Anda ingin subjudul artikel digulir bersama dengan artikel meskipun berupa
TextView terpisah, Anda bisa menambahkan LinearLayout dalam ScrollView, dan memindahkan
TextView subjudul, bersama TextView artikel, ke dalam LinearLayout. Grup tampilan
LinearLayout menjadi tampilan anak tunggal dalam ScrollView seperti yang ditampilkan dalam
gambar di bawah ini, dan pengguna bisa menggulir keseluruhan grup tampilan tersebut: subjudul
dan artikel.
Karena ScrollView hanya mendukung pengguliran vertikal, Anda harus menyetel orientasi
LinearLayout ke vertikal (dengan menggunakan atribut android:orientation="vertical" ),
sehingga keseluruhan LinearLayout akan bergulir secara vertikal. Misalnya, layout XML berikut
menggulir TextView article bersama article_subheading TextView:
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/article_heading">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/article_subheading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_regular"
android:text="@string/article_subtitle"
android:textAppearance="@android:style/TextAppearance" />
<TextView
android:id="@+id/article"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:lineSpacingExtra="@dimen/line_spacing"
android:text="@string/article_text" />
</LinearLayout>
</ScrollView>
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dokumentasi Android Studio:
o Mengenal Android Studio
o ScrollView:
o Tampilan
o Layout Relatif
Desain Material:
o Gaya
Lainnya:
o Blog Developer Android: Linkify Teks Anda!
Bab ini menjelaskan sumber daya yang tersedia untuk developer Android, dan cara
menggunakannya.
developer.android.com
Laman beranda
Dokumentasi ini berisi banyak informasi yang terus diperbarui oleh Google. Untuk mulai
menjelajah, klik tautan berikut pada laman beranda:
Dapatkan Android Studio: Unduh Android Studio, lingkungan development terintegrasi
(IDE) resmi untuk membangun aplikasi Android.
Jelajahi kode contoh: Jelajahi pustaka kode contoh di GitHub untuk mengetahui cara
membangun komponen yang berbeda bagi aplikasi Anda. Klik kategori di kolom kiri
untuk menjelajahi contoh yang tersedia. Setiap contoh merupakan aplikasi Android yang
berfungsi penuh. Anda bisa menjelajahi sumber daya dan file sumber, serta melihat
struktur proyek keseluruhan. Salin dan tempel kode yang diperlukan, dan jika ingin
berbagi tautan ke baris tertentu, Anda bisa mengeklik dua kali untuk mendapatkan URL.
Untuk kode contoh lainnya, lihat "Menjelajahi contoh kode di Android SDK" di bab ini.
Saksikan cerita: Pelajari tentang developer Android lainnya, aplikasi, dan kesuksesan
mereka bersama Android dan Google Play. Laman tersebut menawarkan video dan artikel
berisi cerita terbaru tentang development Android, seperti cara developer memperbaiki
pengalaman penggunanya, dan cara meningkatkan interaksi pengguna dengan aplikasi.
Laman beranda juga menawarkan tautan bagi developer Android untuk pratinjau aplikasi bagi
versi Android terbaru, dan untuk bergabung dengan program developer Google Play:
Developer Console: Google Play Store adalah sistem distribusi digital Google untuk
aplikasi yang dikembangkan dengan Android SDK. Di laman Google Play Developer
Console, Anda bisa menerima Persetujuan Developer, membayar biaya pendaftaran, dan
melengkapi detail akun agar bisa bergabung dengan program developer Google Play.
Pratinjau: Buka laman pratinjau untuk versi Android terbaru guna menguji
kompatibilitas aplikasi Anda, dan memanfaatkan fitur baru seperti pintasan aplikasi,
dukungan keyboard gambar, ikon melingkar, dan sebagainya.
Android, Wear, TV, dan Auto: Pelajari tentang Android versi terbaru untuk ponsel
cerdas dan tablet, perangkat yang dapat dikenakan, televisi, dan mobil otomatis.
Unduh Android Studio: Unduh Android Studio untuk sistem operasi komputer yang
Anda gunakan saat ini.
Baca dokumentasi: Jelajahi dokumentasi Android Studio.
Lihat catatan rilis: Baca catatan rilis untuk Android Studio versi terbaru.
Fitur: Pelajari tentang fitur Android Studio versi terbaru.
Terbaru: Baca berita tentang Android Studio.
Sumber Daya: Baca artikel tentang penggunaan Android Studio, termasuk pengantar
dasar.
Video: Tonton tutorial video tentang penggunaan Android Studio.
Opsi Unduhan: Unduh versi Android Studio untuk sistem operasi berbeda dari yang
Anda gunakan.
Berikut ini adalah tautan ke dokumentasi Android Studio yang berguna untuk pelatihan ini:
Dokumentasi Android bisa diakses melalui tautan berikut dari laman beranda:
Desain: Bagian ini mencakup Desain Material yang merupakan filosofi desain konseptual
yang membahas bagaimana seharusnya tampilan dan cara kerja aplikasi pada perangkat
seluler. Gunakan tautan berikut untuk mengetahui selengkapnya:
o Memperkenalkan desain material: Pengantar filosofi desain material.
o Gulir ke bawah laman Design untuk tautan ke sumber daya seperti video,
template, font, dan palet warna.
o Berikut ini adalah tautan ke bagian Design yang berguna untuk pelatihan ini:
Pengantar Android
Daftar Istilah Kosakata
Arsitektur Platform
Dasar-Dasar Aplikasi Android
Ringkasan UI
Versi Platform
Pustaka Dukungan Android
Bekerja dengan Izin Sistem
o Praktik development:
Pustaka Dukungan
Sumber daya R.color standar Android
Sumber Daya Aplikasi
Distribusikan: Bagian ini menyediakan informasi tentang segala sesuatu yang terjadi
setelah Anda menulis aplikasi: menaruhnya di Play Store, menumbuhkan basis pengguna,
dan menghasilkan uang.
o Google Play
o Hal-hal Penting untuk Keberhasilan Aplikasi
Untuk mengakses dokumentasi bahkan saat Anda tidak terhubung ke internet, pasang
dokumentasi Software Development Kit (SDK) dengan menggunakan SDK Manager. Ikuti
langkah-langkah ini:
4. Klik tab SDK Tools. Anda bisa memasang SDK Tools tambahan yang tidak dipasang
secara default, serta versi offline dokumentasi developer Android.
5. Klik kotak centang untuk "Documentation for Android SDK" jika belum dipasang, dan
klik Apply.
6. Bila pemasangan selesai, klik Finish.
7. Arahkan ke direktori sdk yang disalin di atas, dan buka direktori docs.
8. Cari index.html dan buka.
Setiap template akan memasukkan aktivitas kerangka dan antarmuka pengguna. Pilih template
aktivitas untuk aktivitas utama saat memulai proyek aplikasi. Anda juga bisa menambahkan
template aktivitas ke proyek yang ada. Klik-kanan folder java di Project: Tampilan Android dan
pilih New > Activity > Gallery.
Menjelajahi blog developer Android
Blog Developer Android menyediakan banyak artikel mengenai development Android.
Pelatihan Developer Google: Bila Anda masih baru dalam hal pemrograman atau
seorang developer berpengalaman, Google menawarkan beragam kursus online untuk
mengajarkan development Android, mulai dari awal hingga mengoptimalkan kinerja
aplikasi. Klik tab Android di bagian atas laman.
Google I/O Codelabs: Google Developers Codelabs menyediakan pengalaman
pengkodean langsung yang dipandu pada sejumlah topik. Sebagian besar codelab akan
memandu Anda dalam proses pembangunan aplikasi kecil, atau menambahkan fitur baru
ke aplikasi yang ada. Pilih Android dari menu tarik-turun Category di sisi kanan laman.
Codelab Pengujian Android: Codelab ini menampilkan cara memulai pengujian untuk
Android, termasuk menguji integrasi di Android Studio, pengujian unit, pengujian
hermetik, pengujian antarmuka pengguna fungsional, dan kerangka kerja pengujian
Espresso.
Blog Pengujian Google: Blog ini difokuskan pada pengujian kode. Entri blog yang
dirujuk dalam pelatihan ini antara lain:
o Pengujian Otomatis untuk UI Android
o Ukuran Pengujian
Stack Overflow: Stack Overflow adalah komunitas jutaan programmer yang saling
membantu. Jika Anda mengalami masalah, kemungkinan orang lain sudah mengeposkan
jawabannya pada forum ini. Contoh yang dirujuk dalam pelatihan ini antara lain:
o Bagaimana menyatakan di dalam RecyclerView di Espresso?
Google di GitHub: GitHub adalah layanan hosting repositori. Layanan ini menawarkan
semua kontrol versi yang didistribusikan dan fungsionalitas pengelolaan kode sumber
(SCM) Git serta menambahkan fiturnya sendiri. Git adalah sistem kontrol versi yang
digunakan secara luas untuk development perangkat lunak. Yang berikut ini ditampung
dalam GitHub dan dirujuk di pelatihan ini:
o Contoh Pengujian Android
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Pengantar
Tentang aktivitas
Membuat aktivitas
Tentang maksud
Memulai aktivitas dengan maksud eksplisit
Meneruskan data antara aktivitas dengan maksud
Mendapatkan data kembali dari aktivitas
Navigasi aktivitas
Praktik terkait
Ketahui selengkapnya
Dalam bab ini Anda akan mempelajari tentang aktivitas, blok pembangunan utama antarmuka
pengguna aplikasi, serta penggunaan maksud untuk berkomunikasi di antara aktivitas.
Tentang aktivitas
Aktivitas menyatakan layar tunggal di aplikasi Anda dengan antarmuka yang bisa digunakan
pengguna untuk berinteraksi. Misalnya, aplikasi email mungkin memiliki satu aktivitas yang
menampilkan daftar email baru, aktivitas lain untuk menulis email, dan aktivitas lainnya lagi
untuk membaca pesan satu per satu. Aplikasi Anda adalah koleksi aktivitas yang dibuat sendiri
atau yang digunakan kembali dari aplikasi lain.
Meskipun aktivitas di aplikasi Anda bekerja sama membentuk pengalaman pengguna yang
kohesif di aplikasi, setiap aplikasi tidak saling bergantung. Proses ini memungkinkan aplikasi
memulai aktivitas di aplikasi lainnya, dan aplikasi lainnya bisa memulai aktivitas Anda (jika
aplikasi mengizinkannya). Misalnya, aplikasi perpesanan yang Anda tulis bisa memulai aktivitas
di aplikasi kamera untuk mengambil gambar, kemudian memulai aktivitas di aplikasi email
untuk memungkinkan pengguna berbagi gambar itu di email.
Umumnya, satu aktivitas di aplikasi ditetapkan sebagai aktivitas "utama", yang disajikan kepada
pengguna saat membuka aplikasi untuk pertama kali. Kemudian setiap aktivitas bisa memulai
aktivitas lainnya untuk melakukan tindakan yang berbeda.
Setiap kali aktivitas baru dimulai, aktivitas sebelumnya akan dihentikan, namun sistem
mempertahankan aktivitas dalam tumpukan ("back-stack"). Bila pengguna selesai dengan
aktivitas saat ini dan menekan tombol Kembali, aktivitas akan muncul dari tumpukan (dan
dimusnahkan) dan aktivitas sebelumnya dilanjutkan.
Bila aktivitas dihentikan karena aktivitas baru dimulai, aktivitas pertama akan diberi tahu tentang
perubahan tersebut dengan metode callback daur hidup aktivitas. Daur hidup Aktivitas adalah
serangkaian keadaan aktivitas, mulai dari pertama kali dibuat, hingga setiap kali dihentikan atau
dilanjutkan, hingga bila sistem memusnahkannya. Anda akan mengetahui selengkapnya tentang
daur hidup aktivitas di bab berikutnya.
Membuat aktivitas
Untuk mengimplementasikan aktivitas di aplikasi Anda, lakukan yang berikut ini:
Bila Anda membuat proyek baru untuk aplikasi atau menambahkan aktivitas baru ke aplikasi, di
Android Studio (dengan File > New > Activity), kode template untuk setiap tugas ini akan
disediakan untuk Anda.
Aktivitas adalah subkelas dari kelas Activity atau salah satu dari subkelasnya. Jika Anda
membuat proyek baru di Android Studio, aktivitas tersebut secara default menjadi subkelas dari
kelas AppCompatActivity. Kelas AppCompatActivity adalah subkelas Activity yang
memungkinkan Anda menggunakan fitur aplikasi Android terbaru seperti bilah aksi dan desain
material, sementara tetap memungkinkan aplikasi tersebut kompatibel dengan perangkat yang
menjalankan Android versi lama.
Tugas pertama Anda di subkelas aktivitas adalah mengimplementasikan metode callback daur
hidup aktivitas standar (seperti OnCreate()) untuk menangani perubahan keadaan aktivitas.
Perubahan keadaan ini meliputi hal-hal seperti kapan aktivitas dibuat, dihentikan, dilanjutkan,
atau dimusnahkan. Anda akan mengetahui selengkapnya tentang daur hidup aktivitas dan
callback daur hidup di bab berikutnya.
Salah satu callback yang diperlukan dan harus diimplementasikan oleh aplikasi Anda adalah
metode onCreate(). Sistem memanggil metode ini bila membuat aktivitas, dan semua komponen
penting aktivitas Anda harus melakukan diinisialisasi di sini. Yang paling penting, metode
OnCreate() memanggil setContentView() untuk membuat layout utama aktivitas.
Anda biasanya mendefinisikan antarmuka pengguna untuk aktivitas di satu atau beberapa file
layout XML. Bila metode setContentView() dipanggil dengan jalur ke file layout, sistem akan
membuat semua tampilan awal dari layout yang ditetapkan dan menambahkannya ke aktivitas
Anda. Hal ini sering kali disebut sebagai memekarkan layout.
Sering kali Anda mungkin juga ingin mengimplementasikan metode onPause() di kelas aktivitas.
Sistem memanggil metode ini sebagai indikasi pertama bahwa pengguna meninggalkan aktivitas
Anda (walaupun tidak selalu berarti aktivitas akan dimusnahkan). Di sinilah biasanya Anda harus
mengikat perubahan yang harus dipertahankan di luar sesi pengguna saat ini (karena pengguna
mungkin tidak akan kembali). Anda akan mengetahui selengkapnya tentang callback onPause()
dan semua callback daur hidup lainnya di bab berikutnya.
Selain daur hidup callback, Anda juga bisa mengimplementasikan metode di aktivitas untuk
menangani perilaku lainnya seperti masukan pengguna atau klik tombol.
Antarmuka pengguna untuk aktivitas disediakan menurut hierarki tampilan, yang mengontrol
ruang tertentu dalam jendela aktivitas dan bisa merespons interaksi pengguna.
Cara yang paling umum untuk mendefinisikan antarmuka pengguna yang menggunakan tampilan
adalah dengan file layout XML yang disimpan sebagai bagian dari sumber daya aplikasi Anda.
Mendefinisikan layout di XML memungkinkan Anda untuk mengelola desain antarmuka
pengguna secara terpisah dari kode sumber yang mendefinisikan perilaku aktivitas.
Anda juga bisa membuat tampilan baru secara langsung di kode aktivitas Anda dengan
menyisipkan objek tampilan baru ke dalam ViewGroup, kemudian meneruskan ViewGroup akar
ke setContentView(). Setelah layout dimekarkan -- apa pun sumbernya -- Anda bisa
menambahkan lebih banyak tampilan di Java di mana saja dalam hierarki tampilan.
Setiap aktivitas di aplikasi Anda harus dideklarasikan di manifes aplikasi Android bersama
elemen <activity> , di dalam <application>. Bila Anda membuat proyek baru atau
menambahkan aktivitas baru ke proyek di Android Studio, manifes akan dibuat atau diperbarui
untuk menyertakan deklarasi aktivitas kerangka bagi setiap aktivitas. Inilah deklarasi untuk
aktivitas utama.
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Elemen <activity> juga bisa menyertakan deklarasi untuk filter maksud. Filter maksud
menetapkan jenis maksud yang akan diterima aktivitas Anda.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Filter maksud harus menyertakan setidaknya satu elemen, dan juga bisa menyertakan sebuah dan
opsional. Aktivitas utama untuk aplikasi Anda memerlukan filter maksud yang mendefinisikan
aksi "main" dan kategori "launcher" agar sistem bisa meluncurkan aplikasi. Android Studio
membuat filter maksud ini untuk aktivitas utama di proyek Anda:
Elemen menetapkan bahwa ini adalah titik masuk "utama" ke aplikasi. Elemen menetapkan
bahwa aktivitas ini harus tercantum dalam peluncur aplikasi sistem (untuk memungkinkan
pengguna meluncurkan aktivitas ini).
Aktivitas lain di aplikasi Anda juga bisa mendeklarasikan filter maksud, namun hanya aktivitas
utama yang harus menyertakan aksi "utama". Anda akan mengetahui selengkapnya tentang
maksud implisit dan filter maksud dalam bab berikutnya.
Aktivitas utama untuk aplikasi Anda dan file layout terkait disertakan bersama proyek bila Anda
membuatnya. Anda bisa menambahkan aktivitas baru ke proyek di Android Studio dengan menu
File > New > Activity. Pilih template aktivitas yang ingin Anda gunakan, atau buka Gallery
untuk melihat semua template yang tersedia.
Bila memilih sebuah template aktivitas, Anda akan melihat serangkaian layar yang sama untuk
membuat aktivitas baru yang dilakukan saat membuat proyek di awal. Android Studio
menyediakan tiga hal ini untuk setiap aktivitas baru di aplikasi Anda:
File Java untuk aktivitas baru dengan definisi kelas kerangka dan metode onCreate().
Aktivitas baru, seperti aktivitas utama, adalah subkelas AppCompatActivity.
File XML yang berisi layout untuk aktivitas baru. Perhatikan, metode setContentView()
di kelas aktivitas akan memerkarkan layout baru ini.
Elemen <activity> tambahan di manifes Android yang menetapkan aktivitas baru.
Definisi aktivitas kedua tidak menyertakan filter maksud apa pun. Jika Anda ingin
menggunakan aktivitas ini hanya dalam aplikasi (dan tidak memungkinkan aktivitas
tersebut dimulai oleh aplikasi lain), maka tidak perlu menambahkan filter.
Tentang maksud
Semua aktivitas Android dimulai atau diaktifkan dengan maksud. Maksud adalah objek pesan
yang membuat permintaan yang akan digunakan oleh waktu proses Android untuk memulai
aktivitas atau komponen aplikasi lainnya di aplikasi Anda atau di beberapa aplikasi lainnya.
Anda tidak bisa memulai aktivitas itu sendiri;
Bila aplikasi pertama kali dimulai dari layar utama perangkat, waktu proses Android akan
mengirimkan maksud ke aplikasi Anda untuk memulai aktivitas utama aplikasi (yang
didefinisikan dengan aksi MAIN dan kategori LAUNCHER di Manifes Android). Untuk
memulai aktivitas lain di aplikasi Anda, atau meminta tindakan untuk dilakukan oleh beberapa
aktivitas lain yang tersedia di perangkat, bangunlah maksud sendiri dengan kelas Intent dan
panggil metode startActivity() untuk mengirim maksud itu.
Selain untuk memulai aktivitas, maksud juga digunakan untuk meneruskan data di antara
aktivitas. Bila membuat maksud untuk memulai aktivitas baru, Anda bisa menyertakan informasi
tentang data yang diinginkan untuk mengoperasikan aktivitas baru itu. Jadi, misalnya, aktivitas
email yang menampilkan daftar pesan bisa mengirim maksud ke aktivitas yang menampilkan
pesan itu. Aktivitas tampilan memerlukan data tentang pesan yang akan ditampilkan, dan Anda
bisa menyertakan data itu di maksud.
Dalam bab ini, Anda akan mempelajari tentang penggunaan maksud bersama aktivitas, namun
maksud juga digunakan untuk memulai layanan dan penerima siaran. Anda akan mempelajari
tentang kedua komponen aplikasi itu nanti di buku ini.
Tipe maksud
Maksud eksplisit menetapkan aktivitas penerima (atau komponen lainnya) melalui nama
kelas yang benar-benar memenuhi syarat di aktivitas tersebut. Gunakan maksud eksplisit
untuk memulai komponen di aplikasi milik sendiri (misalnya, untuk beralih layar di
antarmuka pengguna), karena Anda sudah mengetahui paket dan nama kelas komponen
itu.
Maksud implisit tidak menetapkan aktivitas tertentu atau komponen lainnya untuk
menerima maksud. Sebagai gantinya, Anda mendeklarasikan aksi umum yang dilakukan
di maksud tersebut. Sistem Android mencocokkan permintaan Anda dengan aktivitas atau
komponen lainnya yang bisa menangani aksi permintaan tersebut. Anda akan mengetahui
selengkapnya tentang maksud implisit dalam bab berikutnya.
Objek Intent adalah instance kelas Intent. Untuk maksud eksplisit, bidang kunci suatu maksud
menyertakan yang berikut ini:
Kelas aktivitas (untuk maksud eksplisit). Ini adalah nama kelas aktivitas atau komponen
lainnya yang akan menerima maksud, misalnya, com.example.SampleActivity.class.
Gunakan konstruktor maksud atau metode setComponent(), setComponentName() atau
setClassName() maksud untuk menetapkan kelas.
Data maksud. Bidang data maksud berisi referensi ke data yang Anda inginkan untuk
mengoperasikan aktivitas penerima, sebagai objek Uri.
Ekstra maksud. Ini adalah pasangan nilai-kunci yang membawa informasi yang
diperlukan aktivitas penerima untuk melakukan aksi yang diminta.
Flag maksud. Ini adalah bit metadata tambahan, yang didefinisikan oleh kelas Intent.
Flag dapat menginstruksikan sistem Android tentang cara meluncurkan aktivitas atau cara
memperlakukan aktivitas setelah diluncurkan.
Untuk maksud implisit, Anda juga mungkin perlu mendefinisikan kategori dan aksi maksud.
Anda akan mengetahui selengkapnya tentang kategori dan aksi maksud di bagian 2.3.
Misalnya, jika Anda ingin memulai ShowMessageActivity untuk menampilkan pesan tertentu di
aplikasi email, gunakan kode seperti ini.
Konteks aplikasi. Dalam contoh ini, kelas aktivitas menyediakan materi (di sini, this).
Komponen tertentu untuk dimulai (ShowMessageActivity.class).
Gunakan metode startActivity() bersama objek maksud baru sebagai satu-satunya argumen.
Metode startActivity() mengirim maksud ke sistem Android, yang meluncurkan kelas
ShowMessageActivity atas nama aplikasi Anda. Aktivitas baru muncul pada layar dan aktivitas
pembuatnya dihentikan sementara.
Aktivitas yang dimulai tetap pada layar hingga pengguna mengetuk tombol kembali pada
perangkat, pada saat itu aktivitas ditutup dan diklaim kembali oleh sistem, dan aktivitas yang
menghasilkannya akan dilanjutkan. Anda juga bisa menutup aktivitas yang dimulai secara
manual sebagai respons terhadap aksi pengguna (seperti klik tombol) dengan metode finish():
Anda bisa menggunakan data maksud dan ekstra maksud untuk meneruskan data di antara
aktivitas. Ada sejumlah perbedaan utama antara data dan ekstra yang menentukan mana yang
harus Anda gunakan.
Data maksud hanya bisa menyimpan satu bagian informasi. URI yang menyatakan lokasi data
yang ingin Anda gunakan untuk mengoperasikan. URI tersebut bisa berupa URL laman web
(http://), nomor telepon (tel://), lokasi geografis (geo://), atau URI khusus lainnya yang Anda
definisikan.
Ekstra maksud adalah untuk data arbitrer lainnya yang ingin Anda teruskan ke aktivitas yang
telah dimulai. Ekstra maksud disimpan di objek Bundle sebagai pasangan kunci dan nilai.
Bundle adalah peta, yang dioptimalkan untuk Android, dengan tombol berupa string, dan nilai-
nilainya bisa berupa tipe objek atau primitif apa pun (objek harus mengimplementasikan
antarmuka Parcelable). Untuk memasukkan data ke dalam ekstra maksud, Anda bisa
menggunakan salah satu metode putExtra() kelas Intent, atau membuat bundel sendiri dan
memasukkannya ke dalam maksud dengan putExtras().
Jika Anda ingin meneruskan lebih dari satu bagian informasi ke aktivitas yang telah
dimulai.
Jika informasi yang ingin Anda teruskan tidak bisa dinyatakan melalui URI.
Data dan ekstra maksud tidak eksklusif; Anda bisa menggunakan data URI dan ekstra untuk
informasi tambahan yang diperlukan aktivitas yang dimulai untuk memproses data dalam URI
itu.
Untuk menambahkan data ke maksud eksplisit dari aktivitas pembuatnya, buat objek maksud
seperti yang Anda lakukan sebelumnya:
Gunakan metode setData() bersama objek Uri untuk menambahkan URI itu ke maksud.
Beberapa contoh penggunaan setData() bersama URI:
Perlu diingat bahwa bidang data hanya bisa berisi URI tunggal; jika Anda memanggil setData()
beberapa kali, hanya nilai terakhir yang akan digunakan. Gunakan ekstra maksud untuk
menyertakan informasi tambahan (termasuk URI.)
Setelah menambahkan data, Anda bisa memulai aktivitas dengan maksud seperti biasanya.
startActivity(messageIntent);
Tambahkan ekstra ke maksud
1. Tentukan kunci yang akan digunakan untuk informasi yang ingin dimasukkan ke dalam
ekstra, atau definisikan sendiri. Setiap bagian informasi memerlukan kunci unik.
2. Gunakan metode putExtra() untuk menambahkan pasangan kunci/nilai ke ekstra maksud.
Secara opsional Anda bisa membuat objek Bundle, menambahkan data ke bundel,
kemudian menambahkan bundel ke maksud.
Kelas Intent menyertakan sejumlah kunci ekstra maksud yang bisa digunakan, didefinisikan
sebagai konstanta yang dimulai dengan kata EXTRA_. Misalnya, Anda bisa menggunakan
Intent.EXTRA_EMAIL untuk menunjukkan larik alamat email (sebagai string), atau
Intent.EXTRA_REFERRER untuk menetapkan informasi tentang aktivitas pembuat yang
mengirim maksud tersebut.
Anda juga bisa mendefinisikan kunci ekstra maksud milik sendiri. Secara konvensional Anda
mendefinisikan kunci ekstra maksud sebagai variabel-variabel statis dengan nama yang dimulai
kata EXTRA_. Untuk menjamin kunci tersebut unik, nilai string kunci itu sendiri harus diawali
dengan nama kelas yang benar-benar memenuhi syarat aplikasi. Misalnya:
Gunakan metode putExtra() bersama kunci untuk memasukkan data ke dalam ekstra maksud.
Kelas Intent mendefinisikan banyak metode putExtra() untuk jenis data yang berbeda:
Atau, Anda bisa membuat bundel baru dan mengisinya dengan ekstra maksud. Bundel
mendefinisikan banyak metode "put" untuk jenis data primitif yang berbeda serta objek yang
mengimplementasikan antarmuka Parcelable Android atau Serializable Java.
Setelah Anda mengisi bundel tersebut, tambahkan ke maksud dengan metode putExtras()
(perhatikan "s" di Extras):
messageIntent.putExtras(extras);
startActivity(messageIntent);
Bila Anda memulai aktivitas bersama maksud, aktivitas yang telah dimulai akan memiliki akses
ke maksud dan data yang dimuatnya.
Untuk mengambil maksud yang digunakan untuk memulai aktivitas (atau komponen lain),
gunakan metode getIntent():
Untuk mendapatkan ekstra dari maksud, Anda perlu mengetahui kunci untuk pasangan
kunci/nilai. Anda bisa menggunakan ekstra Intent standar jika telah menggunakannya, atau bisa
menggunakan kunci yang didefinisikan di aktivitas pembuatnya (jika didefinisikan sebagai
publik.)
Gunakan salah satu metode getExtra() untuk mengekstrak data ekstra dari objek maksud:
Atau Anda bisa mendapatkan seluruh bundel ekstra dari maksud dan mengekstrak nilai dengan
beragam metode Bundle:
Kadang-kadang bila mengirim data ke aktivitas bersama sebuah maksud, Anda juga ingin
mendapatkan kembali data dari maksud itu. Misalnya, Anda mungkin memulai aktivitas galeri
foto yang memungkinkan pengguna memilih foto. Dalam hal ini aktivitas asli Anda perlu
menerima informasi tentang foto yang dipilih pengguna dari aktivitas yang diluncurkan.
Untuk meluncurkan aktivitas baru dan mendapatkan kembali hasilnya, lakukan langkah-langkah
berikut di aktivitas pembuatnya:
Untuk mendapatkan kembali data dari aktivitas yang diluncurkan, mulailah aktivitas itu bersama
metode startActivityForResult() sebagai ganti startActivity().
startActivityForResult(messageIntent, TEXT_REQUEST);
Kode permintaan adalah integer yang mengidentifikasi permintaan dan bisa digunakan untuk
membedakan hasil bila Anda memproses data yang dikembalikan. Misalnya, jika meluncurkan
satu aktivitas untuk mengambil foto dan aktivitas lain untuk memilih foto dari galeri, Anda akan
memerlukan kode permintaan yang berbeda untuk mengidentifikasi permintaan yang menjadi
pemilik data yang dikembalikan.
Data respons dari aktivitas yang diluncurkan kembali ke aktivitas pembuatnya akan dikirim
dalam maksud, baik dalam data maupun ekstra. Anda membentuk maksud yang dikembalikan ini
dan memasukkan data ke dalamnya menggunakan cara yang sangat mirip dengan yang Anda
lakukan untuk maksud yang mengirimnya. Biasanya aktivitas yang diluncurkan akan memiliki
metode onClick atau metode callback masukan pengguna lain yang Anda gunakan untuk
memproses aksi pengguna dan menutup aktivitas. Di sini juga Anda membentuk respons.
Untuk mengembalikan data dari aktivitas yang diluncurkan, buat objek maksud kosong yang
baru.
Maksud hasil yang dikembalikan tidak memerlukan kelas atau nama komponen berakhir di
tempat yang tepat. Sistem Android akan mengarahkan respons kembali ke aktivitas pembuatnya
untuk Anda.
Tambahkan data atau ekstra ke maksud dengan cara sama seperti yang Anda lakukan pada
maksud asal. Anda mungkin perlu mendefinisikan kunci untuk ekstra maksud yang dikembalikan
pada awal kelas.
Selanjutnya masukkan data yang dikembalikan ke maksud seperti biasa. Di sini, pesan yang
dikembalikan adalah ekstra maksud dengan kunci EXTRA_RETURN_MESSAGE.
messageIntent.putExtra(EXTRA_RETURN_MESSAGE, mMessage);
Gunakan metode setResult() bersama kode respons dan maksud dengan data respons:
setResult(RESULT_OK,replyIntent);
Terakhir, panggil finish() untuk menutup aktivitas dan melanjutkan aktivitas pembuatnya:
finish();
if (requestCode == TEXT_REQUEST) {
if (resultCode == RESULT_OK) {
String reply =
data.getStringExtra(SecondActivity.EXTRA_RETURN_MESSAGE);
// process data
}
}
}
Tiga argumen untuk onActivityResult() berisi semua informasi yang Anda perlukan untuk
menangani data yang dikembalikan.
Kode permintaan. Kode permintaan yang Anda setel saat meluncurkan aktivitas
bersama startActivityForResult(). Jika Anda meluncurkan aktivitas yang berbeda untuk
melakukan operasi yang berbeda, gunakan kode ini untuk mengidentifikasi data tertentu
yang Anda dapatkan kembali.
Kode hasil: kode hasil yang disetel di aktivitas yang diluncurkan, biasanya salah satu
dari RESULT_OK atau RESULT_CANCELED.
Data maksud. maksud berisi data yang dikembalikan dari aktivitas peluncur.
Metode contoh yang ditampilkan di atas menampilkan logika tipikal untuk menangani kode
permintaan dan kode respons. Pengujian pertama adalah untuk permintaan TEXT_REQUEST,
dan bahwa hasilnya adalah berhasil. Di dalam isi pengujian itu, ekstrak informasi yang
dikembalikan dari maksud. Gunakan getData() untuk mendapatkan data maksud, atau getExtra()
untuk mengambil nilai dari ekstra maksud bersama kunci tertentu.
Navigasi aktivitas
Setiap aplikasi dengan kompleksitas apa pun yang Anda bangun akan menyertakan beberapa
aktivitas, baik yang didesain dan diimplementasikan oleh Anda, maupun yang berpotensi di
aplikasi lain. Karena pengguna Anda berpindah-pindah dalam aplikasi dan di antara aktivitas,
navigasi yang konsisten menjadi semakin penting untuk pengalaman pengguna aplikasi.
Beberapa hal lebih mengganggu pengguna daripada navigasi dasar yang berperilaku tidak
konsisten dan tak terduga. Mendesain navigasi aplikasi Anda dengan bijak akan membuat
penggunaan aplikasi tersebut bisa diprediksi dan bisa diandalkan pengguna.
Sistem Android mendukung dua bentuk strategi navigasi yang berbeda untuk aplikasi Anda.
Navigasi Sementara atau Kembali, yang disediakan melalui tombol kembali di perangkat,
dan back-stack.
Navigasi leluhur, atau Naik, yang disediakan oleh Anda sebagai opsi di bilah aksi
aplikasi.
Back-stack adalah serangkaian aktivitas yang telah dikunjungi pengguna dan bisa dikunjungi
kembali oleh pengguna dengan tombol kembali. Setiap kali aktivitas baru dimulai, aktivitas akan
didorong ke back-stack dan mengambil fokus pengguna. Aktivitas sebelumnya akan dihentikan,
namun tetap tersedia di back-stack. Back-stack beroperasi berdasarkan mekanisme "masuk
terakhir, keluar pertama", jadi bila pengguna selesai dengan aktivitas saat ini dan menekan
tombol Kembali, aktivitas tersebut akan dimunculkan dari tumpukan (serta dimusnahkan) dan
aktivitas sebelumnya dilanjutkan.
Karena aplikasi bisa memulai aktivitas baik di dalam maupun di luar satu aplikasi, back-stack
berisi semua aktivitas yang telah diluncurkan oleh pengguna dalam urutan terbalik. Setiap kali
pengguna menekan tombol Kembali, setiap aktivitas di tumpukan akan dimunculkan untuk
membuka aktivitas sebelumnya, hingga pengguna kembali ke layar Utama.
Android menyediakan back-stack untuk setiap tugas. Tugas adalah konsep penyusunan semua
aktivitas yang berinteraksi dengan pengguna saat melakukan operasi, baik di dalam aplikasi
maupun di beberapa aplikasi. Sebagian besar tugas dimulai dari layar utama Android, dan
mengetuk ikon aplikasi akan memulai tugas (serta back-stack baru) untuk aplikasi itu. Jika
pengguna menggunakan aplikasi sebentar, mengetuk beranda, dan memulai aplikasi, aplikasi
baru itu akan diluncurkan di tugasnya sendiri dan memiliki back-stack sendiri. Jika pengguna
kembali ke aplikasi pertama, back-stack tugas pertama akan kembali. Menyusuri dengan tombol
kembali hanya akan mengembalikan ke aktivitas di tugas saat ini, bukan untuk semua tugas yang
berjalan pada perangkat. Android memungkinkan pengguna menyusuri berbagai tugas bersama
ringkasan atau layar tugas saat ini, yang bisa diakses dengan tombol segi empat di sudut kanan
bawah perangkat .
Dalam sebagian besar kasus, Anda tidak perlu khawatir tentang pengelolaan tugas atau back-
stack untuk aplikasi—sistem terus melacak hal ini untuk Anda, dan tombol kembali selalu
tersedia pada perangkat.
Akan tetapi, mungkin ada saatnya Anda ingin mengganti perilaku default untuk tugas atau untuk
back-stack. Misalnya, jika layar Anda berisi browser web yang disematkan yang memungkinkan
pengguna menyusuri laman web, Anda mungkin ingin menggunakan perilaku kembali default di
browser bila pengguna menekan tombol Kembali di perangkat, daripada mengembalikan ke
aktivitas sebelumnya. Anda mungkin juga perlu mengubah perilaku default aplikasi dalam kasus
khusus lainnya seperti pada notifikasi atau widget, sehingga aktivitas yang berada jauh di dalam
aplikasi Anda mungkin diluncurkan sebagai tugasnya sendiri, tanpa back-stack sama sekali.
Anda akan mengetahui selengkapnya tentang pengelolaan tugas dan back-stack di bagian
berikutnya.
Navigasi naik
Navigasi naik, kadang-kadang disebut sebagai navigasi leluhur atau logis, digunakan untuk
navigasi dalam aplikasi berdasarkan hubungan hierarki eksplisit di antara layar. Dengan navigasi
naik, aktivitas Anda disusun dalam suatu hierarki, dan aktivitas "anak" menampilkan panah
hadap-kiri di bilah aksi yang mengembalikan pengguna ke aktivitas "induk". Aktivitas teratas
di hierarki biasanya adalah aktivitas utama Anda, dan pengguna tidak bisa naik lagi dari sana.
Misalnya, jika aktivitas utama di aplikasi email adalah daftar semua pesan, memilih sebuah
pesan akan meluncurkan aktivitas kedua untuk menampilkan satu email itu. Dalam hal ini,
aktivitas pesan akan menyediakan tombol Naik yang mengembalikan ke daftar pesan.
Perilaku tombol Naik didefinisikan oleh Anda di setiap aktivitas berdasarkan cara mendesain
navigasi aplikasi. Dalam banyak kasus, navigasi Naik dan Kembali mungkin menyediakan
perilaku yang sama: cuma mengembalikan ke aktivitas sebelumnya. Misalnya, aktivitas Setelan
mungkin tersedia dari aktivitas apa pun di aplikasi Anda, sehingga "naik" sama dengan kembali
-- cuma mengembalikan pengguna ke tempat sebelumnya di hierarki.
Menyediakan perilaku Naik untuk aplikasi Anda adalah hal yang opsional, namun praktik desain
yang baik, adalah menyediakan navigasi yang konsisten untuk berbagai aktivitas di aplikasi
Anda.
Inilah definisi kerangka untuk kedua aktivitas utama (induk) dan aktivitas kedua (anak):
</activity>
<!-- A child of the main activity -->
<activity android:name=".SecondActivity"
android:label="@string/activity2_name"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.android.twoactivities.MainActivity" />
</activity>
</application>
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dasar-Dasar Aplikasi Android
Memulai Aktivitas Lain
Aktivitas (Panduan API)
Aktivitas (Referensi API)
Maksud dan Filter Maksud (Panduan API)
Maksud (Referensi API)
Pengantar
Tentang daur hidup aktivitas
Keadaan aktivitas dan metode callback daur hidup
Perubahan konfigurasi dan keadaan aktivitas
Praktik Terkait
Ketahui selengkapnya
Dalam bab ini, Anda akan mempelajari tentang daur hidup aktivitas, kejadian callback yang bisa
Anda implementasikan untuk melakukan tugas di setiap tahap daur hidup, dan cara menangani
keadaan instance aktivitas di seluruh daur hidup aktivitas.
Misalnya, bila Anda memulai aplikasi, aktivitas utama aplikasi (Aktivitas 1) akan dimulai,
muncul ke latar depan, dan menerima fokus pengguna. Bila Anda memulai aktivitas kedua
(Aktivitas 2), aktivitas baru tersebut juga akan dibuat dan dimulai, dan aktivitas utama akan
dihentikan. Bila Anda selesai dengan aktivitas kedua dan mengarah kembali, aktivitas utama
akan dilanjutkan. Aktivitas kedua berhenti dan tidak lagi diperlukan; jika pengguna tidak
melanjutkan aktivitas kedua, aktivitas akhirnya akan dimusnahkan oleh sistem.
Bergantung pada kompleksitas aktivitas, mungkin tidak semua metode callback daur hidup
diimplementasikan di aktivitas. Akan tetapi, Anda perlu memahami satu per satu dan
mengimplementasikan metode tersebut untuk memastikan aplikasi berperilaku seperti harapan
pengguna. Mengelola daur hidup aktivitas Anda dengan mengimplementasikan metode callback
sangat penting untuk mengembangkan aplikasi yang kuat dan fleksibel.
Aktivitas Anda masuk ke keadaan yang dibuat bila dimulai untuk pertama kali. Bila aktivitas
dibuat pertama kali, sistem akan memanggil metode onCreate() untuk melakukan inisialisasi
aktivitas itu. Misalnya, bila pengguna mengetuk ikon aplikasi dari layar utama atau beranda
untuk memulai aplikasi itu, sistem akan memanggil metode onCreate() untuk aktivitas dalam
aplikasi yang Anda deklarasikan sebagai aktivitas "peluncur" atau "utama". Dalam hal ini metode
onCreate() aktivitas utama analog dengan metode main() di program lainnya.
Demikian juga, jika aplikasi Anda memulai aktivitas lain dengan maksud (baik eksplisit maupun
implisit), sistem akan mencocokkan permintaan maksud dengan aktivitas dan memanggil
onCreate() untuk aktivitas baru itu.
Metode onCreate() adalah satu-satunya callback yang harus Anda implementasikan di kelas
aktivitas. Di metode onCreate(), Anda menjalankan logika startup aplikasi dasar yang hanya
boleh terjadi sekali, seperti mempersiapkan antarmuka pengguna, menetapkan variabel-variabel
cakupan kelas, atau mempersiapkan tugas latar belakang.
Dibuat adalah keadaan sementara; aktivitas tetap berada dalam keadaan dibuat hanya selama
dibutuhkan untuk menjalankan onCreate(), kemudian aktivitas beralih ke keadaan dimulai.
Setelah aktivitas Anda diinisialisasi dengan onCreate(), sistem akan memanggil metode
onStart(), dan aktivitas berada dalam keadaan dimulai. Metode onStart() juga dipanggil jika
aktivitas yang dihentikan kembali ke latar depan, seperti bila pengguna mengeklik tombol
kembali atau naik untuk mengarah ke layar sebelumnya. Meskipun OnCreate() hanya dipanggil
sekali bila aktivitas dibuat, metode onStart() bisa digunakan berkali-kali selama daur hidup
aktivitas saat pengguna menyusuri aplikasi Anda.
Bila aktivitas berada dalam keadaan dimulai dan terlihat di layar, pengguna tidak bisa
berinteraksi dengan aktivitas tersebut hingga onResume() dipanggil, aktivitas berjalan, dan
aktivitas berada di latar depan.
Dimulai, seperti halnya dibuat, adalah keadaan sementara. Setelah memulai, aktivitas berpindah
ke keadaan dilanjutkan (berjalan).
Aktivitas Anda berada dalam keadaan dilanjutkan saat diinisialisasi, terlihat pada layar, dan siap
digunakan. Keadaan dilanjutkan biasanya disebut keadaan berjalan, karena dalam keadaan ini
pengguna benar-benar berinteraksi dengan aplikasi Anda.
Saat pertama aktivitas dimulai, sistem akan memanggil metode onResume() persis setelah
onStart(). Metode onResume() juga mungkin dipanggil beberapa kali, setiap kali aplikasi
kembali dari keadaan dihentikan sementara.
Sebagaimana dengan metode onStart() dan OnStop(), yang diimplementasikan berpasangan,
Anda biasanya hanya mengimplementasikan onResume() sebagai pasangan untuk onPause().
Misalnya, jika dalam metode onPause() Anda menghentikan setiap animasi pada layar, Anda
akan memulai lagi animasi tersebut di onResume().
Aktivitas ini tetap berada dalam keadaan dilanjutkan selama aktivitas berada di latar depan dan
pengguna berinteraksi dengannya. Dari keadaan dilanjutkan, aktivitas bisa beralih ke keadaan
dihentikan sementara.
Aktivitas akan masuk ke latar belakang, namun belum sepenuhnya berhenti. Ini
merupakan indikasi pertama bahwa pengguna meninggalkan aktivitas Anda.
Aktivitas hanya terlihat sebagian di layar, karena dialog atau aktivitas transparan lainnya
dihamparkan di atasnya.
Dalam mode multi-jendela atau layar terpisah (API 24), aktivitas ini ditampilkan pada
layar, namun beberapa aktivitas lain memiliki fokus pengguna.
Sistem memanggil metode onPause() bila aktivitas beralih ke keadaan dihentikan sementara.
Karena metode onPause() adalah indikasi pertama yang didapat bahwa pengguna mungkin
meninggalkan aktivitas, Anda bisa menggunakan onPause() untuk menghentikan pemutaran
animasi atau video, melepas sumber daya yang mengandalkan perangkat keras, atau mengikat
perubahan aktivitas yang belum disimpan (seperti draf email).
Metode onPause() akan segera dijalankan. Jangan menggunakan onPause() untuk operasi yang
banyak menggunakan CPU seperti menulis data persisten ke database. Aplikasi mungkin masih
terlihat di layar saat diteruskan ke keadaan dihentikan sementara, dan penundaan apa pun dalam
eksekusi onPause() bisa memperlambat transisi pengguna ke aktivitas berikutnya.
Implementasikan operasi beban-berat bila aplikasi berada dalam keadaan dihentikan.
Perhatikan, dalam mode multi-jendela (API 24), aktivitas yang dihentikan sementara masih bisa
terlihat pada layar. Dalam hal ini, Anda tidak perlu menghentikan sementara pemutaran animasi
atau video seperti yang diinginkan untuk aktivitas yang terlihat sebagian. Anda bisa
menggunakan metode inMultiWindowMode() di kelas Activity untuk menguji apakah aplikasi
sedang berjalan dalam mode multi-jendela.
Aktivitas Anda bisa berpindah dari keadaan dihentikan sementara ke keadaan dilanjutkan (jika
pengguna kembali ke aktivitas tersebut) atau ke keadaan dihentikan (jika pengguna
meninggalkan aktivitas secara bersamaan).
Aktivitas berada dalam keadaan dihentikan bila tidak lagi terlihat pada layar. Hal ini biasanya
karena pengguna memulai aktivitas lain, atau kembali ke layar utama. Sistem mempertahankan
instance aktivitas di back-stack, dan jika pengguna kembali ke aktivitas tersebut, maka akan
dimulai lagi. Aktivitas yang dihentikan mungkin dimatikan secara bersamaan oleh sistem
Android jika sumber daya minim.
Sistem akan memanggil metode onStop() bila aktivitas berhenti. Implementasikan metode
OnStop() untuk menyimpan data persisten dan melepas sisa sumber daya yang belum dirilis di
onPause(), termasuk operasi yang mungkin terlalu berat untuk onPause().
Bila dimusnahkan, aktivitas akan dimatikan sepenuhnya, dan instance Aktivitas diklaim ulang
oleh sistem. Hal ini bisa terjadi dalam sejumlah kasus:
Gunakan onDestroy() untuk menghapus sepenuhnya setelah aktivitas Anda sehingga tidak ada
komponen (seperti thread) yang berjalan setelah aktivitas ini dimusnahkan.
Perhatikan, ada kalanya sistem akan benar-benar mematikan proses hosting aktivitas tanpa
memanggil metode ini (atau metode lainnya), sehingga Anda tidak boleh mengandalkan
onDestroy() untuk menyimpan data atau keadaan aktivitas yang diperlukan. Sebagai gantinya,
gunakan onPause() atau onStop().
Keadaan dimulai kembali adalah keadaan sementara yang hanya terjadi jika aktivitas yang
dihentikan dimulai kembali. Jika metode onRestart() dipanggil di antara onStop() dan onStart().
Jika memiliki sumber daya yang perlu dihentikan atau dimulai, Anda biasanya
mengimplementasikan perilaku tersebut di OnStop() atau onStart(), bukan onRestart().
Perubahan konfigurasi terjadi di perangkat, dalam waktu proses, dan membatalkan validasi
layout saat ini atau sumber daya lainnya di aktivitas Anda Bentuk yang paling umum dari
perubahan konfigurasi adalah bila perangkat diputar. Bila perangkat diputar dari potret ke
lanskap, atau sebaliknya, layout aplikasi Anda juga perlu diubah. Sistem membuat ulang
aktivitas untuk membantu aktivitas tersebut beradaptasi dengan konfigurasi baru dengan memuat
sumber daya alternatif (seperti layout khusus lanskap).
Perubahan konfigurasi lainnya bisa meliputi perubahan di lokal (pengguna memilih bahasa
sistem yang berbeda), atau pengguna masuk ke mode multi-jendela (Android 7). Dalam mode
multi-jendela, jika Anda telah mengonfigurasi aplikasi agar bisa diubah ukurannya, Android akan
membuat ulang aktivitas tersebut untuk menggunakan definisi layout bagi ukuran aktivitas baru
yang lebih kecil.
Bila terjadi perubahan konfigurasi, sistem Android akan menutup aktivitas Anda (memanggil
onPause(), OnStop(), dan onDestroy()), kemudian memulainya dari awal (memanggil
onCreate(), onStart(), dan onResume()).
Bila aktivitas dimusnahkan dan dibuat ulang, ada implikasi untuk keadaan waktu proses aktivitas
itu. Bila aktivitas dihentikan sementara atau dihentikan sepenuhnya, keadaan aktivitas akan
dipertahankan karena aktivitas tersebut masih ditahan dalam memori. Bila aktivitas dibuat ulang,
keadaan aktivitas dan kemajuan pengguna di aktivitas tersebut akan hilang, dengan pengecualian
ini:
Sebagian informasi keadaan aktivitas secara otomatis disimpan secara default. Keadaan
tampilan di layout Anda dengan ID unik (seperti yang didefinisikan oleh atribut
android:id di layout) disimpan dan dipulihkan bila aktivitas dibuat ulang. Dalam hal ini,
nilai-nilai yang dimasukkan pengguna di tampilan EditText biasanya dipertahankan bila
aktivitas tersebut dibuat ulang.
Maksud yang digunakan untuk memulai aktivitas, dan informasi yang tersimpan di data
atau ekstra maksud, tetap tersedia untuk aktivitas itu bila dibuat ulang.
Keadaan aktivitas disimpan sebagai rangkaian pasangan kunci/nilai di objek Bundle yang disebut
keadaan instance aktivitas. Sistem akan menyimpan informasi keadaan default ke bundel
keadaan instance tepat sebelum aktivitas dihentikan, dan meneruskan bundel itu ke instance
aktivitas baru untuk dipulihkan.
Anda bisa menambahkan data instance sendiri ke bundel keadaan instance dengan mengganti
callback onSaveInstanceState(). Bundel keadaan diteruskan ke metode onCreate(), sehingga
Anda bisa memulihkan data keadaan instance tersebut bila aktivitas dibuat. Ada juga callback
onRestoreInstanceState() yang bisa Anda gunakan untuk memulihkan data keadaan.
Karena rotasi perangkat adalah kasus penggunaan umum untuk aplikasi, pastikan Anda menguji
bahwa aktivitas berperilaku dengan benar sebagai respons terhadap perubahan konfigurasi ini,
dan implementasikan instance keadaan jika diperlukan.
Catatan:Keadaan instance aktivitas bersifat khusus untuk intance aktivitas tertentu, yang
berjalan di satu tugas. Jika pengguna menghentikan aplikasi secara paksa, maka boot ulang
perangkat, atau jika sistem Android menutup seluruh proses aplikasi untuk menjaga memori,
keadaan instance aktivitas akan hilang. Untuk mempertahankan perubahan keadaan di seluruh
instance aplikasi dan mem-boot ulang perangkat, Anda perlu menulis data itu ke preferensi
bersama. Anda akan mengetahui selengkapnya tentang preferensi bersama dalam bab berikutnya.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// save your state data to the instance state bundle
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Jangan lupa memanggil melalui kelas super, untuk memastikan keadaan hierarki tampilan juga
disimpan ke bundel.
Setelah menyimpan keadaan instance aktivitas, Anda juga perlu memulihkannya bila aktivitas
tersebut dibuat ulang. Anda bisa melakukannya di salah satu dari dua tempat:
Metode callback onCreate(), yang dipanggil bersama bundel keadaan instance bila
aktivitas dibuat.
Callback onRestoreInstanceState(), yang dipanggil setelah onStart(), setelah aktivitas
dibuat.
Sering kali, tempat yang lebih baik untuk memulihkan keadaan aktivitas adalah di onCreate(),
untuk memastikan antarmuka pengguna Anda yang menyertakan keadaan tersedia sesegera
mungkin.
Untuk memulihkan keadaan instance yang disimpan di onCreate(), uji keberadaan bundel
keadaan sebelum Anda mencoba mendapatkan datanya. Bila aktivitas Anda dimulai untuk
pertama kali, keadaan tidak akan ada dan bundel akan nol.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
Ketahui Selengkapnya
Aktivitas (Panduan API)
Aktivitas (Referensi API)
Mengelola Daur Hidup Aktivitas
Menghentikan Sementara dan Melanjutkan Aktivitas
Menghentikan dan Memulai Ulang Aktivitas
Membuat Ulang Aktivitas
Menangani Perubahan Waktu Proses
Bundel (Referensi API)
Pengantar
Tentang maksud implisit
Mengirim maksud implisit
Menerima maksud implisit
Berbagi data dengan ShareCompat.IntentBuilder
Mengelola tugas dan aktivitas
Mode Peluncuran Aktivitas
Afinitas Tugas
Praktik Terkait
Ketahui Selengkapnya
Di bab sebelumnya, Anda telah mempelajari tentang maksud, dan cara meluncurkan aktivitas
khusus di aplikasi dengan maksud eksplisit. Di bab ini, Anda akan mempelajari cara mengirim
dan menerima maksud implisit, tempat mendeklarasikan aksi umum yang dilakukan dalam
maksud, dan sistem akan mencocokkan permintaan dengan aktivitas khusus. Selain itu, Anda
akan mengetahui selengkapnya tentang tugas Android, dan cara mengonfigurasi aplikasi untuk
mengaitkan aktivitas baru dengan tugas berbeda.
Penggunaan maksud yang lebih fleksibel adalah maksud implisit. Dengan maksud implisit, Anda
tidak menetapkan aktivitas yang tepat (atau komponen lainnya) untuk dijalankan—sebagai
gantinya, Anda menyertakan informasi secukupnya dalam maksud tentang tugas yang ingin
dilakukan. Sistem Android akan mencocokkan informasi dalam maksud permintaan dengan
aktivitas yang tersedia di perangkat yang bisa melakukan tugas itu. Jika hanya ada satu aktivitas
yang cocok, aktivitas itu akan diluncurkan. Jika ada beberapa aktivitas yang cocok, pengguna
disediakan pemilih aplikasi yang memungkinkan mereka memilih aplikasi yang disukai untuk
melakukan tugas.
Misalnya, Anda memiliki aplikasi yang mencantumkan cuplikan video yang tersedia. Jika
pengguna menyentuh item dalam daftar, Anda akan memutar cuplikan video itu. Daripada
mengimplementasikan keseluruhan pemutar video di aplikasi, Anda bisa meluncurkan maksud
yang menetapkan tugas seperti "putar objek video tipe." Sistem Android selanjutnya akan
mencocokkan permintaan dengan aktivitas yang telah mendaftarkan dirinya sendiri untuk
memutar objek video tipe.
Aktivitas mendaftarkan dirinya sendiri secara otomatis pada sistem agar dapat menangani
maksud implisit dengan filter maksud, yang dideklarasikan dalam manifes Android. Misalnya,
aktivitas utama (dan satu-satunya aktivitas utama) untuk aplikasi Anda memiliki filter maksud
yang mendeklarasikan aktivitas utama untuk kategori peluncur. Filter maksud ini adalah cara
sistem Android mengetahui cara memulai aktivitas tertentu di aplikasi Anda bila pengguna
mengetuk ikon untuk aplikasi di layar utama perangkat.
Maksud implisit, seperti maksud eksplisit, merupakan instance kelas Intent. Selain bagian
maksud yang telah Anda pelajari di bab awal (seperti data maksud dan ekstra maksud), bidang-
bidang ini digunakan oleh maksud implisit:
Aksi maksud, merupakan aksi umum yang harus dilakukan aktivitas penerima. Aksi
maksud yang tersedia didefinisikan sebagai konstanta dalam kelas Intent dan dimulai
dengan kata ACTION_. Aksi maksud umum adalah ACTION_VIEW, yang Anda
gunakan bila memiliki beberapa informasi yang bisa ditampilkan aktivitas kepada
pengguna, seperti foto untuk ditampilkan di aplikasi galeri, atau alamat untuk
ditampilkan di aplikasi peta. Anda bisa menetapkan aksi untuk sebuah maksud di
konstruktor maksud, atau dengan metode setAction().
Kategori maksud, menyediakan informasi tambahan tentang kategori komponen yang
harus menangani maksud. Kategori maksud bersifat opsional, dan Anda bisa
menambahkan lebih dari satu kategori ke maksud. Kategori maksud juga didefinisikan
sebagai konstanta di kelas Intent dan dimulai dengan kata CATEGORY_. Anda bisa
menambahkan kategori ke maksud dengan metode addCategory().
Tipe data, yang menunjukkan MIME tipe data yang digunakan untuk mengoperasikan
aktivitas. Biasanya, ini diambil dari URI dalam bidang data maksud, namun Anda juga
bisa secara eksplisit mendefinisikan tipe data dengan metode setType().
Tindakan, kategori, dan tipe data maksud keduanya digunakan oleh objek Maksud yang Anda
buat di aktivitas pengiriman, serta di filter maksud yang didefinisikan di manifes Android untuk
aktivitas penerimaan. Sistem Android menggunakan informasi ini untuk mencocokkan
permintaan maksud implisit dengan aktivitas atau komponen lain yang bisa menangani maksud
itu.
Untuk menggunakan maksud implisit, buat objek Intent seperti yang dilakukan untuk maksud
eksplisit, hanya tanpa nama komponen spesifik.
Setelah memiliki objek Intent, Anda bisa menambahkan informasi lain (kategori, data, ekstra)
dengan beragam metode Intent. Misalnya, kode ini membuat objek Intent implisit, menyetel aksi
maksud ke ACTION_SEND, mendefinisikan ekstra maksud untuk menampung teks, dan
menyetel tipe data ke tipe MIME "text/plain".
Bila Anda mendefinisikan maksud implisit dengan aksi dan/atau kategori tertentu, ada
kemungkinan bahwa tidak akan ada aktivitas apa pun di perangkat yang bisa menangani
permintaan Anda. Jika Anda hanya mengirim maksud dan tidak ada kecocokan, aplikasi akan
mogok.
Untuk memverifikasi apakah aktivitas atau komponen lain tersedia untuk menerima maksud
Anda, gunakan metode resolveActivity() bersama pengelola paket sistem seperti ini:
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
Jika hasil resolveActivity() bukan nol, maka setidaknya ada satu aplikasi yang tersedia yang bisa
menangani maksud, dan aman untuk menggunakan startActivity(). Jangan mengirim maksud jika
hasilnya nol.
Jika Anda memiliki fitur yang bergantung pada aktivitas eksternal yang mungkin atau mungkin
tidak tersedia di perangkat, praktik terbaik adalah menguji ketersediaan aktivitas eksternal
sebelum pengguna mencoba menggunakannya. Jika tidak ada aktivitas yang bisa menangani
permintaan Anda (yakni, resolveActivity() mengembalikan nol), nonaktifkan fitur atau sediakan
pesan kesalahan untuk fitur tersebut kepada pengguna.
Untuk menemukan aktivitas atau komponen lain yang bisa menangani permintaan maksud Anda,
sistem Android akan mencocokkan maksud implisit dengan aktivitas yang filter maksudnya
menunjukkannya bisa melakukan aksi tersebut. Jika beberapa aplikasi yang telah dipasang
memang cocok, pengguna akan disajikan pemilih aplikasi yang memungkinkan mereka memilih
aplikasi yang ingin digunakan untuk menangani maksud tersebut.
Dalam banyak kasus, pengguna memiliki aplikasi pilihan untuk tugas yang diberikan, dan
mereka akan memilih opsi untuk selalu menggunakan aplikasi itu bagi tugas tersebut. Akan
tetapi, jika beberapa aplikasi bisa merespons maksud dan pengguna setiap kali mungkin ingin
menggunakan aplikasi yang berbeda, Anda bisa memilih untuk secara eksplisit menampilkan
dialog pemilih kapan saja. Misalnya, bila aplikasi melakukan aksi "bagikan ini" bersama aksi
ACTION_SEND, pengguna mungkin ingin berbagi menggunakan aplikasi yang berbeda,
bergantung pada situasi saat ini.
Untuk menampilkan pemilih, buat maksud wrapper untuk maksud implisit dengan metode
createChooser(), kemudian cocokkan dan gunakan startActivity() dengan maksud wrapper.
Metode createChooser() juga memerlukan argumen string untuk judul yang muncul pada
pemilih. Anda bisa menetapkan judul bersama sumber daya string seperti yang dilakukan pada
string lain.
Misalnya:
Catatan:Maksud eksplisit selalu dikirimkan ke targetnya, terlepas dari filter maksud yang
dideklarasikan komponen. Sebaliknya, jika aktivitas tidak mendeklarasikan filter maksud apa
pun, aktivitas hanya bisa diluncurkan dengan maksud eksplisit.
Setelah aktivitas berhasil diluncurkan bersama maksud implisit, Anda bisa menangani maksud
tersebut dan datanya dengan cara sama yang dilakukan pada maksud eksplisit:
Definisikan filter maksud dengan satu atau beberapa elemen <intent-filter> di file manifes
aplikasi, yang disarangkan di elemen <activity> yang sesuai. Di dalam <intent-filter>,
tetapkan tipe maksud yang bisa ditangani aktivitas Anda. Sistem Android mencocokkan maksud
implisit dengan aktivitas atau komponen aplikasi lain hanya jika bidang-bidang dalam objek
Intent cocok dengan filter maksud untuk komponen itu.
Filter maksud dapat berisi elemen ini, sesuai dengan bidang di objek Intent yang dijelaskan di
atas:
Misalnya, aktivitas utama untuk aplikasi Anda menyertakan elemen <intent-filter> ini, yang
telah Anda lihat di bab sebelumnya:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Filter maksud ini memiliki aksi MAIN dan kategori LAUNCHER. Elemen <action>
menetapkan bahwa ini adalah titik masuk "utama" ke aplikasi. Elemen <category> menetapkan
bahwa aktivitas ini harus dicantumkan dalam peluncur aplikasi sistem (untuk memungkinkan
pengguna meluncurkan aktivitas ini). Hanya aktivitas utama untuk aplikasi Anda yang harus
memiliki filter maksud ini.
Inilah contoh lain maksud implisit untuk berbagi sedikit teks. Filter maksud ini mencocokkan
contoh maksud implisit dari bagian sebelumnya:
<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>
Anda bisa menetapkan lebih dari satu aksi, data, atau kategori untuk filter maksud yang sama,
atau memiliki beberapa filter maksud per aktivitas untuk menangani jenis maksud yang berbeda.
Sistem Android akan menguji maksud implisit terhadap filter maksud dengan membandingkan
bagian maksud tersebut dengan ketiga elemen filter maksud (aksi, kategori, dan data). Maksud
harus lulus ketiga pengujian atau sistem Android tidak akan mengirim maksud ke komponen.
Akan tetapi, karena sebuah komponen mungkin memiliki beberapa filter maksud, maksud yang
tidak lulus salah satu filter komponen mungkin saja lulus di filter lainnya.
Tindakan
Filter maksud bisa mendeklarasikan nol atau beberapa elemen <action> untuk aksi maksud.
Aksi didefinisikan dalam atribut nama, dan berisi string "android.intent.action." ditambah nama
aksi maksud, tanpa awalan ACTION_. Jadi, misalnya, maksud implisit dengan aksi
ACTION_VIEW cocok dengan filter maksud yang aksinya adalah
android.intent.action.VIEW.
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
...
</intent-filter>
Untuk melewati filter ini, aksi yang ditetapkan dalam objek Intent yang masuk harus cocok
dengan setidaknya salah satu tindakan. Anda harus menyertakan setidaknya satu aksi maksud
untuk mencocokkan maksud implisit yang masuk.
Kategori
Filter maksud bisa mendeklarasikan nol atau beberapa elemen <category> untuk kategori
maksud. Kategori didefinisikan dalam atribut nama, dan berisi string "android.intent.category."
ditambah nama kategori maksud, tanpa awalan CATEGORY.
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
Perhatikan, semua aktivitas yang Anda inginkan untuk menerima maksud implisit harus
menyertakan filter maksud android.intent.category.DEFAULT. Kategori ini diterapkan ke semua
objek Intent implisit oleh sistem Android.
Data
Filter maksud bisa mendeklarasikan nol atau beberapa elemen <data> untuk URI yang dimuat
dalam data maksud. Karena data maksud terdiri dari URI dan (opsional) tipe MIME, Anda bisa
membuat filter maksud untuk beragam aspek data itu, termasuk:
Skema URI
Host URI
Jalur URI
Tipe MIME
Misalnya, filter maksud ini mencocokkan maksud data dengan skema URI http dan tipe MIME
"video/mpeg" atau "audio/mpeg".
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" />
<data android:mimeType="audio/mpeg" android:scheme="http" />
...
</intent-filter>
Catatan:Untuk aplikasi yang menargetkan rilis Android setelah API 14, Anda bisa menggunakan
kelas ShareActionProvider untuk tindakan berbagi sebagai ganti ShareCompat.IntentBuilder.
Kelas ShareCompat adalah bagian dari pustaka dukungan V4, dan memungkinkan Anda untuk
menyediakan tindakan berbagi di aplikasi yang kompatibel-mundur. ShareCompat menyediakan
API tunggal untuk berbagi pada perangkat Android lama dan baru. Anda mengetahui
selengkapnya tentang pustaka dukungan Android dalam bab berikutnya.
Dengan kelas ShareCompat.IntentBuilder, Anda tidak perlu membuat atau mengirim maksud
implisit untuk aksi berbagi. Gunakan metode di ShareCompat.IntentBuilder untuk menunjukkan
data yang ingin dibagikan serta informasi tambahan. Mulai dengan metode from() untuk
membuat builder maksud baru, tambahkan metode lain untuk menambahkan lebih banyak data,
dan akhiri dengan metode startChooser() untuk membuat dan mengirim maksud. Anda bisa
merangkai metode seperti ini:
ShareCompat.IntentBuilder
.from(this) // information about the calling activity
.setType(mimeType) // mime type for the data
.setChooserTitle("Share this text with: ") //title for the app chooser
.setText(txt) // intent data
.startChooser(); // send the intent
Umumnya navigasi pengguna dari aktivitas ke aktivitas dan kembali lagi melalui tumpukan
secara langsung. Bergantung pada desain dan navigasi aplikasi Anda, mungkin ada komplikasi,
khususnya dengan aktivitas yang dimulai dari aplikasi lain dan tugas lain.
Misalnya, katakanlah Anda memiliki aplikasi dengan tiga aktivitas: A, B, dan C. A meluncurkan
B bersama sebuah maksud, dan B meluncurkan C. C, sebaliknya mengirimkan maksud untuk
meluncurkan A. Dalam hal ini, sistem membuat instance kedua dari A di bagian atas tumpukan,
dibandingkan memberikan instance yang sudah berjalan ke latar depan. Bergantung pada cara
mengimplementasikan aktivitas, dua instance dari A bisa menjadi tidak sinkron dan memberikan
pengalaman membingungkan pada pengguna saat menyusuri kembali melalui tumpukan.
Atau, katakanlah aktivitas C Anda bisa diluncurkan dari aplikasi kedua bersama sebuah maksud
implisit. Pengguna menjalankan aplikasi kedua, yang memiliki tugas dan back-stack sendiri. Jika
aplikasi itu menggunakan maksud implisit untuk meluncurkan aktivitas C Anda, instance C akan
baru dibuat dan ditempatkan pada back-stack untuk tugas aplikasi kedua itu. Aplikasi Anda tetap
memiliki tugas, back-stack, dan instance C sendiri.
Kebanyakan perilaku default Android untuk tugas dan aktivitas berfungsi dengan baik dan Anda
tidak perlu khawatir tentang cara aktivitas dikaitkan dengan tugas atau bagaimana aktivitas bisa
ada di back-stack. Jika Anda ingin mengubah perilaku normal, Android menyediakan sejumlah
cara untuk mengelola tugas dan aktivitas dalam tugas tersebut, termasuk:
Atribut aktivitas
<activity
android:name=".SecondActivity"
android:label="@string/activity2_name"
android:parentActivityName=".MainActivity"
android:launchMode="standard">
...
</activity>
Ada empat mode peluncuran yang tersedia sebagai bagian dari elemen <activity> :
Sebagian besar aplikasi hanya akan menggunakan mode peluncuran standar atau singleTop.
Lihat dokumentasi atribut launchMode untuk informasi lebih detail tentang mode peluncuran.
Flag maksud
Flag maksud merupakan opsi yang menetapkan cara aktivitas (atau komponen aplikasi lainnya)
yang menerima maksud harus menangani maksud tersebut. Flag maksud didefinisikan sebagai
konstanta di kelas Intent dan dimulai dengan kata FLAG_. Anda menambahkan flag maksud ke
objek Intent dengan setFlag() atau addFlag().
Tiga flag maksud spesifik digunakan untuk mengontrol mode peluncuran aktivitas, baik yang
berhubungan dengan atribut launchMode atau yang menggantikannya. Flag maksud selalu
diutamakan daripada mode peluncuran jika terjadi konflik.
Lihat kelas Intent untuk informasi selengkapnya tentang flag maksud yang tersedia.
Bila sistem Android merutekan maksud ke instance aktivitas yang ada, sistem akan memanggil
metode callback onNewIntent() (biasanya persis sebelum metode onResume()). Metode
onNewIntent() menyertakan argumen untuk maksud baru yang dirutekan ke aktivitas. Ganti
metode onNewIntent() dalam kelas Anda untuk menangani informasi dari maksud baru tersebut.
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Afinitas Tugas
Afinitas tugas menunjukkan tugas yang sebaiknya memiliki aktivitas pilihan bila instance
aktivitas itu diluncurkan. Secara default, semua aktivitas dimiliki aplikasi yang meluncurkannya.
Aktivitas dari luar aplikasi yang diluncurkan bersama maksud implisit dimiliki aplikasi yang
mengirim maksud implisit.
<activity
android:name=".SecondActivity"
android:label="@string/activity2_name"
android:parentActivityName=".MainActivity"
android:taskAffinity="com.example.android.myapp.newtask">
...
</activity>
Afinitas tugas biasanya digunakan bersama-sama dengan mode peluncuran singleTask atau flag
maksud FLAG_ACTIVITY_NEW_TASK untuk menempatkan aktivitas baru dalam tugas yang
diberi nama sendiri. Jika tugas baru sudah ada, maksud akan dirutekan ke tugas dan afinitas itu.
Penggunaan afinitas tugas lainnya adalah pengindukan ulang, yang memungkinkan tugas
dipindahkan dari aktivitas yang semula meluncurkannya ke aktivitas yang menjadi afinitasnya.
Untuk mengaktifkan pengindukan ulang atas tugas, tambahkan atribut afinitas tugas ke elemen
<activity> dan setel android:allowTaskReparenting ke true.
<activity
android:name=".SecondActivity"
android:label="@string/activity2_name"
android:parentActivityName=".MainActivity"
android:taskAffinity="com.example.android.myapp.newtask"
android:allowTaskReparenting="true" >
...
</activity>
Praktik Terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui Selengkapnya
Aktivitas (Panduan API)
Aktivitas (Referensi API)
Maksud dan Filter Maksud
Maksud (Referensi API)
<intent-filter>
Pengantar
Tentang men-debug
Menjalankan debugger
Menggunakan Breakpoint
Merunut kode
Menampilkan bingkai tumpukan eksekusi
Memeriksa dan memodifikasi variabel-variabel
Menyetel watches
Mengevaluasi ekspresi
Alat (bantu) lainnya untuk men-debug
Perekaman pelacakan ke log dan manifes Android
Praktik terkait
Ketahui selengkapnya
Dalam bab ini Anda akan mempelajari tentang men-debug aplikasi di Android Studio.
Tentang men-debug
Men-debug adalah proses menemukan dan memperbaiki kesalahan (bug) atau perilaku tak
terduga dalam kode Anda. Semua kode memiliki bug, mulai dari perilaku yang salah dalam
aplikasi, perilaku yang mengonsumsi memori atau sumber daya jaringan secara berlebihan,
hingga aplikasi yang membeku atau mogok.
Dalam bab ini Anda akan mempelajari cara men-debug aplikasi dengan debugger Android
Studio, menyetel dan menampilkan breakpoint, merunut kode, dan memeriksa variabel-variabel.
Menjalankan debugger
Menjalankan aplikasi dalam mode debug sama seperti menjalankan aplikasi seperti biasanya.
Anda bisa menjalankan aplikasi dalam mode debug, atau melampirkan debugger ke aplikasi
yang sudah berjalan.
Untuk mulai men-debug, klik Debug di bilah alat. Android Studio akan membangun APK,
menandainya dengan kunci debug, memasangnya pada perangkat yang Anda pilih, kemudian
menjalankannya dan membuka jendela Debug.
Jika aplikasi Anda sudah berjalan pada perangkat atau emulator, mulailah men-debug aplikasi itu
dengan langkah-langkah ini:
1. Pilih Run > Attach debugger to Android process atau klik ikon Attach di bilah
alat.
2. Dalam dialog Choose Process, pilih proses yang ingin Anda lampirkan debugger.
Secara default, debugger menampilkan perangkat dan proses aplikasi untuk proyek saat
ini, serta perangkat keras atau perangkat virtual yang terhubung pada komputer Anda.
Pilih Show all processes untuk menampilkan semua proses di semua perangkat.
Untuk melanjutkan eksekusi aplikasi setelah men-debug, pilih Run > Resume Program atau
klik ikon Resume .
Untuk berhenti men-debug aplikasi Anda, pilih Run > Stop atau klik ikon Stop di bilah alat.
Menggunakan Breakpoint
Breakpoint adalah tempat dalam kode yang Anda inginkan untuk menghentikan sementara
eksekusi normal aplikasi untuk melakukan tindakan lainnya seperti memeriksa variabel-variabel
atau mengevaluasi ekspresi, atau mengeksekusi kode setiap baris untuk menentukan penyebab
kesalahan waktu proses.
Menambahkan breakpoint
Untuk menambahkan breakpoint ke sebuah baris dalam kode Anda, gunakan langkah-langkah
ini:
1. Carilah baris kode yang diinginkan untuk menjadi tempat Anda menghentikan sementara
eksekusi.
2. Klik di gutter kiri jendela editor pada baris tersebut, di sebelah nomor baris. Titik merah
muncul pada baris itu, yang menunjukkan sebuah breakpoint.
Anda juga bisa menggunakan Run > Toggle Line Breakpoint atau Control-F8
(Command-F8 di OS X) untuk menyetel breakpoint pada baris.
Jika aplikasi sudah berjalan, Anda tidak perlu memperbaruinya untuk menambahkan breakpoint.
Bila eksekusi kode sudah mencapai breakpoint, Android Studio menghentikan sementara
eksekusi aplikasi Anda. Selanjutnya Anda bisa menggunakan alat (bantu) dalam debugger
Android untuk menampilkan keadaan aplikasi dan men-debug aplikasi saat berjalan.
Pilih breakpoint dari daftar untuk mengonfigurasi setelannya. Anda bisa mengonfigurasi
breakpoint agar dinonaktifkan di awal dan meminta sistem mengaktifkannya setelah breakpoint
yang berbeda ditemukan. Anda juga bisa mengonfigurasi apakah breakpoint harus dinonaktifkan
setelah tercapai.
Untuk menyetel breakpoint bagi suatu pengecualian, pilih Exception Breakpoints dalam daftar
breakpoint.
Untuk membisukan semua breakpoint, klik ikon Mute Breakpoints . Klik lagi ikon tersebut
untuk mengaktifkan (membunyikan) semua breakpoint.
Breakpoint bersyarat adalah breakpoint yang hanya menghentikan eksekusi aplikasi Anda jika
ketentuan pengujian terpenuhi. Untuk mendefinisikan pengujian breakpoint bersyarat, gunakan
langkah-langkah ini:
1. Klik-kanan pada ikon breakpoint, dan masukkan pengujian dalam bidang Condition.
Anda juga bisa menggunakan jendela Breakpoints untuk memasukkan ketentuan
breakpoint.
Pengujian yang dimasukkan dalam bidang ini bisa berupa ekspresi Java asalkan
mengembalikan nilai boolean. Anda bisa menggunakan nama variabel dari aplikasi
sebagai bagian dari ekspresi.
2. Jalankan aplikasi dalam mode debug. Eksekusi aplikasi Anda akan berhenti di breakpoint
bersyarat, jika syarat bernilai true.
Merunut kode
Setelah eksekusi aplikasi berhenti karena telah mencapai breakpoint, Anda bisa mengeksekusi
kode dari titik itu sebanyak satu baris dengan fungsi Step Over, Step Into, dan Step Out.
Eksekusi aplikasi akan berhenti, dan debugger menampilkan keadaan aplikasi saat ini.
Baris saat ini akan disorot dalam kode Anda.
2. Klik ikon Step Over , pilih Run > Step Over, atau tekan F8.
Step Over mengeksekusi baris kode berikutnya di kelas dan metode saat ini, yang
mengeksekusi semua panggilan metode pada baris itu dan sisanya dalam file yang sama.
3. Klik ikon Step Into , pilih Run > Step Into, atau tekan F7.
Step Into akan melompat ke eksekusi panggilan metode pada baris saat ini (dibandingkan
dengan hanya mengeksekusi metode tersebut dan sisanya pada baris yang sama).
Tampilan Frame (yang akan Anda pelajari di bagian berikutnya) akan diperbarui untuk
menampilkan bingkai tumpukan baru (metode baru). Jika panggilan metode dimuat
dalam kelas lain, file untuk kelas itu akan dibuka dan baris saat ini dalam file itu akan
disorot. Anda bisa terus merunut baris-baris dalam panggilan metode baru ini, atau
merunut lebih dalam ke metode lainnya.
4. Klik ikon Step Out , pilih Run > Step Out, atau tekan Shift-F8.
Step Out akan menyelesaikan eksekusi metode saat ini dan mengembalikan ke titik
pemanggilan metode semula.
5. Untuk melanjutkan eksekusi normal aplikasi, pilih Run > Resume Program atau klik
ikon Resume .
Mengeklik baris untuk bingkai dalam tampilan Frames akan membuka sumber terkait dalam
editor dan menyoroti baris tempat bingkai dieksekusi pada awalnya. Tampilan Variables dan
Watches juga diperbarui untuk mencerminkan keadaan lingkungan eksekusi ketika bingkai itu
terakhir dimasuki.
Panel Variable juga memungkinkan Anda mengevaluasi ekspresi dengan cepat menggunakan
variabel dan/atau metode statis yang tersedia dalam bingkai yang dipilih.
Jika tampilan Variables tidak terlihat, klik ikon Restore Variables View .
1. Klik-kanan sutau variabel di tampilan Variable, dan pilih Set Value. Anda juga bisa
menggunakan F2.
2. Masukkan nilai baru untuk variabel, dan tekan Return.
Nilai yang Anda masukkan harus sesuai tipenya dengan variabel tersebut, atau Android
Studio akan mengembalikan kesalahan "type mismatch".
Menyetel watches
Tampilan Watches menyediakan fungsionalitas yang sama dengan tampilan Variables hanya saja
ekspresi yang ditambahkan ke panel Watches akan bertahan di antara sesi debug. Tambahkan
watches untuk variabel-variabel dan bidang yang sering Anda akses atau yang menyediakan
keadaan yang berguna untuk sesi debug saat ini.
Dalam kotak teks yang muncul, ketikkan nama variabel atau ekspresi yang ingin Anda
amati, kemudian tekan Enter.
Buang item dari daftar Watches dengan memilih item tersebut kemudian mengeklik tombol
minus (-).
Ubah urutan elemen dalam daftar Watches dengan memilih sebuah item kemudian mengeklik
ikon naik atau turun.
Mengevaluasi ekspresi
Gunakan Evaluate Expression untuk menjelajahi keadaan variabel-variabel dan objek dalam
aplikasi Anda, termasuk metode panggilan pada objek itu. Untuk mengevaluasi ekspresi:
1. Klik ikon Evaluate Expression , atau pilih Run > Evaluate Expression. Anda juga
bisa mengeklik-kanan pada suatu variabel dan memilih Evaluate Expression.
Jendela Evaluate Expression akan memperbarui hasil eksekusi. Perhatikan, hasil yang
Anda dapat dari mengevaluasi ekspresi adalah berdasarkan pada keadaan aplikasi saat ini.
Bergantung pada nilai variabel-variabel dalam aplikasi saat mengevaluasi ekspresi, Anda
mungkin mendapatkan hasil yang berbeda. Mengubah nilai variabel-variabel dalam
ekspresi juga akan mengubah keadaan aplikasi yang berjalan saat ini.
Log sistem (logcat). Seperti yang telah dipelajari dalam pelajaran sebelumnya, Anda bisa
menggunakan kelas Log untuk mengirim pesan ke log sistem Android, dan menampilkan
pesan itu di Android Studio.
o Untuk menulis pesan log di kode Anda, gunakan kelas Log. Pesan log membantu
memahami alur eksekusi dengan mengumpulkan keluaran debug sistem saat Anda
berinteraksi dengan aplikasi. Pesan log bisa memberi tahu Anda tentang bagian
aplikasi yang gagal. Untuk informasi selengkapnya tentang pembuatan log, lihat
Membaca dan Menulis Log.
Melacak dan Membuat Log. Analisis jejak memungkinkan Anda melihat banyaknya
waktu yang dihabiskan dalam metode tertentu, dan metode yang membutuhkan waktu
terlama.
o Untuk membuat file pelacakan, sertakan kelas Debug dan panggil salah satu
metode startMethodTracing(). Dalam panggilan tersebut, tetapkan nama dasar
untuk file pelacakan yang dihasilkan sistem. Untuk menghentikan pelacakan,
panggil stopMethodTracing(). Semua metode ini memulai dan menghentikan
pelacakan metode di seluruh mesin virtual. Misalnya, Anda bisa memanggil
startMethodTracing() di metode onCreate() aktivitas, dan memanggil
stopMethodTracing() di metode onDestroy() aktivitas itu.
Android Debug Bridge (ADB). ADB adalah alat (bantu) baris perintah yang
memungkinkan Anda berkomunikasi dengan instance emulator atau perangkat berbasis
Android yang terhubung.
Dalvik Debug Monitor Server (DDMS). Alat (bantu) DDSM menyediakan layanan
penerusan porta, tangkapan layar, informasi thread dan heap, logcat, proses, dan
informasi keadaan radio, panggilan masuk dan spoofing SMS, spoofing data lokasi, dan
lainnya.
Monitor CPU dan memori. Android Studio menyertakan sejumlah monitor untuk
membantu memvisualisasikan perilaku dan kinerja aplikasi Anda.
Tangkapan layar dan rekaman video.
Demikian juga, Anda bisa menyetel android:debuggable di tag <application> Manifes Android
ke "true", yang menyetel apakah aplikasi bisa di-debug atau tidak, bahkan saat dijalankan pada
perangkat dalam mode pengguna. Secara default, nilai ini disetel ke "false".
Anda bisa membuat dan mengonfigurasi tipe pembangunan dalam file build.gradle tingkat modul
di dalam blok {} android. Bila membuat modul baru, Android Studio secara otomatis
membuatkan tipe pembangunan rilis dan debug untuk Anda. Meskipun tipe pembangunan debug
tidak muncul dalam file konfigurasi pembangunan, Android Studio akan mengonfigurasinya
dengan debuggable true. Hal ini memungkinkan Anda men-debug aplikasi pada perangkat
Android yang aman dan mengonfigurasi penandatanganan APK dengan keystore debug generik.
Anda bisa menambahkan tipe pembangunan debug ke konfigurasi jika ingin menambahkan atau
mengubah setelan tertentu.
Semua perubahan yang dibuat untuk men-debug harus dibuang dari kode sebelum rilis karena
bisa memengaruhi eksekusi dan kinerja kode produksi.
Saat mempersiapkan aplikasi untuk rilis, Anda harus membuang semua kode ekstra di file
sumber yang ditulis untuk keperluan pengujian.
Selain mempersiapkan kode itu sendiri, ada beberapa tugas lain yang perlu diselesaikan agar
aplikasi Anda siap dipublikasikan. Tugas tersebut antara lain:
Buang semua panggilan pelacakan debug dari file kode sumber Anda seperti
startMethodTracing() dan stopMethodTracing().
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Menggunakan Debugger
Ketahui selengkapnya
Debug Aplikasi Anda
Tulis dan Tampilkan Log
Analisis Pelacakan Tumpukan
Android Monitor
Menggunakan DDMS
Android Debug Bridge
Ringkasan Android Monitor
Buat dan Edit Konfigurasi Run/Debug
Men-debug dan Menguji di Android Studio (video)
Pengantar
Tentang pengujian
Mempersiapkan pengujian
Membuat dan menjalankan pengujian unit
Praktik Terkait
Ketahui Selengkapnya
Dalam bab ini Anda akan mendapatkan ringkasan pengujian Android, serta tentang membuat dan
menjalankan pengujian unit lokal di Android Studio bersama JUnit.
Tentang pengujian
Meskipun memiliki aplikasi yang dikompilasi, dijalankan dan terlihat seperti yang diinginkan
pada perangkat lain, Anda harus memastikan bahwa aplikasi akan berperilaku seperti yang
diharapkan dalam setiap situasi, terutama saat aplikasi tumbuh dan berubah. Bahkan jika Anda
mencoba menguji aplikasi secara manual setiap kali membuat perubahan — prospek yang
membosankan — Anda mungkin melewatkan sesuatu atau tidak mengantisipasi hal yang
mungkin dilakukan pengguna akhir dengan aplikasi tersebut sehingga menyebabkan kegagalan.
Menulis dan menjalankan pengujian adalah bagian penting dari proses development perangkat
lunak. "Test-Driven Development" (TDD) atau Pengembangan yang Digerakkan oleh Pengujian
adalah filosofi development perangkat lunak populer yang menempatkan pengujian pada inti dari
semua development perangkat lunak untuk aplikasi atau layanan. Ini tidak menghilangkan
kebutuhan akan pengujian lebih jauh, namun hanya memberikan dasar yang kuat untuk
digunakan.
Pengujian kode bisa membantu Anda menemukan masalah lebih awal di development—bila
masalah sangat mahal untuk diatasi—dan meningkatkan ketangguhan kode saat aplikasi menjadi
lebih besar dan lebih kompleks. Dengan beberapa pengujian dalam kode, Anda bisa menguji
beberapa bagian kecil aplikasi secara terpisah, dan dengan cara yang dapat diulangi serta
dilakukan secara otomatis. Karena….kode yang Anda tulis untuk menguji aplikasi tidak berakhir
di versi produksi aplikasi; kode hanya berada di mesin development, bersama kode aplikasi Anda
di Android Studio.
Tipe pengujian
Android mendukung sejumlah pengujian yang berbeda dan kerangka kerja pengujian. Dua
bentuk dasar pengujian yang didukung Android Studio adalah pengujian unit lokal dan pengujian
instrumentasi.
Pengujian unit lokal adalah pengujian yang dikompilasi dan dijalankan sepenuhnya pada mesin
lokal Anda dengan Java Virtual Machine (JVM). Gunakan pengujian unit lokal untuk menguji
bagian-bagian aplikasi (seperti logika internal) yang tidak memerlukan akses ke kerangka kerja
Android atau perangkat Android atau pun emulator, atau bagian-bagian yang bisa Anda buatkan
objek palsu ("tiruan" atau stub) yang seakan-akan berperilaku seperti padanan kerangka kerja.
Pengujian instrumentasi adalah pengujian yang berjalan pada perangkat Android atau emulator.
Pengujian tersebut memiliki akses ke kerangka kerja Android dan ke informasi Instrumentasi
seperti Konteks aplikasi. Anda bisa menggunakan pengujian instrumentasi untuk pengujian unit,
pengujian antarmuka pengguna (UI), atau pengujian integrasi, yang memastikan komponen
aplikasi berinteraksi dengan aplikasi lain dengan benar. Paling umum, Anda menggunakan
pengujian instrumentasi untuk pengujian UI, yang memungkinkan Anda menguji apakah aplikasi
berperilaku dengan benar bila pengguna berinteraksi dengan aktivitas aplikasi atau memasukkan
masukan tertentu.
Untuk sebagian besar bentuk pengujian antarmuka pengguna, Anda menggunakan kerangka
kerja Espresso, yang memungkinkan Anda menulis pengujian UI otomatis. Anda akan
mempelajari tentang pengujian instrumentasi dan Espresso dalam bab berikutnya.
Pengujian Unit
Pengujian unit harus menjadi pengujian mendasar dalam strategi pengujian aplikasi Anda.
Dengan membuat dan menjalankan pengujian unit terhadap kode, Anda bisa memverifikasi
apakah logika area atau unit kode fungsional sudah benar. Menjalankan pengujian unit setelah
setiap pembangunan akan membantu Anda menemukan dan mengatasi masalah yang
ditimbulkan oleh perubahan kode pada aplikasi.
Pengujian unit umumnya menguji fungsionalitas unit kemungkinan kode terkecil (yang bisa
berupa metode, kelas, atau komponen) dengan cara yang bisa diulang. Buat pengujian unit bila
Anda perlu memverifikasi logika kode tertentu di aplikasi. Misalnya, jika Anda melakukan
pengujian unit atas kelas, pengujian mungkin akan memeriksa apakah kelas dalam keadaan yang
tepat. Untuk metode, Anda mungkin menguji perilakunya untuk nilai parameter yang berbeda,
terutama nol. Biasanya, unit kode diuji secara terpisah; pengujian Anda hanya memantau
perubahan pada unit itu saja. Kerangka kerja tiruan seperti Mockito bisa digunakan untuk
mengisolasi unit Anda dari dependensinya. Anda juga bisa menulis pengujian unit untuk Android
di JUnit 4, yakni kerangka kerja pengujian unit umum untuk kode Java.
Android Testing Support Library menyediakan infrastruktur dan API untuk pengujian aplikasi
Android, termasuk dukungan untuk JUnit 4. Dengan pustaka dukungan pengujian, Anda bisa
membangun dan menjalankan kode pengujian untuk aplikasi.
Anda mungkin sudah memiliki Android Testing Support Library yang dipasang bersama Android
Studio. Untuk memeriksa Android Support Repository, ikuti langkah-langkah ini:
Kelas-kelas Android Testing Support Library berada di paket android.support.test. Ada juga API
pengujian lama di android.test. Anda harus menggunakan pustaka dukungan terlebih dulu, bila
diberi pilihan antara pustaka dukungan dan API lama, karena pustaka dukungan membantu
membangun dan mendistribusikan pengujian secara lebih bersih dan lebih bisa diandalkan
daripada pengkodean langsung terhadap API itu sendiri.
Mempersiapkan pengujian
Untuk mempersiapkan proyek bagi pengujian di Android Studio, Anda perlu:
Set sumber adalah kumpulan kode terkait dalam proyek Anda, yaitu untuk target pembangunan
atau "ragam" aplikasi yang berbeda. Bila Android Studio membuat proyek, maka akan membuat
tiga set sumber untuk Anda:
Set sumber ini sesuai dengan folder dalam direktori src untuk proyek Anda. Misalnya, file untuk
set sumber pengujian test ada di src/test/java.
Untuk menggunakan API pengujian unit, Anda perlu mengonfigurasi dependensi proyek. File
pembangunan gradle default untuk proyek Anda menyertakan sebagian dependensi ini secara
default, namun Anda mungkin perlu menambahkan dependensi lainnya untuk fitur pengujian
tambahan seperti kerangka kerja pencocokan atau tiruan.
Dalam file build.gradle level atas aplikasi Anda, tetapkan pustaka-pustaka ini sebagai
dependensi. Perhatikan, nomor versi untuk pustaka ini mungkin telah berubah. Jika Android
Studio melaporkan pustaka yang lebih baru, perbarui nomor untuk merefleksikan versi saat ini.
dependencies {
// Required -- JUnit 4 framework
testCompile 'junit:junit:4.12'
// Optional -- hamcrest matchers
testCompile 'org.hamcrest:hamcrest-library:1.3'
// Optional -- Mockito framework
testCompile 'org.mockito:mockito-core:1.10.19'
}
Runner pengujian adalah pustaka atau serangkaian alat (bantu) yang memungkinkan pengujian
terjadi dan hasilnya dicetak ke log. Proyek Android Anda memiliki akses ke runner pengujian
JUnit dasar sebagai bagian dari JUnit4 API. Pustaka dukungan pengujian Android menyertakan
runner pengujian untuk pengujian instrumentasi dan Espresso, AndroidJUnitRunner, yang juga
mendukung Junit 3 dan 4.
Bab ini hanya memperagakan runner default untuk pengujian unit. Untuk menyetel
AndroidJUnitRunner sebagai runner pengujian default di proyek Gradle Anda, tambahkan
dependensi berikut ke file build.gradle. Mungkin sudah ada dependensi di bagian defaultConfig.
Jika demikian, tambahkan baris testInstrumentationRunner ke bagian tersebut.
android {
defaultConfig {
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
}
Untuk membuat file kelas pengujian baru, tambahkan file Java ke set sumber pengujian proyek
Anda. File kelas pengujian untuk pengujian unit biasanya diberi nama untuk kelas dalam aplikasi
yang diuji, dengan ditambahkan "Test". Misalnya, jika Anda memiliki kelas yang disebut
Calculator di aplikasi, kelas untuk pengujian unit akan menjadi CalculatorTest.
1. Luaskan folder java dan folder untuk set sumber pengujian aplikasi. File kelas pengujian
unit yang ada akan ditampilkan.
2. Klik-kanan pada folder set sumber pengujian dan pilih New > Java Class.
3. Beri nama file dan klik OK.
Gunakan sintaks dan anotasi JUnit 4 untuk menulis pengujian Anda. Misalnya, kelas pengujian
yang ditampilkan di bawah ini menyertakan anotasi berikut:
Untuk informasi selengkapnya tentang Anotasi JUnit, lihat Dokumentasi Referensi JUnit.
@RunWith(JUnit4.class)
@SmallTest
public class CalculatorTest {
private Calculator mCalculator;
// Set up the environment for testing
@Before
public void setUp() {
mCalculator = new Calculator();
}
Untuk informasi selengkapnya tentang pernyataan, lihat dokumentasi referensi JUnit untuk kelas
Assert. Untuk informasi selengkapnya tentang kerangka kerja hamcrest, lihat Tutorial Hamcrest.
Perhatikan, metode addTwoNumbers() dalam contoh ini hanya menyertakan satu pernyataan.
Aturan umum pengujian unit adalah untuk menyediakan metode pengujian terpisah bagi setiap
pernyataan individual. Pengelompokan lebih dari satu pernyataan menjadi metode tunggal bisa
membuat pengujian Anda lebih sulit di-debug jika hanya satu pernyataan yang gagal, dan
mengaburkan pengujian yang berhasil.
Untuk menjalankan pengujian tunggal, klik-kanan metode pengujian tersebut dan pilih
Run.
Untuk menguji semua metode di kelas pengujian, klik-kanan file pengujian di tampilan
proyek dan pilih Run.
Untuk menjalankan semua pengujian di sebuah direktori, klik-kanan pada direktori dan
pilih Run tests.
Proyek akan membangun, jika perlu, dan tampilan pengujian akan muncul di bagian bawah layar.
Jika semua pengujian yang dijalankan berhasil, bilah kemajuan di bagian atas tampilan akan
berubah menjadi hijau. Pesan status di footer juga melaporkan "Tests Passed".
Praktik Terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui Selengkapnya
Praktik Terbaik untuk Pengujian
Memulai Pengujian
Membangun Pengujian Unit Lokal
Laman Beranda JUnit 4
Referensi JUnit 4 API
Laman Beranda Mockito
Dukungan Pengujian Android - Pola Pengujian (video)
Codelab Pengujian Android
Android Tools Protip: Anotasi Ukuran Pengujian
[Manfaat Menggunakan assertThat dibandingkan Metode Pern
yataan lainnya dalam Pengujian Unit](https://objectpartners.com/2013/09/18/the-
benefits-of-using-assertthat-over-other-assert-methods-in-unit-tests/)
Pengantar
Tentang Pustaka Dukungan Android
Pustaka dan fitur dukungan
Mempersiapkan dan Menggunakan Pustaka Dukungan Android
Praktik Terkait
Ketahui Selengkapnya
Di bab ini Anda akan mendalami Pustaka Dukungan Android, bagian dari alat (bantu) Android
SDK. Anda bisa menggunakan Pustaka Dukungan Android untuk versi yang kompatibel-mundur
dari fitur Android dan untuk elemen UI tambahan serta fitur yang tidak disertakan dalam
kerangka kerja Android standar.
Catatan: Pustaka Dukungan Android adalah paket yang berbeda dari pustaka Dukungan
Pengujian Android yang telah Anda pelajari di bab sebelumnya. Pustaka dukungan pengujian
menyediakan alat (bantu) dan API hanya untuk pengujian, sedangkan pustaka dukungan yang
lebih umum menyediakan fitur dari semua jenis (namun tidak ada pengujian).
Fitur
Kompatibilitas Mundur
Pustaka dukungan memungkinkan aplikasi berjalan pada versi platform Android lama untuk
mendukung fitur yang tersedia pada versi platform yang lebih baru. Misalnya, aplikasi yang
berjalan pada versi Android di bawah 5.0 (API level 21) yang bergantung pada kelas kerangka
kerja tidak bisa menampilkan elemen Desain Material, karena versi kerangka kerja Android
tersebut tidak mendukung Desain Material. Akan tetapi, jika aplikasi menyertakan pustaka v7
appcompat, aplikasi tersebut akan memiliki akses ke banyak fitur yang tersedia di API level 21,
termasuk dukungan untuk Desain Material. Hasilnya, aplikasi Anda bisa memberikan
pengalaman yang lebih konsisten di beragam versi platform yang lebih luas.
API pustaka dukungan juga menyediakan layer kompatibilitas di antara versi API kerangka kerja
yang berbeda. Layer kompatibilitas ini secara transparan mencegat panggilan API dan mengubah
argumen yang diteruskan, menangani operasi itu sendiri, atau mengalihkan operasi. Dalam hal
pustaka dukungan, dengan menggunakan metode layer kompatibilitas, Anda bisa memastikan
interoperabilitas antara rilis Android lama dan baru. Setiap rilis Android baru akan
menambahkan kelas dan metode baru, dan mungkin tidak lagi menggunakan beberapa kelas dan
metode lama. Pustaka dukungan menyertakan kelas kompatibilitas yang bisa digunakan untuk
kompatibilitas mundur. Anda bisa mengidentifikasi kelas ini berdasarkan namanya karena
namanya menyertakan kata "Compat" (seperti ActivityCompat).
Bila aplikasi memanggil salah satu metode kelas dukungan, perilaku metode tersebut akan
bergantung pada versi Android yang mendasarinya. Jika perangkat menyertakan fungsionalitas
kerangka kerja yang diperlukan, pustaka dukungan akan menggunakan kerangka kerja. Jika
perangkat menjalankan Android versi lama, pustaka dukungan akan berupaya
mengimplementasikan perilaku kompatibel yang serupa dengan API yang tersedia.
Untuk sebagian besar kasus, Anda tidak perlu menulis kode rumit yang memeriksa versi Android
dan menjalankan operasi yang berbeda berdasarkan versi itu. Anda bisa mengandalkan pustaka
dukungan untuk melakukan pemeriksaan itu dan memilih perilaku yang sesuai.
Bila ragu, pilih kelas kompatibilitas pustaka dukungan daripada kelas kerangka kerja.
Versi
Setiap paket di pustaka dukungan memiliki nomor versi dalam tiga bagian (X.Y.Z) yang sesuai
dengan level Android API, dan dengan revisi tertentu pustaka itu. Misalnya, nomor versi pustaka
dukungan 22.3.4 adalah versi pustaka dukungan 3.4 untuk API 22.
Sebagai aturan umum, gunakan pustaka dukungan versi terbaru untuk API yang dikompilasi dan
ditargetkan aplikasi Anda, atau versi yang lebih baru. Misalnya, jika aplikasi Anda menargetkan
API 25, gunakan pustaka dukungan versi 25.X.X.
Kapan saja Anda bisa menggunakan pustaka dukungan yang lebih baru daripada pustaka
dukungan untuk API yang ditargetkan. Misalnya, jika aplikasi menargetkan API 22, Anda bisa
menggunakan pustaka dukungan versi 25 atau yang lebih tinggi. Hal sebaliknya tidak berlaku—
Anda tidak bisa menggunakan pustaka dukungan lama bersama API yang lebih baru. Sebagai
aturan umum, Anda harus mencoba menggunakan API dan pustaka dukungan terbaru di aplikasi.
Level API
Selain nomor versi yang sebenarnya, nama pustaka dukungan itu sendiri menunjukkan API level
yang kompatibel-mundur dengan pustaka. Anda tidak bisa menggunakan pustaka dukungan di
aplikasi untuk API yang lebih tinggi daripada API minimum yang didukung oleh aplikasi Anda.
Misalnya, jika API minimum yang didukung aplikasi adalah 10, Anda tidak bisa menggunakan
pustaka dukungan v13 atau pustaka dukungan preferensi V14 di aplikasi. Jika aplikasi Anda
menggunakan beberapa pustaka dukungan, API minimum harus lebih tinggi daripada nomor
terbesar, yakni jika Anda menyertakan pustaka dukungan untuk v7, v13, dan V14, API minimum
Anda setidaknya harus 14.
Semua pustaka dukungan, termasuk pustaka v4 dan v7, memerlukan SDK minimum API 9.
Pustaka dukungan v4
Pustaka dukungan v4 menyertakan rangkaian API terbesar dibandingkan dengan pustaka lainnya,
termasuk dukungan untuk komponen aplikasi, fitur antarmuka pengguna, aksesibilitas,
penanganan data, konektivitas jaringan, dan utilitas pemrograman.
Pustaka dukungan v7
Pustaka dukungan v7 menyertakan semua pustaka dukungan v4, sehingga Anda tidak perlu
menambahkannya secara terpisah. Dependensi pada pustaka dukungan v7 disertakan di setiap
proyek Android Studio baru, dan aktivitas baru di proyek Anda yang meluaskan dari
AppCompatActivity.
Pustaka lainnya
1. Unduh pustaka dukungan dengan Android SDK Manager, atau verifikasi apakah pustaka
dukungan sudah tersedia.
2. Temukan pernyataan dependensi pustaka untuk pustaka dukungan yang mungkin Anda
minati.
3. Tambahkan pernyataan dependensi itu ke file build.gradle.
Anda mungkin sudah mengunduh dan memasang pustaka dukungan Android bersama Android
Studio. Untuk memverifikasi apakah Anda telah memiliki pustaka dukungan yang tersedia, ikuti
langkah-langkah ini:
1. Di Android Studio, pilih Tools > Android > SDK Manager, atau klik ikon SDK
Manager .
Panel preferensi SDK Manager akan muncul.
2. Klik tab SDK Tools dan luaskan Support Repository.
3. Cari Android Support Repository dalam daftar.
o Jika Installed muncul di kolom Status, berarti Anda sudah siap. Klik Cancel.
o Jika Not installed atau Update Available muncul, klik kotak centang di sebelah
Android Support Repository. Ikon unduhan akan muncul di sebelah kotak
centang. Klik OK.
4. Klik OK lagi, kemudian Finish bila repositori dukungan telah dipasang.
Untuk menyediakan akses ke pustaka dukungan dari proyek Anda, tambahkan pustaka tersebut
ke file pembangunan gradle sebagai dependensi. Pernyataan dependensi memiliki format khusus
yang menyertakan nama dan nomor versi pustaka.
Nomor versi di akhir baris mungkin berbeda dari yang ditampilkan di atas. Anda akan
memperbarui nomor versi bila menambahkan dependensi ke file build.gradle di langkah
berikutnya.
Skrip gradle untuk proyek Anda mengelola cara aplikasi dibangun, termasuk menetapkan
dependensi yang dimiliki aplikasi di pustaka lainnya. Untuk menambahkan pustaka dukungan ke
proyek Anda, modifikasi file pembangunan gradle untuk menyertakan dependensi ke pustaka
yang ditemukan di bagian sebelumnya.
1. Di Android Studio, pastikan panel Project terbuka dan tab Android diklik.
2. Luaskan Gradle Scripts, jika perlu, dan buka file build.gradle (Modul: app).
Bagian dependensi untuk proyek baru mungkin sudah menyertakan dependensi sejumlah
pustaka lainnya.
4. Tambahkan dependensi untuk pustaka dukungan yang menyertakan pernyataan yang
disalin dalam tugas sebelumnya. Misalnya, dependensi lengkap pada pustaka dukungan
desain terlihat seperti ini:
5. compile 'com.android.support:design:23.3.0'
6. Perbarui nomor versi, jika perlu.
Jika nomor versi yang Anda tetapkan lebih rendah dari nomor versi pustaka yang tersedia
saat ini, Android Studio akan memperingatkan bahwa versi yang diperbarui telah
tersedia. ("a newer version of com.android.support:design is available"). Edit nomor
versi ke versi yang diperbarui, atau tekan Shift+Enter dan pilih "Change to XX.X.X",
dalam hal ini XX.X.X adalah nomor versi yang diperbarui.
7. Klik Sync Now untuk menyinkronkan file gradle yang diperbarui bersama proyek, jika
dikonfirmasi.
Kelas-kelas Pustaka Dukungan yang menyediakan dukungan untuk API kerangka kerja yang ada
biasanya memiliki nama yang sama dengan kelas kerangka kerja namun berada di paket kelas
android.support. Pastikan bila mengimpor kelas, Anda menggunakan nama paket yang benar
untuk kelas yang diminati. Misalnya, saat menerapkan kelas ActionBar, gunakan salah satu dari:
Pustaka dukungan juga menyertakan sejumlah kelas View yang digunakan dalam file layout
XML. Dalam kasus tampilan, Anda harus selalu menggunakan nama yang benar-benar
memenuhi syarat tampilan itu dalam elemen XML untuk tampilan itu:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</android.support.design.widget.CoordinatorLayout>
Catatan: Anda akan mempelajari tentang CoordinatorLayout dalam bab berikutnya.
Praktik Terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui Selengkapnya
Pustaka Dukungan Android (pengantar)
Persiapan Pustaka Dukungan
Fitur Pustaka Dukungan
Mendukung Versi Platform Berbeda
Memilih compileSdkVersion, minSdkVersion, dan targetSdkVersion
Semua Tentang Compat
Referensi API (semua paket yang dimulai dengan android.support)
Menggunakan tombol
Masukan teks
Mengenali isyarat
Praktik terkait
Ketahui selengkapnya
Dalam bab ini, Anda akan mempelajari cara mendesain interaksi pengguna suatu aplikasi—
tombol yang diperlukan untuk memicu tindakan, dan bidang entri teks untuk masukan pengguna.
Dalam mendesain, Anda perlu mengantisipasi apa yang mungkin perlu dilakukan pengguna, dan
memastikan bahwa UI memiliki elemen yang mudah diakses, dimengerti, dan digunakan. Saat
aplikasi Anda perlu mengambil data dari pengguna, buatlah mudah dan jelas. Berikan pengguna
bantuan apa pun yang memungkinkan untuk menyediakan data masukan, misalnya
mengantisipasi sumber data, meminimalkan jumlah isyarat pengguna (seperti ketukan dan
gesekan), dan formulir yang sudah diisi jika memungkinkan.
Pastikan aplikasi Anda intuitif; yaitu, aplikasi harus bekerja seperti yang diharapkan oleh
pengguna. Saat menyewa mobil, Anda mengharapkan roda, persneling, lampu utama, dan
indikator ada di tempat tertentu. Saat masuk suatu ruangan, Anda mengharapkan sakelar lampu
ada di tempat tertentu. Saat memulai aplikasi, pengguna mengharapkan tombol dapat diklik,
spinner untuk menampilkan menu tarik-turun, dan bidang pengeditan teks untuk menampilkan
keyboard di layar saat mengetuk di dalamnya. Jangan rusak harapan yang sudah mapan, atau
Anda akan menyulitkan pengguna dalam menggunakan aplikasi tersebut.
Catatan: Pengguna Android telah familier dengan elemen UI yang berfungsi dengan cara tertentu, jadi
Anda perlu konsisten dengan pengalaman aplikasi Android lain, dan pilihan Anda serta layout-nya harus
dapat diprediksi. Dengan demikian, Anda akan membuat aplikasi yang memuaskan pelanggan.
Bab ini memperkenalkan kontrol masukan Android, yaitu komponen interaktif dalam antarmuka
pengguna aplikasi Anda. Anda bisa menggunakan berbagai kontrol masukan dalam UI Anda,
seperti bidang teks, tombol, kotak centang, tombol radio, tombol beralih, spinner, dan lain-lain.
1. Tombol
2. Bidang teks
3. Bilah telusur
4. Kotak centang
5. Tombol radio
6. Beralih
7. Spinner
Untuk keterangan singkat setiap kontrol masukan, lihat Kontrol Masukan dalam dokumentasi
developer.
Jika ada banyak komponen masukan UI dalam aplikasi Anda, manakah yang pertama mendapat
masukan dari pengguna? Misalnya, jika Anda memiliki sejumlah objek TextView dan objek
EditText dalam aplikasi, komponen UI mana (yaitu, Tampilan yang mana) yang pertama
menerima teks yang diketikkan pengguna?
Tampilan yang "memiliki fokus" adalah komponen yang menerima masukan pengguna.
Fokus menunjukkan tampilan mana yang saat ini dipilih untuk menerima masukan. Fokus bisa
dimulai oleh pengguna dengan menyentuh sebuah Tampilan, seperti objek TextView atau
EditText. Anda bisa mendefinisikan urutan fokus yang memandu pengguna dari kontrol UI ke
kontrol UI menggunakan tombol Return, tombol Tab, atau tanda panah. Fokus juga bisa
dikontrol lewat program; programmer bisa requestFocus() pada setiap Tampilan yang bisa
difokus.
Atribut lain dari kontrol masukan adalah clickable. Jika atribut ini (boolean) true, maka
Tampilan bisa bereaksi pada kejadian klik. Karena dengan fokus, clickable bisa dikontrol lewat
program.
Perbedaan antara bisa diklik dan bisa difokus adalah bahwa dapat diklik berarti tampilan bisa
diklik atau diketuk, sementara bisa difokus berarti tampilan dimungkinkan untuk mendapat fokus
dari perangkat masukan seperti keyboard. Perangkat masukan seperti keyboard tidak bisa
menentukan ke tampilan mana kejadian masukan mereka dikirim, jadi mereka mengirimnya ke
tampilan yang memiliki fokus.
Metode masukan perangkat Android menjadi sangat beragam: tombol arah, trackball, layar
sentuh, keyboard, dan masih banyak lagi. Navigasi utama beberapa perangkat, seperti tablet dan
ponsel cerdas, adalah dengan sentuhan. Perangkat lain, seperti Google TV, tidak memiliki layar
sentuh atau semacamnya dan bergantung pada perangkat masukan seperti tombol arah (d-pad).
Saat pengguna mengarahkan melalui antarmuka pengguna dengan perangkat masukan seperti
tombol arah atau trackball, Anda perlu:
Secara visual perjelas tampilan mana yang memiliki fokus, sehingga pengguna tahu di mana
harus melakukan masukan.
Setel fokus secara eksplisit dalam kode Anda untuk menyediakan jalur kepada pengguna dalam
menyusuri elemen masukan dengan menggunakan tombol arah atau trackball.
Dalam sebagian besar kasus, Anda tidak perlu mengontrol fokus sendiri, kecuali jika Anda ingin
menyediakan serangkaian bidang masukan teks dan Anda ingin pengguna dapat berpindah dari
satu bidang ke bidang berikutnya dengan mengetuk tombol Return atau Tab. Android
menyediakan "mode sentuh" untuk perangkat yang bisa disentuh, seperti ponsel cerdas dan
tablet. Saat pengguna mulai berinteraksi dengan antarmuka pengguna dengan menyentuhnya,
hanya Tampilan dengan isFocusableInTouchMode() yang disetel ke true yang bisa difokus,
seperti bidang masukan teks. Tampilan lain yang dapat disentuh, seperti tombol, tidak dapat
mengambil fokus saat disentuh. Jika pengguna menekan tombol arah atau menggulir trackball,
perangkat keluar dari "mode sentuh" dan mencari tampilan untuk mengambil fokus.
Gerakan fokus berdasarkan algoritme yang mencari tetangga terdekat pada arah yang ditentukan:
Saat pengguna menyentuh layar, tampilan paling atas di bawah sentuhan berada dalam fokus,
menyediakan akses-sentuh untuk tampilan anak dari tampilan paling atas.
Jika Anda menyetel tampilan EditText ke satu baris tunggal, pengguna bisa mengetuk tombol
Return pada keyboard untuk menutup keyboard dan memindah fokus ke tampilan kontrol
masukan berikutnya berdasarkan apa yang ditemukan sistem Android:
o Sistem biasanya mencari kontrol masukan terdekat pada arah yang sama dengan yang
diarahkan pengguna (atas, bawah, kiri, atau kanan).
o Jika ada beberapa kontrol masukan yang berdekatan dan pada arah yang sama, sistem
akan memindai dari kiri ke kanan, atas ke bawah.
Fokus juga bisa dipindah ke tampilan yang berbeda jika pengguna berinteraksi dengan kontrol
arah, seperti tombol arah (d-pad) atau trackball.
Anda bisa mempengaruhi cara Android menangani fokus dengan mengatur kontrol masukan
seperti elemen EditText pada layout tertentu dari kiri ke kanan dan atas ke bawah, sehingga
fokus berpindah dari satu elemen ke elemen lainnya dalam urutan yang Anda inginkan.
Jika algoritme tidak menghasilkan apa yang Anda inginkan, Anda bisa menggantinya dengan
menambahkan atribut XML nextFocusDown, nextFocusLeft, nextFocusRight, dan
nextFocusUp pada file layout.
1. Tambahkan salah satu atribut ini pada suatu tampilan untuk menentukan ke mana harus pergi
setelah meninggalkan tampilan tersebut—dengan kata lain, tampilan mana yang harus menjadi
tampilan berikutnya.
2. Definisikan nilai atribut menjadi id pada tampilan berikutnya. Misalnya:
3. <LinearLayout
4. android:orientation="vertical"
5. ... >
6. <Button android:id="@+id/top"
7. android:nextFocusUp="@+id/bottom"
8. ... />
9. <Button android:id="@+id/bottom"
10. android:nextFocusDown="@+id/top"
11. ... />
12. </LinearLayout>
Umumnya dalam LinearLayoutvertikal, mengarahkan ke atas dari Button pertama, tidak akan
bergerak ke mana pun, begitu juga mengarahkan ke bawah dari Buttonyang kedua. Namun
dalam contoh di atas, Button atas telah mendefinisikan button bawah sebagai nextFocusUp
(dan sebaliknya), sehingga fokus navigasi akan silih berganti dari atas ke bawah dan bawah ke
atas.
Jika Anda ingin mendeklarasikan Tampilan sebagai bisa difokus dalam UI (yang biasanya tidak),
tambahkan atribut XML android:focusable ke Tampilan di layout, dan setel nilainya ke true.
Anda juga bisa mendeklarasikan Tampilan sebagai bisa difokus saat dalam "mode sentuh"
dengan android:focusableInTouchMode yang disetel ke true.
Anda juga bisa secara eksplisit menyetel fokus atau mencari tampilan yang memiliki fokus
dengan menggunakan metode berikut:
Untuk menemukan tampilan dalam hierarki yang saat ini memiliki fokus, gunakan findFocus().
Untuk mengubah apakah suatu tampilan bisa mengambil fokus, panggil setFocusable.
Untuk menyetel listener yang akan mendapat notifikasi saat tampilan mendapat atau kehilangan
fokus, gunakan setOnFocusChangeListener.
Memahami fokus terkait kontrol masukan penting untuk memahami cara kerja keyboard di layar
dengan tampilan pengeditan teks. Misalnya, mengetuk tombol Return pada keyboard bisa
memasukkan baris baru atau melanjutkan fokus ke tampilan berikutnya, bergantung pada atribut
yang Anda gunakan dengan tampilan EditText. Anda akan mengetahui selengkapnya tentang
fokus dengan tampilan pengeditan teks di bab ini nanti.
Menggunakan tombol
Orang suka menekan tombol.Tampilkan tombol merah besar pada seseorang dengan pesan yang
berbunyi "Jangan tekan", maka kemungkinan orang tersebut akan menekannya hanya untuk
merasakan kesenangan saat menekan tombol merah besar (larangan menekan tombol juga
menjadi penyebabnya).
Hanya teks, seperti yang ditampilkan pada sisi kiri gambar di bawah ini.
Hanya ikon, seperti yang ditampilkan di tengah gambar di bawah ini.
Teks dan ikon sekaligus, seperti yang ditampilkan pada sisi kanan gambar di bawah ini.
Bila disentuh atau diklik, tombol akan melakukan suatu aksi. Teks dan/atau ikon menyediakan
petunjuk mengenai aksi itu. Ini disebut "tombol-tekan" dalam dokumentasi Android.
Tombol adalah suatu persegi atau persegi bersudut tumpul, dengan alas lebih lebar daripada
tingginya, dengan teks deskriptif di tengahnya. Tombol Android mengikuti panduan dalam
Spesifikasi Desain Material Android—Anda akan mengetahui selengkapnya tentang hal ini pada
pelajaran selanjutnya.
Android menawarkan sejumlah tipe tombol, termasuk tombol timbul dan tombol datar seperti
yang ditampilkan dalam gambar di bawah ini. Tombol-tombol ini memiliki tiga keadaan: normal,
Tombol timbul adalah persegi atau persegi bersudut tumpul yang tampak terangkat dari layar—
bayangan di sekitarnya menunjukkan bahwa tombol ini bisa disentuh atau diklik. Tombol timbul
bisa menampilkan teks atau ikon, atau menampilkan teks dan ikon sekaligus.
Untuk menggunakan tombol timbul yang sesuai dengan Spesifikasi Desain Material, ikuti
langkah-langkah ini:
1. Dalam file build.gradle (Modul: app) Anda, tambahkan pustaka appcompat terbaru ke
bagian dependencies :
2. compile 'com.android.support:appcompat-v7:x.x.x.'
Di atas, x.x.x. adalah nomor versi. Jika nomor versi yang Anda tetapkan lebih rendah dari
nomor versi pustaka yang tersedia saat ini, Android Studio akan memperingatkan Anda
("a newer version is available"). Perbarui nomor versi ke versi yang disebutkan Android
Studio untuk digunakan.
Gunakan tombol timbul untuk lebih menonjolkan tindakan di layout dengan berbagai macam
materi. Tombol timbul menambahkan dimensi pada layout datar—tombol tersebut menekankan
fungsi pada ruang yang penuh atau longgar. Tombol timbul menampilkan bayangan latar
belakang saat disentuh (ditekan) atau diklik, seperti yang ditampilkan di bawah ini.
1. Keadaan normal: Dalam keadaan normal, tombol tampak seperti tombol timbul.
2. Keadaan dinonaktifkan: Bila dinonaktifkan, tombol akan berwarna abu-abu dan tidak aktif dalam
konteks aplikasi. Di sebagian besar kasus, Anda akan menyembunyikan tombol nonaktif, namun
kadang Anda ingin menampilkannya sebagai dinonaktifkan.
3. Keadaan ditekan: Keadaan ditekan, dengan bayangan latar belakang lebih besar, menunjukkan
bahwa tombol sedang disentuh atau diklik. Bila Anda memasang callback ke tombol (seperti
atribut OnClick), callback akan dipanggil saat tombol dalam keadaan ini.
Beberapa tombol timbul paling baik didesain sebagai teks, tanpa ikon, seperti tombol "Save",
karena ikon saja tidak menyampaikan makna yang jelas. Untuk membuat tombol timbul dengan
teks, gunakan kelas Button, yang memperluas kelas TextView.
Untuk membuat tombol timbul dengan teks saja, gunakan kelas Button di layout XML Anda
seperti berikut:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
... />
Praktik terbaik terkait tombol teks adalah mendefinisikan satu kata yang sangat pendek sebagai
sumber daya string (button_text dalam contoh di atas), sehingga string bisa diterjemahkan.
Misalnya, "Save" bisa diterjemahkan ke dalam bahasa Prancis sebagai "Enregister" tanpa
mengubah kode.
Walaupun tombol biasanya menampilkan teks yang memberi tahu pengguna fungsi tombol
tersebut, tombol timbul juga bisa menampilkan ikon beserta teks.
Memilih ikon
Untuk memilih gambar ikon standar yang diubah ukurannya untuk berbagai tampilan, ikuti
langkah-langkah ini:
1. Luaskan app > res dalam tampilan Project, dan klik-kanan (atau klik Command) drawable.
2. Pilih New > Image Asset. Dialog Configure Image Asset akan muncul.
3. Pilih Action Bar and Tab Items dalam menu tarik-turun dialog Configure Image Asset (lihat Image
Asset Studio untuk keterangan lengkap dialog ini.)
4. Klik gambar Clipart: (logo Android) untuk memilih gambar clipart sebagai ikon. Laman ikon akan
muncul seperti yang ditampilkan di bawah ini. Klik ikon yang ingin Anda gunakan.
o Pilih HOLO_DARK dari menu tarik-turun Theme untuk menyetel ikon menjadi putih
dengan latar belakang berwarna gelap (atau hitam).
o Bergantung pada bentuk ikon, Anda mungkin ingin menambahkan pengisi pada ikon
sehingga ikon tidak memenuhi teks. Seret slider Padding ke kanan untuk menambahkan
lapisan lebih banyak.
6. Klik Next, kemudian klik Finish dalam dialog Confirm Icon Path. Nama ikon seharusnya sekarang
muncul di folder app > res > drawable.
Gambar vektor ikon standar diubah ukurannya secara otomatis untuk ukuran tampilan perangkat
yang berbeda. Untuk memilih gambar vektor, ikuti langkah-langkah ini:
1. Luaskan app > res pada tampilan Project, dan klik-kanan (atau klik Command) drawable.
2. Pilih New > Vector Asset untuk ikon yang mengubah ukurannya sendiri secara otomatis untuk
setiap tampilan.
3. Dialog Vector Asset Studio muncul untuk aset vektor. Klik tombol radio Material Icon, kemudian
klik tombol Choose untuk memilih ikon dari spesifikasi Desain Material (lihat Tambahkan Grafik
Vektor Multi-Kepadatan untuk keterangan lengkap mengenai dialog ini).
4. Klik Next setelah memilih ikon, dan klik Finish untuk menyelesaikan. Nama ikon seharusnya
sekarang muncul di folder app > res > drawable.
Untuk membuat tombol dengan teks dan ikon seperti yang ditampilkan dalam gambar di bawah
ini, gunakan Button dalam layout XML Anda. Tambahkan atribut android:drawableLeft
untuk menggambar ikon di sebelah kiri teks tombol, seperti yang ditampilkan dalam gambar di
bawah ini:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:drawableLeft="@drawable/button_icon"
... />
Jika ikon dipahami secara universal, Anda mungkin ingin menggunakannya sebagai ganti teks.
Untuk membuat tombol timbul hanya dengan ikon atau gambar (tanpa teks), gunakan kelas
ImageButton, yang memperluas kelas ImageView. Anda bisa menambahkan sebuah
ImageButton ke layout XML Anda seperti berikut:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/button_icon"
... />
Cara termudah untuk menampilkan tombol timbul yang lebih menonjol adalah menggunakan
warna latar belakang yang berbeda untuk tombol tersebut. Anda bisa menetapkan atribut
android:background dengan sumber daya warna atau sumber daya dapat digambar:
android:background="@color/colorPrimary"
Penampilan tombol Anda—warna latar belakang dan font—mungkin bervariasi antara satu
perangkat dengan perangkat lain, karena perangkat dari produsen yang berbeda sering kali
memiliki gaya default berbeda untuk kontrol masukan. Anda bisa mengontrol dengan tepat gaya
tombol dan kontrol masukan lainnya menggunakan tema yang Anda terapkan untuk seluruh
aplikasi.
Misalnya, untuk memastikan bahwa semua perangkat yang bisa menjalankan tema Holo akan
menggunakan tema Holo untuk aplikasi Anda, deklarasikan yang berikut ini dalam elemen
<application> file AndroidManifest.xml:
android:theme="@android:style/Theme.Holo"
Aplikasi yang didesain untuk Android 4.0 dan yang lebih tinggi juga bisa menggunakan keluarga
tema publik DeviceDefault. Tema DeviceDefault adalah nama lain untuk tampilan dan cara kerja
perangkat. Keluarga tema dan keluarga gaya widget DeviceDefault menawarkan berbagai cara
bagi developer untuk menargetkan tema asli perangkat dengan semua intact penyesuaian.
Untuk aplikasi Android yang menjalankan versi 4.0 dan yang lebih baru, Anda memiliki opsi
berikut:
Gunakan sebuah tema, misalnya salah satu tema Holo, sehingga aplikasi Anda memiliki
penampilan yang sama di semua perangkat Android yang menjalankan versi 4.0 atau yang lebih
baru. Dalam kasus ini, penampilan aplikasi tidak berubah saat dijalankan pada perangkat dengan
kulit default atau kulit khusus yang berbeda.
Gunakan salah satu tema DeviceDefault sehingga aplikasi Anda tampil dengan kulit default
perangkat.
Jangan gunakan tema, tetapi Anda mungkin akan mendapatkan hasil yang tidak dapat diprediksi
pada beberapa perangkat.
Jika Anda tidak familier dengan sistem tema dan gaya Android, Anda harus membaca Gaya dan
Tema. Entri blog "Holo Everywhere" menyediakan informasi tentang cara menggunakan tema
Holo dengan tetap mendukung perangkat lama.
Sebagai panduan penataan gaya dan penyesuaian tombol menggunakan XML, lihat Tombol (di
bagian "Antarmuka Pengguna" panduan developer Android). Untuk panduan komprehensif
dalam mendesain tombol, lihat "Komponen - Tombol" dalam Spesifikasi Desain Material.
Tombol datar, disebut juga dengan tombol tanpa bingkai, adalah tombol teks saja yang muncul
datar di layar tanpa bayangan. Manfaat utama tombol datar adalah kemudahan — tombol ini
meminimalkan gangguan dari materi. Tombol datar berguna saat Anda memiliki sebuah dialog,
seperti yang ditampilkan dalam gambar di bawah ini, yang memerlukan interaksi atau masukan
pengguna. Dalam hal ini, Anda mungkin perlu memiliki gaya dan font yang sama dengan teks
sekitar tombol. Tombol ini menjaga tampilan dan cara kerja tetap sama di semua elemen dalam
dialog.
Tombol datar, yang ditampilkan di bawah ini, menyerupai tombol dasar kecuali dalam hal tidak
adanya bingkai atau latar belakang, tetapi tetap mengubah penampilan dalam keadaan yang
berbeda. Sebuah tombol datar menampilkan bayangan tinta di sekitarnya bila ditekan (disentuh
atau diklik).
1. Keadaan normal: Dalam keadaan normal, tombol tampak seperti teks pada umumnya.
2. Keadaan dinonaktifkan: Saat teks berwarna abu-abu, tombol tidak aktif dalam konteks aplikasi.
3. Keadaan ditekan: Keadaan ditekan, dengan bayangan latar belakang, menunjukkan bahwa
tombol sedang disentuh atau diklik. Jika Anda memasang callback pada tombol tersebut
(misalnya atribut android:onClick ). callback akan dipanggil jika tombol dalam keadaan ini.
Catatan: Jika Anda menggunakan tombol datar dalam sebuah layout, pastikan untuk
menggunakan lapisan untuk membedakannya dari teks yang mengelilinginya, agar pengguna
mudah melihatnya.
Untuk membuat tombol datar, gunakan kelas Button. Tambahkan sebuah Button ke layout XML
Anda, dan terapkan "?android:attr/borderlessButtonStyle" sebagai atribut style :
<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage"
style="?android:attr/borderlessButtonStyle" />
Anda bisa mengubah Tampilan apa pun, seperti ImageView, menjadi sebuah tombol dengan
menambahkan atribut android:onClick dalam layout XML. Gambar untuk ImageView harus
sudah disimpan dalam folder drawables proyek Anda.
Catatan: Untuk memasukkan gambar ke dalam proyek Android Studio Anda, buat atau simpan gambar
dalam format JPEG, lalu salin file gambar ke dalam folder app > src > main > res > drawables proyek
Anda. Untuk informasi selengkapnya tentang sumber daya dapat digambar, lihat Sumber Daya Dapat
Digambar dalam bagian Sumber Daya Aplikasi pada Panduan Developer Android.
Jika Anda menggunakan beberapa gambar sebagai tombol, atur gambar dalam sebuah viewgroup
sehingga dikelompokkan bersama. Misalnya, gambar berikut dalam folder drawable
(icecream_circle.jpg, donut_circle.jpg, dan froyo_circle.jpg) didefinisikan untuk ImageView
yang dikelompokkan dalam LinearLayout dan disetel ke orientasi horizontal, sehingga gambar-
gambar tersebut muncul bersebelahan:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="260dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icecream_circle"
android:onClick="orderIcecream"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/donut_circle"
android:onClick="orderDonut"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/froyo_circle"
android:onClick="orderFroyo"/>
</LinearLayout>
Tombol aksi mengambang, yang ditampilkan di bawah ini sebagai #1 dalam gambar di bawah,
adalah tombol bundar yang muncul mengambang di atas layout.
Anda harus menggunakan tombol aksi mengambang hanya untuk menyatakan aksi utama suatu
layar. Misalnya, aksi utama untuk layar utama aplikasi Kontak adalah menambahkan kontak,
seperti yang ditampilkan dalam gambar di atas. Tombol aksi mengambang adalah pilihan tepat
jika aplikasi Anda mengharuskan suatu aksi yang persisten dan siap tersedia di layar. Hanya satu
tombol aksi mengambang yang disarankan untuk setiap layar.
Tombol aksi mengambang menggunakan tipe ikon yang sama yang Anda gunakan untuk tombol
dengan ikon, atau untuk tindakan pada bilah aplikasi di bagian atas layar. Anda bisa
menambahkan sebuah ikon sebagaimana dijelaskan sebelumnya dalam "Memilih ikon untuk
tombol".
Untuk menggunakan tombol aksi mengambang di proyek Android Studio, Anda harus
menambahkan pernyataan berikut ke file build.gradle (Modul: app) di bagian dependencies :
compile 'com.android.support:design:23.4.0'
Catatan: Nomor versi di akhir pernyataan bisa berubah; gunakan versi terbaru yang disarankan Android
Studio.
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_fab_chat_button_white" />
Tombol aksi mengambang secara default berukuran 56 x 56 dp. Ini adalah ukuran default terbaik
untuk digunakan, kecuali jika Anda membutuhkan versi yang lebih kecil untuk membuat
kontinuitas visual dengan elemen layar lain.
Anda bisa menyetel ukuran mini (30 x 40) dengan atribut app:fabSize :
app:fabSize="mini"
app:fabSize="normal"
Untuk petunjuk desain selengkapnya yang melibatkan tombol aksi mengambang, lihat
Komponen–Tombol: Tombol Aksi Mengambang dalam Spesifikasi Desain Material.
Gunakan event listener yang disebut OnClickListener, yaitu antarmuka kelas View, untuk
merespons kejadian klik yang timbul saat pengguna mengetuk atau mengeklik objek dapat
diklik, seperti Button, ImageButton, atau FloatingActionButton. Untuk informasi selengkapnya
mengenai event listener, atau tipe kejadian UI lainnya, baca bagian Kejadian Masukan pada
Dokumentasi Developer Android.
Untuk mempersiapkan OnClickListener bagi objek yang dapat diklik dalam kode Aktivitas Anda
dan menempatkan sebuah metode callback, gunakan atribut android:onClick dengan elemen
objek yang dapat diklik dalam layout XML. Misalnya:
<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
Dalam hal ini, bila pengguna mengeklik tombol, sistem Android akan memanggil metode
sendMessage() Aktivitas:
Anda juga bisa menangani kejadian klik lewat program dengan menggunakan pola desain
tombol-listener (lihat gambar di bawah ini). Untuk informasi selengkapnya mengenai pola desain
"listener", lihat Membuat Listener Khusus.
Gunakan event listener View.OnClickListener, yaitu antarmuka pada kelas View yang terdiri dari
metode callback tunggal, onClick(). Metode ini dipanggil oleh kerangka kerja Android jika
tampilan dipicu oleh interaksi pengguna.
Event listener harus sudah didaftarkan pada tampilan agar dipanggil jika ada kejadian. Ikuti
langkah-langkah ini untuk mendaftarkan listener dan menggunakannya (lihat gambar di bawah
langkah-langkah):
1. Gunakan metode findViewById() dari kelas View untuk menemukan tombol dalam file layout
XML:
2. Button button = (Button) findViewById(R.id.button_send);
3. Dapatkan objek View.OnClickListener yang baru dan daftarkan ke tombol dengan
memanggil metode setOnClickListener(). Argumen untuk setOnClickListener()
memerlukan objek yang mengimplementasikan antarmuka View.OnClickListener, yang memiliki
satu metode: onClick().
4. button.setOnClickListener(new View.OnClickListener() {
5. ...
6. Definisikan metode onClick() sebagai public, kembalikan void, dan definisikan View
sebagai parameternya satu-satunya:
7. public void onClick(View v) {
8. // Do something in response to button click
9. }
10. Buat metode untuk melakukan sesuatu sebagai respons terhadap klik tombol, misalnya
melakukan suatu aksi.
Untuk menyetel listener klik lewat program, sebagai ganti dengan atribut onClick, sesuaikan
kelas View.OnClickListener dan ganti penangan onClick() untuk melakukan beberapa aksi,
seperti yang ditampilkan di bawah ini:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Add a new word to the wordList.
}
});
Kejadian lainnya bisa terjadi dengan elemen UI, dan Anda bisa menggunakan metode callback
yang sudah didefinisikan dalam antarmuka event listener untuk menanganinya. Metode tersebut
dipanggil oleh kerangka kerja Android jika tampilan—yang sudah didaftarkan listener—dipicu
oleh interaksi pengguna. Oleh karena itu, Anda harus menyetel listener yang sesuai untuk
menggunakan metode tersebut. Berikut ini adalah beberapa listener yang tersedia di kerangka
kerja Android dan metode callback yang terkait:
onTouch() dari View.OnTouchListener: Menangani segala bentuk kontak sentuh dengan layar
termasuk satu atau beberapa gerakan sentuh dan gerakan isyarat, termasuk isyarat menekan,
melepas, atau gerakan lain pada layar (dalam batas elemen UI). Suatu MotionEvent diteruskan
sebagai argumen, yang menyertakan informasi arah, dan mengembalikan boolean untuk
menunjukkan apakah listener Anda menggunakan kejadian ini.
onKey() dari View.OnKeyListener: Menangani bila sebuah tombol perangkat keras ditekan saat
tampilan memiliki fokus.
Kotak centang: Pilih satu atau beberapa nilai dari serangkaian nilai dengan mengeklik setiap
kotak centang nilai.
Tombol radio: Pilih satu nilai saja dari serangkaian nilai dengan mengeklik tombol "radio" bundar
nilai. Jika hanya menyediakan dua atau tiga pilihan, Anda mungkin ingin menggunakan tombol
radio untuk pilihan jika memiliki ruang di layout untuk tombol-tombol itu.
Tombol beralih: Pilih salah satu dari dua atau beberapa keadaan: Tombol beralih biasanya
menawarkan dua keadaan yang tampak, seperti "aktif" dan "nonaktif".
Spinner: Pilih satu nilai dari serangkaian nilai di menu tarik-turun. Hanya satu nilai yang bisa
dipilih. Spinner berguna untuk tiga atau beberapa pilihan, dan membutuhkan sedikit ruang di
layout Anda.
Kotak centang
Gunakan kotak centang jika Anda memiliki daftar pilihan dan pengguna boleh memilih berapa
pun pilihan, termasuk tanpa pilihan. Setiap kotak centang bersifat independen dari kotak centang
lain pada daftar tersebut, sehingga mencentang satu kotak tidak akan menghapus centang pada
kotak lainnya. (Jika Anda ingin membatasi pilihan pengguna menjadi satu item saja dari satu
rangkaian, gunakan tombol radio.) Pengguna bisa juga menghapus centang pada kotak centang.
Pengguna mengharapkan kotak centang muncul dalam daftar vertikal, seperti daftar kerja, atau
Setiap kotak centang adalah instance tersendiri dari kelas CheckBox. Anda membuat setiap kotak
centang menggunakan elemen CheckBox dalam layout XML Anda. Untuk membuat beberapa
kotak centang dengan orientasi vertikal, gunakan LinearLayout vertikal:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<CheckBox android:id="@+id/checkbox1_chocolate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chocolate_syrup" />
<CheckBox android:id="@+id/checkbox2_sprinkles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sprinkles" />
<CheckBox android:id="@+id/checkbox3_nuts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/crushed_nuts" />
</LinearLayout>
Umumnya, program mengambil keadaan kotak centang saat pengguna menyentuh atau
mengeklik tombol Submit atau Done pada aktivitas yang sama, yang menggunakan atribut
android:onClick untuk memanggil metode seperti onSubmit():
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/submit"
android:onClick="onSubmit"/>
Cuplikan kode berikut menampilkan bagaimana metode onSubmit() akan memeriksa untuk
mengetahui kotak centang mana yang dipilih, dengan menggunakan id sumber daya untuk
elemen kotak centang:
Tip: Untuk merespons kotak centang dengan cepat—seperti menampilkan pesan (semacam
peringatan), atau menampilkan serangkaian opsi lebih jauh—Anda bisa menggunakan atribut
android:onClick dalam layout XML untuk setiap kotak centang untuk mendeklarasikan
metode callback bagi kotak centang tersebut, yang harus didefinisikan dalam aktivitas yang
menjadi host layout ini.
Untuk informasi selengkapnya tentang kotak centang, lihat Kotak centang di bagian Antarmuka
Pengguna dalam Dokumentasi Developer Android.
Tombol radio
Gunakan tombol radio jika Anda menggunakan dua atau beberapa opsi yang saling lepas—
pengguna harus memilih salah satu di antaranya. (Jika Anda ingin mengaktifkan lebih dari satu
Pengguna mengharapkan tombol radio muncul dalam bentuk daftar vertikal, atau bersebelahan
secara horizontal jika labelnya pendek.
Setiap tombol radio adalah instance kelas RadioButton. Tombol radio umumnya digunakan
bersama dalam RadioGroup. Bila sejumlah tombol radio berada dalam suatu grup radio,
mencentang satu tombol radio akan menghapus semua centang lainnya. Buat setiap tombol radio
menggunakan elemen RadioButton pada layout XML Anda dalam grup tampilan RadioButton:
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_below="@id/orderintrotext">
<RadioButton
android:id="@+id/sameday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/same_day_messenger_service"
android:onClick="onRadioButtonClicked"/>
<RadioButton
android:id="@+id/nextday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next_day_ground_delivery"
android:onClick="onRadioButtonClicked"/>
<RadioButton
android:id="@+id/pickup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pick_up"
android:onClick="onRadioButtonClicked"/>
</RadioGroup>
Metode penangan kejadian klik harus public, mengembalikan void, dan mendefinisikan sebuah
View sebagai satu-satunya parameter (tampilan yang diklik). Yang berikut ini menampilkan satu
metode, onRadioButtonClicked(), untuk semua tombol radio, dengan menggunakan
pernyataan switch case untuk memeriksa id sumber daya bagi elemen tombol radio untuk
menentukan tombol radio yang dicentang:
Tip: Untuk memberi kesempatan pengguna meninjau pilihan tombol radio mereka sebelum
aplikasi merespons, Anda bisa mengimplementasikan tombol Submit atau Done seperti yang
ditampilkan sebelumnya bersama kotak centang, dan membuang atribut android:onClick dari
tombol radio. Kemudian, tambahkan metode onRadioButtonClicked() ke atribut
android:onClick untuk tombol Submit atau Done.
Untuk informasi selengkapnya tentang tombol radio, baca "Tombol Radio" pada bagian
Antarmuka Pengguna dalam Dokumentasi Developer Android.
Switch dan tombol beralih
Kontrol masukan beralih memungkinkan pengguna mengubah setelan di antara dua keadaan.
Android menyediakan kelas ToggleButton, yang menampilkan tombol timbul dengan "OFF" dan
"ON".
Contoh beralih menyertakan switch Aktif/Nonaktif untuk Wi-Fi, Bluetooth, dan opsi lain dalam
aplikasi Settings.
Android juga menyediakan kelas Switch, yaitu slider pendek yang terlihat seperti sakelar bulat
yang menawarkan dua keadaan (hidup dan mati). Keduanya adalah ekstensi kelas
CompoundButton.
Membuat tombol beralih dengan menggunakan elemen ToggleButton dalam layout XML Anda:
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/my_toggle"
android:text="
android:onClick="onToggleClick"/>
Tip: Atribut android:text tidak menyediakan label teks untuk tombol beralih—tombol beralih
selalu menampilkan baik "ON" atau "OFF". Untuk menyediakan label teks di sebelah (atau di
atas) tombol beralih, gunakan TextViewtersendiri.
Tip: Anda juga bisa mengubah keadaan ToggleButton lewat program dengan menggunakan
metode setChecked(boolean). Akan tetapi, perhatikan, metode yang ditetapkan oleh atribut
android:onClick() tidak akan dieksekusi dalam kasus ini.
Menggunakan switch
Switch adalah instance tersendiri dari kelas Switch, yang memperluas kelas CompoundButton
seperti ToggleButton. Buat switch beralih dengan menggunakan elemen Switch dalam layout
XML Anda:
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/my_switch"
android:text="@string/turn_on_or_off"
android:onClick="onSwitchClick"/>
Atribut android:text mendefinisikan sebuah string yang muncul di sebelah kiri switch, seperti
Untuk merespons ketukan switch, deklarasikan metode callback android:onClick bagi Switch
—kode pada dasarnya sama dengan kode untuk ToggleButton. Metode harus didefinisikan
dalam aktivitas yang melakukan hosting layout, dan itu harus berupa public, mengembalikan
void, dan mendefinisikan sebuah View sebagai satu-satunya parameter (yaitu tampilan yang
diklik). Gunakan CompoundButton.OnCheckedChangeListener() untuk mendeteksi perubahan
keadaan switch. Buat objek CompoundButton.OnCheckedChangeListener dan tetapkan ke
tombol dengan memanggil setOnCheckedChangeListener(). Misalnya, metode
onSwitchClick() akan memeriksa apakah switch aktif atau nonaktif, dan menampilkan pesan
toast:
public void onSwitchClick(View view) {
Switch aSwitch = (Switch) findViewById(R.id.my_switch);
aSwitch.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
StringBuffer onOff = new StringBuffer().append("On or off? ");
if (isChecked) { // The switch is enabled
onOff.append("ON ");
} else { // The switch is disabled
onOff.append("OFF ");
}
Toast.makeText(getApplicationContext(), onOff.toString(),
Toast.LENGTH_SHORT).show();
}
});
}
Tip: Anda juga bisa mengubah keadaan Switch lewat program dengan menggunakan metode
setChecked(boolean). Akan tetapi, perhatikan, metode yang ditetapkan oleh atribut
android:onClick() tidak akan dieksekusi dalam kasus ini.
Untuk informasi selengkapnya tentang beralih, lihat "Tombol Beralih" di bagian Antarmuka
Pengguna dalam Dokumentasi Developer Android.
Spinner
Spinner menyediakan cara cepat untuk memilih salah satu dari serangkaian nilai. Menyentuh
spinner akan menampilkan daftar tarik-turun dengan semua nilai yang tersedia, yang bisa dipilih
oleh pengguna.
Jika Anda memiliki daftar pilihan yang panjang, spinner bisa memanjang melebihi layout,
sehingga mengharuskan pengguna untuk menggulirnya. Spinner menggulir secara otomatis,
tanpa memerlukan tambahan kode. Akan tetapi, menggulir daftar panjang (seperti daftar negara)
tidak disarankan karena akan menyulitkan untuk memilih sebuah item.
Untuk membuat spinner, gunakan kelas Spinner, yang membuat tampilan yang menampilkan
nilai spinner individual sebagai tampilan anak, dan memungkinkan pengguna memilih salah satu.
Ikuti langkah-langkah ini:
1. Buat elemen Spinner dalam layout XML Anda, dan tetapkan nilainya menggunakan larik serta
ArrayAdapter.
2. Buat spinner dan adapternya menggunakan kelas SpinnerAdapter.
3. Untuk mendefinisikan callback pilihan bagi spinner, perbarui Aktivitas yang menggunakan
spinner untuk mengimplementasikan antarmuka AdapterView.OnItemSelectedListener.
Untuk membuat spinner dalam layout XML Anda, tambahkan elemen Spinner, yang
menyediakan daftar tarik-turun:
<Spinner
android:id="@+id/label_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Spinner>
Tambahkan sebuah adapter yang mengisi daftar spinner dengan nilai-nilai. Adapter bagaikan
jembatan, atau perantara, antara dua antarmuka yang tidak kompatibel. Misalnya, pembaca kartu
memori berfungsi sebagai adapter antara kartu memori dan laptop. Anda memasang kartu
memori ke dalam pembaca kartu, dan memasang pembaca kartu ke dalam laptop, sehingga
laptop bisa membaca kartu memori.
Pola spinner-adapter mengambil serangkaian data yang Anda tetapkan dan membuat tampilan
untuk setiap item dalam rangkaian data tersebut, seperti yang ditampilkan dalam gambar di
bawah ini.
Kelas SpinnerAdapter, yang mengimplementasikan kelas Adapter, memungkinkan Anda
mendefinisikan dua tampilan yang berbeda: yang menampilkan nilai data dalam spinner itu
sendiri, dan yang menampilkan data dalam daftar tarik-turun saat spinner disentuh atau diklik.
Nilai yang Anda sediakan untuk spinner bisa berasal dari sumber apa pun, tetapi harus
disediakan melalui SpinnerAdapter, seperti ArrayAdapter jika nilainya tersedia dalam larik.
Contoh berikut menampilkan larik sederhana yang disebut labels_array nilai pra-determinan
dalam file strings.xml:
<string-array name="labels_array">
<item>Home</item>
<item>Work</item>
<item>Mobile</item>
<item>Other</item>
</string-array>
Tip: Anda bisa menggunakan CursorAdapter jika nilai berasal dari sebuah sumber seperti file
tersimpan atau database. Anda akan mengetahui tentang data tersimpan dalam bab lain.
Buat spinner, dan setel listener-nya ke aktivitas yang mengimplementasikan metode callback.
Tempat terbaik untuk melakukannya adalah saat tampilan dibuat dalam metode onCreate() .
Ikuti langkah-langkah ini (lihat metode onCreate() lengkap di akhir langkah):
4. @Override
5. protected void onCreate(Bundle savedInstanceState) {
6. super.onCreate(savedInstanceState);
7. setContentView(R.layout.activity_main);
8.
9. // Create the spinner.
10. Spinner spinner = (Spinner) findViewById(R.id.label_spinner);
11. if (spinner != null) {
12. spinner.setOnItemSelectedListener(this);
13. }
14. }
15. Juga di metode onCreate(), tambahkan pernyataan yang membuat ArrayAdapter dengan
larik string:
16. // Create ArrayAdapter using the string array and default spinner
layout.
17. ArrayAdapter<CharSequence> adapter =
ArrayAdapter.createFromResource(this,
18. R.array.labels_array,
android.R.layout.simple_spinner_item);
19. Aktivitas yang mengimplementasikan callback untuk memproses hasil spinner ( this)
20. Larik (labels_array)
Tip: Anda harus menggunakan layout default simple_spinner_item , kecuali jika Anda
ingin mendefinisikan layout sendiri untuk item di spinner.
22. Tetapkan layout yang harus digunakan adapter untuk menampilkan pilihan daftar spinner
dengan memanggil metode setDropDownViewResource() dari kelas ArrayAdapter.
Misalnya, Anda bisa menggunakan simple_spinner_dropdown_item sebagai layout
Anda:
23. // Specify the layout to use when the list of choices appears.
24. adapter.setDropDownViewResource
25. (android.R.layout.simple_spinner_dropdown_item);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create ArrayAdapter using the string array and default spinner layout.
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.labels_array, android.R.layout.simple_spinner_item);
Untuk mendefinisikan callback pilihan spinner, perbarui Aktivitas yang menggunakan spinner
untuk mengimplementasikan antarmuka AdapterView.OnItemSelectedListener.
Saat pengguna memilih satu item dari daftar tarik-turun spinner, inilah yang akan terjadi dan cara
mengambil item tersebut:
3. Ambil item yang dipilih dalam menu spinner dengan menggunakan metode
getItemAtPosition() kelas AdapterView:
Untuk informasi selengkapnya tentang spinner, baca Spinner di bagian Antarmuka Pengguna
dalam Dokumentasi Developer Android.
Masukan teks
Gunakan kelas EditText untuk mendapatkan masukan pengguna yang terdiri dari karakter
tekstual, termasuk angka dan simbol. EditText memperluas kelas TextView, agar TextView dapat
diedit.
Dalam Layout Manager Android Studio, buat tampilan EditText dengan menambahkan sebuah
EditText ke layout Anda dengan XML berikut:
<EditText
android:id="@+id/edit_simple"
android:layout_height="wrap_content"
android:layout_width="match_parent">
</EditText>
Secara default, tampilan EditText memungkinkan beberapa baris masukan seperti yang
ditampilkan dalam gambar di bawah ini, dan menyarankan koreksi ejaan. Mengetuk tombol
Return (disebut juga dengan Enter) pada keyboard di layar mengakhiri suatu baris dan memulai
baris baru dalam tampilan EditText yang sama.
Catatan: Dalam gambar di atas, #1 adalah tombol Return (disebut juga dengan Enter).
Memungkinkan Return untuk lanjut ke tampilan berikutnya
Jika Anda menambahkan atribut android:inputType ke tampilan EditText dengan nilai seperti
"textCapCharacters" (untuk mengubah masukan menjadi huruf besar semua) atau
"textAutoComplete" (untuk mengaktifkan saran ejaan saat pengguna mengetik), mengetuk
tombol Return akan menutup keyboard di layar dan melanjutkan fokus ke tampilan berikutnya.
Perilaku ini berguna jika Anda ingin pengguna mengisi suatu formulir yang terdiri dari bidang
EditText, sehingga pengguna bisa melanjutkan dengan cepat ke tampilan EditText berikutnya.
Untuk daftar atribut EditText, termasuk atribut TextView yang diwarisi, lihat "Rangkuman"
keterangan kelas EditText.
Memungkinkan pengguna untuk memasukkan teks hanya berguna jika Anda bisa menggunakan
teks itu dalam beberapa cara dalam aplikasi. Untuk menggunakan masukan, Anda terlebih dahulu
harus mendapatkannya dari tampilan EditText dalam layout XML. Langkah-langkah yang bisa
Anda ikuti untuk mempersiapkan tampilan EditText dan mendapatkan masukan pengguna
adalah:
1. Buat elemen tampilan EditText di layout XML untuk suatu aktivitas. Pastikan untuk
mengidentifikasi elemen ini dengan sebuah android:id sehingga Anda bisa merujuknya
dengan id:
2. android:id="@+id/editText_main"
3. Dalam kode Java untuk aktivitas yang sama, buat sebuah metode dengan parameter View yang
mengambil objek EditText (dalam contoh di bawah, editText) untuk tampilan EditText ,
dengan menggunakan metode findViewById() kelas View untuk menemukan tampilan melalui
ID-nya (editText_main):
4. EditText editText = (EditText) findViewById(R.id.editText_main);
5. Gunakan metode getText() dari kelas EditText (diwarisi dari kelas TextView) untuk mendapatkan
teks sebagai urutan karakter (CharSequence). Anda bisa mengonversi urutan karakter menjadi
string dengan menggunakan metode toString() dari kelas CharSequence, yang mengembalikan
string yang menyatakan data dalam urutan karakter.
6. String showString = editText.getText().toString();
Tip: Anda bisa menggunakan metode valueOf() dari kelas Integer untuk mengonversi string
menjadi integer jika masukan adalah sebuah integer.
Android juga menyediakan kerangka kerja yang bisa diperluas bagi programmer tingkat lanjut
untuk mengembangkan dan memasang Input Method Editor (IME) mereka sendiri untuk
masukan ucapan, entri keyboard tipe khusus, dan aplikasi lain.
android:inputType="phone"
textPassword: Ubah setiap karakter yang dimasukkan pengguna menjadi titik untuk
menyembunyikan sandi yang dimasukkan.
textEmailAddress: Untuk entri email, tampilkan keyboard email dengan simbol "@" yang
ditempatkan agar mudah digunakan di sebelah tombol spasi.
android:inputType="textAutoCorrect|textCapSentences"
Untuk detail tentang atribut android:inputType baca Menetapkan Tipe Metode Masukan dalam
dokumentasi developer. Untuk daftar lengkap nilai konstanta android:inputType, lihat bagian
"android:inputType" di dokumentasi TextView.
Pada perangkat Android, tombol "aksi" adalah tombol Return. Tombol ini umumnya digunakan
untuk memasukkan baris teks lain untuk elemen EditText yang memungkinkan beberapa baris.
Jika Anda menyetel atribut android:inputType untuk tampilan EditText dengan nilai seperti
"textCapCharacters" (untuk mengubah masukan menjadi huruf besar semua) atau
"textAutoComplete" (untuk mengaktifkan saran ejaan saat pengguna mengetik), tombol
Return menutup keyboard di layar dan melanjutkan fokus ke tampilan berikutnya.
Jika Anda ingin pengguna memasukkan sesuatu selain teks, seperti nomor telepon, Anda
mungkin ingin mengubah tombol "aksi" menjadi ikon untuk tombol Send, dan mengubah
tindakan menjadi menekan nomor telepon. Ikuti langkah-langkah ini:
Catatan: Untuk membantu menyetel listener, lihat "Menetapkan Akses Masukan yang
Menetapkan Tindakan Keyboard" dalam Bidang Teks. Untuk informasi selengkapnya tentang
kelas EditorInfo, lihat Dokumentasi EditorInfo.
Misalnya, Anda ingin secara khusus menggunakan dialog untuk menampilkan peringatan yang
mengharuskan pengguna mengetuk sebuah tombol untuk membuat keputusan, seperti OK atau
Cancel. Dalam gambar di bawah ini, sisi kiri menampilkan peringatan dengan tombol Disagree
dan Agree, sedangkan bagian tengah menampilkan peringatan dengan tombol Cancel dan
Discards.
Anda juga bisa menggunakan dialog untuk menyediakan pilihan dalam gaya tombol radio,
seperti yang ditampilkan pada sisi kanan gambar di bawah ini.
Kelas dasar untuk semua komponen dialog adalah Dialog. Ada sejumlah subkelas Dialog yang
berguna untuk memperingatkan pengguna atas suatu kondisi, menampilkan status atau
perkembangan, menampilkan informasi pada perangkat sekunder, atau memilih atau
mengonfirmasi pilihan, seperti yang ditampilkan pada sisi kiri gambar di bawah ini. Android
SDK juga menyediakan subkelas dialog yang siap digunakan seperti "picker" untuk memilih
waktu atau tanggal, seperti yang ditampilkan pada sisi kanan gambar di bawah ini. Picker
memungkinkan pengguna untuk memasukkan informasi dalam format yang sudah ditentukan
dan konsisten, yang mengurangi kemungkinan kesalahan masukan.
Dialog selalu menjaga fokus sampai ditutup atau aksi yang diperlukan telah dilakukan.
Tip: Praktik terbaik menyarankan untuk menggunakan sedikit dialog karena mengganggu alur
kerja pengguna. Baca Panduan desain dialog untuk praktik desain terbaik tambahan, dan Dialog
dalam dokumentasi developer Android untuk contoh kode.
Kelas Dialog adalah kelas dasar untuk dialog, namun Anda harus menghindari membuat instance
Dialog secara langsung, kecuali jika Anda sedang membuat dialog khusus. Untuk dialog Android
standar, gunakan salah satu subkelas berikut:
AlertDialog: Dialog yang bisa menampilkan judul, hingga tiga tombol, daftar item yang dapat
dipilih, atau layout khusus.
DatePickerDialog atau TimePickerDialog: Dialog berisi UI yang sudah didefinisikan, yang
memungkinkan pengguna memilih tanggal atau waktu.
Peringatan adalah interupsi penting, memerlukan balasan atau tindakan, yang memberi tahu
pengguna tentang situasi saat peringatan itu terjadi, atau aksi sebelum peringatan itu muncul
(seperti saat membuang draf). Anda bisa menyediakan tombol dalam peringatan untuk membuat
keputusan. Misalnya, sebuah dialog peringatan mungkin mengharuskan pengguna untuk
mengeklik Continue setelah membacanya, atau memberi pilihan kepada pengguna untuk
menyetujui suatu aksi dengan mengeklik tombol positif (seperti OK atau Accept), atau untuk
tidak menyetujui dengan mengeklik tombol negatif (seperti Disagree atau Cancel).
Gunakan subkelas AlertDialog dari kelas Dialog untuk menampilkan dialog standar suatu
peringatan. Kelas AlertDialog memungkinkan Anda untuk membangun berbagai desain dialog.
Sebuah dialog peringatan bisa memiliki region berikut (lihat diagram di bawah ini):
1. Judul: Judul bersifat opsional. Sebagian besar peringatan tidak memerlukan judul. Jika Anda bisa
meringkas keputusan dalam satu atau dua kalimat dengan mengajukan pertanyaan (seperti,
"Buang draf?") Atau membuat pernyataan yang berkaitan dengan tombol aksi (seperti, "Klik OK
untuk melanjutkan"), tidak perlu repot-repot memikirkan judul. Gunakan judul jika situasinya
berisiko-tinggi, seperti potensi hilangnya konektivitas atau data, dan area materi ditempati oleh
pesan terperinci, daftar, atau layout khusus.
2. Area materi: Area materi bisa menampilkan pesan, daftar, atau layout khusus lainnya.
3. Tombol aksi: Anda sebaiknya tidak menggunakan lebih dari tiga tombol aksi dalam dialog, dan
kebanyakan hanya memiliki dua tombol.
Membangun AlertDialog
Catatan: Jika AlertDialog.Builder tidak dikenali saat memasukkannya, Anda mungkin perlu
menambahkan pernyataan import berikut ke MainActivity.java:
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
Yang berikut ini akan membuat objek dialog (myAlertBuilder) dan menyetel judul (sumber
daya string yang disebut alert_title) dan pesan (sumber daya string yang disebut
alert_message):
Anda bisa menambahkan salah satu saja dari setiap tipe tombol ke AlertDialog. Misalnya, Anda
tidak bisa memiliki lebih dari satu tombol "positif".
Tip: Anda juga bisa menyetel tombol "netral" dengan setNeutralButton(). Tombol netral muncul
di antara tombol positif dan tombol negatif. Gunakan tombol netral, seperti "Remind me later"
jika Anda ingin pengguna dapat menghilangkan dialog dan memutuskan nanti.
Menampilkan dialog
alertDialog.show();
Android menyediakan dialog yang siap digunakan, disebut picker, untuk memilih waktu atau
tanggal. Gunakan picker untuk memastikan pengguna Anda memilih waktu atau tanggal yang
valid, yang diformat dengan benar dan disesuaikan dengan lokal pengguna. Setiap picker
menyediakan kontrol untuk memilih setiap bagian waktu (jam, menit, AM/PM) atau tanggal
Saat menampilkan picker, Anda harus menggunakan instance DialogFragment, sebuah subkelas
Fragment, yang menampilkan jendela dialog yang mengambang di atas jendela aktivitasnya.
Fragmen adalah perilaku atau bagian antarmuka pengguna dalam suatu aktivitas. Fragmen
seperti aktivitas mini di dalam aktivitas utama, dengan daur hidup individualnya sendiri. Suatu
fragmen menerima kejadian masukannya sendiri, dan Anda bisa menambahkan atau
membuangnya saat aktivitas utama berjalan. Anda mungkin mengombinasikan beberapa fragmen
dalam suatu aktivitas tunggal untuk membangun antarmuka pengguna multipanel, atau
menggunakan kembali suatu fragmen dalam beberapa aktivitas. Untuk mengetahui tentang
fragmen, lihat Fragmen dalam Panduan API.
Salah satu manfaat menggunakan fragmen untuk picker adalah Anda bisa mengisolasi bagian
kode untuk mengelola tanggal dan waktu setelah pengguna memilihnya dari picker. Anda juga
bisa menggunakan DialogFragment untuk mengelola daur hidup dialog.
Tip: Manfaat lain menggunakan fragmen untuk picker adalah Anda bisa mengimplementasikan
konfigurasi layout yang berbeda, seperti dialog dasar pada tampilan berukuran handset atau
bagian layout yang disematkan pada tampilan yang besar.
Menambahkan fragmen
Untuk menambahkan fragmen bagi picker tanggal, buat fragmen kosong (DatePickerFragment)
tanpa XML layout, dan tanpa metode pabrik atau callback antarmuka:
Langkah berikutnya adalah membuat picker standar dengan listener. Ikuti langkah-langkah ini:
Android Studio secara otomatis menambahkan yang berikut ini dalam blok import di
bagian atas:
import android.app.DatePickerDialog.OnDateSetListener;
import android.support.v4.app.DialogFragment;
6. Android Studio juga menampilkan ikon bola lampu merah di batas kiri, mengarahkan
Anda untuk mengimplementasikan metode. Klik ikon dan, dengan onDateSet sudah
dipilih serta opsi "Insert @Override" sudah dicentang, klik OK untuk membuat metode
onDateSet().
Kemudian Android Studio secara otomatis menambahkan yang berikut ini dalam blok
import di bagian atas:
import android.widget.DatePicker;
Untuk menyetel tanggal default dalam picker dan mengembalikannya sebagai objek yang bisa
Anda gunakan, ikuti langkah-langkah ini:
Saat Anda memasukkan Calendar, Anda diberi pilihan pustaka Kalender yang akan
diimpor. Pilih ini:
import java.util.Calendar;
Kelas Calendar menyetel tanggal default sebagai tanggal saat ini—kelas ini mengonversi
antara instan tertentu dan serangkaian bidang kalender seperti YEAR, MONTH,
DAY_OF_MONTH, HOUR, dan seterusnya. Kalender bersifat sensitif-lokal, dan metode
kelasnya getInstance() mengembalikan objek Calendar yang bidang kalendernya telah
diinisialisasi dengan tanggal dan waktu saat ini.
7. Tambahkan pernyataan berikut pada akhir metode untuk membuat instance picker tanggal yang
baru dan mengembalikannya:
8. return new DatePickerDialog(getActivity(), this, year, month, day);
Menampilkan picker
Pada Aktivitas Utama, Anda perlu membuat metode untuk menampilkan picker tanggal. Ikuti
langkah-langkah ini:
7. android:id="@+id/button_date"
8. ...
9. android:onClick="showDatePickerDialog"/>
Memproses pilihan picker pengguna
Metode onDateSet() secara otomatis dipanggil saat pengguna membuat pilihan dalam picker
tangal, sehingga Anda bisa menggunakan metode ini untuk melakukan sesuatu dengan tanggal
yang dipilih tersebut. Ikuti langkah-langkah ini:
1. Agar kode lebih terbaca, ubah parameter metode onDateSet() dari int i, int i1, dan int
i2 ke int year, int month, dan int day:
2. public void onDateSet(DatePicker view, int year, int month, int day) {
3. Buka MainActivity dan tambahkan penanda metode processDatePickerResult() yang
mengambil year, month, dan day sebagai argumen:
4. public void processDatePickerResult(int year, int month, int day) {
5. }
6. Tambahkan kode berikut pada metode processDatePickerResult() untuk mengonversi
month, day, dan year dan untuk memisahkan string:
Catatan: Integer month yang dikembalikan oleh picker tanggal mulai menghitung dari 0 untuk
Januari, sehingga Anda perlu menambahkan 1 untuk mulai menampilkan bulan mulai dari 1.
10. Tambahkan yang berikut ini setelah kode di atas untuk menggabungkan tiga string dan
menyertakan garis miring untuk format tanggal A.S.:
11. String dateMessage = (month_string + "/" +
12. day_string + "/" + year_string);
13. Tambahkan yang berikut ini setelah pernyataan di atas untuk menampilkan pesan Toast:
14. Toast.makeText(this, "Date: " + dateMessage,
15. Toast.LENGTH_SHORT).show();
16. Ekstrak string hard-code "Date: " menjadi sumber daya string bernama date. Hal ini secara
otomatis mengganti string hard-code dengan getString(R.string.date). Kode untuk
metode processDatePickerResult() sekarang harus tampak seperti ini:
17. public void processDatePickerResult(int year, int month, int day) {
18. String month_string = Integer.toString(month + 1);
19. String day_string = Integer.toString(day);
20. String year_string = Integer.toString(year);
21. // Assign the concatenated strings to dateMessage.
22. String dateMessage = (month_string + "/" +
23. day_string + "/" + year_string);
24. Toast.makeText(this, getString(R.string.date) + dateMessage,
25. Toast.LENGTH_SHORT).show();
26. }
27. Buka DatePickerFragment, dan tambahkan yang berikut ini ke metode onDateSet()
untuk memanggil metode processDatePickerResult() di MainActivity dan
meneruskan year, month, dan dayke sana:
28. public void onDateSet(DatePicker view, int year, int month, int day) {
29. // Set the activity to the Main Activity.
30. MainActivity activity = (MainActivity) getActivity();
31. // Invoke Main Activity's processDatePickerResult() method.
32. activity.processDatePickerResult(year, month, day);
33. }
Ikuti prosedur yang sama yang diuraikan di atas untuk picker tanggal:
Android Studio juga menampilkan ikon bola lampu merah di batas kiri, yang meminta
konfirmasi Anda untuk mengimplementasikan metode. Klik ikon dan, dengan onTimeSet
sudah dipilih serta opsi "Insert @Override" sudah dicentang, klik OK untuk membuat
metode onTimeSet(). Kemudian Android Studio secara otomatis menambahkan yang
berikut ini dalam blok import di bagian atas:
import android.widget.TimePicker;
android:id="@+id/button_date"
...
android:onClick="showDatePickerDialog"/>
21. Buat metode processTimePickerResult() di MainActivity untuk memproses hasil
pemilihan dari picker waktu:
22. public void processTimePickerResult(int hourOfDay, int minute) {
23. // Convert time elements into strings.
24. String hour_string = Integer.toString(hourOfDay);
25. String minute_string = Integer.toString(minute);
26. // Assign the concatenated strings to timeMessage.
27. String timeMessage = (hour_string + ":" + minute_string);
28. Toast.makeText(this, getString(R.string.time) + timeMessage,
29. Toast.LENGTH_SHORT).show();
30. }
31. Gunakan onTimeSet() untuk mendapatkan waktu dan meneruskannya ke metode
processTimePickerResult() di MainActivity:
Mengenali isyarat
Isyarat sentuh terjadi saat seorang pengguna meletakkan satu atau beberapa jari di atas layar
sentuh, dan aplikasi Anda akan menerjemahkan pola sentuhan sebagai isyarat khusus, seperti
sentuhan lama, ketuk dua kali, gesek cepat, atau guliran.
Android menyediakan berbagai kelas dan metode untuk membantu Anda membuat dan
mendeteksi isyarat. Meskipun aplikasi Anda seharusnya tidak bergantung pada isyarat sentuhan
untuk perilaku dasar (karena isyarat mungkin tidak tersedia untuk semua pengguna dalam semua
konteks), menambahkan interaksi berbasis sentuhan ke aplikasi Anda bisa sangat meningkatkan
daya guna dan daya tariknya.
Untuk menyediakan pengalaman yang intuitif dan konsisten bagi pengguna, aplikasi Anda
seharusnya mengikuti konvensi Android yang diterima untuk isyarat sentuh. Panduan desain
isyarat menampilkan cara mendesain isyarat umum dalam aplikasi Android. Untuk detail dan
contoh kode selengkapnya, lihat Menggunakan Isyarat Sentuh dalam dokumentasi developer
Android.
Mendeteksi isyarat umum
Jika aplikasi Anda menggunakan isyarat umum seperti ketuk dua kali, tekan lama, lempar, dan
seterusnya, Anda bisa memanfaatkan kelas GestureDetector untuk mendeteksi isyarat umum.
Gunakan GestureDetectorCompat, yang disediakan sebagai implementasi kompatibilitas kelas
GestureDetector kerangka kerja, yang menjamin perilaku menggulir titik fokus terbaru dari
Jellybean MR1 pada semua versi platform. Kelas ini seharusnya hanya digunakan dengan
kejadian gerakan yang dilaporkan untuk perangkat sentuh—jangan gunakan untuk trackball atau
kejadian perangkat keras lainnya.
Saat Anda membuat instance objek GestureDetectorCompat , salah satu parameter yang
diambil adalah kelas yang harus Anda buat—MyGestureListener dalam cuplikan di atas—yang
melakukan salah satu hal berikut:
Untuk mendeteksi semua tipe isyarat, Anda perlu melakukan dua langkah penting:
Isyarat tersebut dimulai ketika pengguna pertama kali menyentuh layar, terus berlanjut ketika
sistem melacak posisi jari pengguna, dan berakhir dengan menangkap kejadian terakhir saat jari
pengguna meninggalkan layar. Selama interaksi ini, objek kelas MotionEvent dikirimkan ke
onTouchEvent(), menyediakan detail setiap interaksi. Aplikasi Anda bisa menggunakan data
yang disediakan oleh MotionEvent untuk menentukan apakah terjadi isyarat yang terkait
dengannya.
Misalnya, saat pengguna pertama kali menyentuh layar, metode onTouchEvent() dipicu pada
tampilan yang disentuh, dan objek MotionEvent() melaporkan gerakan oleh jari (atau mouse,
atau pena, atau trackball) dalam hal:
Kode aksi: Menetapkan perubahan keadaan yang terjadi, seperti jari mengetuk atau diangkat.
Serangkaian nilai sumbu: Menjelaskan posisi pada koordinat sentuhan X dan Y serta informasi
tentang tekanan, ukuran dan orientasi area kontak.
Jari individu atau objek lain yang menghasilkan jejak gerakan disebut dengan pointer. Beberapa
perangkat bisa melaporkan beberapa jejak gerakan pada saat yang sama. Layar multi-sentuhan
menampilkan satu jejak gerakan untuk setiap jari. Kejadian gerakan berisi informasi tentang
semua pointer yang saat ini aktif, bahkan jika beberapa di antaranya tidak bergerak sejak
kejadian pertama dikirimkan. Berdasarkan interpretasi objek MotionEvent, metode
onTouchEvent() memicu callback yang sesuai pada antarmuka
GestureDetector.OnGestureListener.
Setiap pointer MotionEvent memiliki ID unik yang diberikan saat pointer pertama kali turun
(ditunjukkan oleh ACTION_DOWN atau ACTION_POINTER_DOWN). ID pointer akan tetap valid
hingga akhirnya pointer naik (ditunjukkan oleh ACTION_UP atau ACTION_POINTER_UP) atau bila
isyarat dibatalkan (ditunjukkan oleh ACTION_CANCEL). Kelas MotionEvent menyediakan metode
untuk menanyakan posisi dan properti pointer lainnya, seperti getX(int), getY(int),
getAxisValue(int), getPointerId(int), dan getToolType(int).
Interpretasi materi MotionEvent sangat beragam bergantung pada kelas sumber perangkat. Pada
layar sentuh, koordinat pointer menetapkan posisi absolut seperti koordinat X/Y tampilan. Setiap
isyarat lengkap dinyatakan oleh urutan kejadian gerakan dengan tindakan yang menjelaskan
transisi keadaan dan gerakan pointer.
Isyarat memulai kejadian gerakan dengan ACTION_DOWN yang menyediakan lokasi turunnya
pointer untuk pertama kali. Karena setiap pointer tambahan turun atau naik, kerangka kerja
menghasilkan kejadian gerakan dengan ACTION_POINTER_DOWN atau ACTION_POINTER_UP yang
sesuai. Gerakan pointer dijelaskan oleh kejadian gerakan dengan ACTION_MOVE. Isyarat berakhir
saat pointer terakhir naik sebagaimana dinyatakan oleh kejadian gerakan dengan ACTION_UP,
atau bila isyarat dibatalkan dengan ACTION_CANCEL.
Untuk mencegat kejadian sentuh dalam suatu aktivitas atau tampilan, ganti callback
onTouchEvent() seperti yang ditampilkan dalam cuplikan di bawah ini. Anda bisa
menggunakan metode getActionMasked() dari kelas MotionEventCompat untuk mengekstrak
aksi yang dilakukan pengguna dari parameter kejadian. (MotionEventCompat adalah penunjang
untuk mengakses fitur dalam MotionEvent, yang diperkenalkan setelah API level 4 yang
kompatibel dengan versi sebelumnya.) Hal ini akan memberi data mentah yang Anda butuhkan
jika isyarat yang terkait dengan Anda terjadi:
switch(action) {
case (MotionEvent.ACTION_DOWN) :
Log.d(DEBUG_TAG,"Action was DOWN");
return true;
case (MotionEvent.ACTION_MOVE) :
Log.d(DEBUG_TAG,"Action was MOVE");
return true;
case (MotionEvent.ACTION_UP) :
Log.d(DEBUG_TAG,"Action was UP");
return true;
case (MotionEvent.ACTION_CANCEL) :
Log.d(DEBUG_TAG,"Action was CANCEL");
return true;
case (MotionEvent.ACTION_OUTSIDE) :
Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
"of current screen element");
return true;
default :
return super.onTouchEvent(event);
}
}
Selanjutnya Anda bisa melakukan pemrosesan sendiri terhadap kejadian ini untuk menentukan
apakah terjadi isyarat.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Panduan Android API, bagian "Kembangkan":
o Menetapkan Tipe Metode Masukan
o Bidang Teks
o EditorInfo
o Kontrol Masukan
o Tombol
o Spinner
o Dialog
o Fragmen
o Kejadian Masukan
o Picker
o DateFormat
o Komponen - Tombol
Blog Developer:
o "Holo Everywhere"
4.2: Menu
Materi:
Tipe menu
Bilah aplikasi dan menu opsi
Menu kontekstual
Menu munculan
Praktik terkait
Ketahui selengkapnya
Tipe menu
Menu adalah serangkaian opsi yang bisa dipilih pengguna untuk menjalankan suatu fungsi,
seperti menelusuri informasi, menyimpan informasi, mengedit informasi, atau mengarahkan ke
suatu layar. Android menawarkan tipe menu berikut, yang berguna untuk berbagai situasi (lihat
gambar di bawah ini):
1. Menu opsi: Muncul dalam bilah aplikasi dan menyediakan opsi utama yang memengaruhi
penggunaan aplikasi itu sendiri. Contoh opsi menu: Search untuk melakukan penelusuran,
Bookmark untuk menyimpan tautan ke suatu layar, dan Setting untuk mengarahkan ke layar
Settings.
2. Menu konteks: Muncul sebagai daftar pilihan yang mengambang bila pengguna melakukan
ketukan lama pada suatu elemen di layar. Contoh opsi menu: Edit untuk mengedit elemen,
Delete untuk menghapusnya, dan Share untuk membagikannya melalui media sosial.
3. Bilah aksi kontekstual: Muncul di bagian atas layar yang menghamparkan bilah aplikasi, dengan
item aksi yang memengaruhi elemen yang dipilih. Contoh opsi menu: Edit, Share, dan Delete
untuk satu atau beberapa elemen yang dipilih.
4. Menu munculan: Muncul dengan ditambatkan pada suatu tampilan seperti ImageButton, dan
menyediakan luapan aksi atau bagian ke dua dari perintah dua bagian. Contoh menu munculan:
aplikasi Gmail menambatkan menu munculan pada bilah aplikasi untuk tampilan pesan dengan
Reply, Reply All, dan Forward.
Bilah aplikasi secara default menampilkan judul aplikasi, atau nama yang didefinisikan dalam
AndroidManifest.xml dengan atribut android:label untuk aktivitas. Bilah aplikasi juga
menyertakan tombol Naik untuk mengarahkan ke atas ke aktivitas induk, yang dijelaskan di bab
berikutnya.
Menu opsi dalam bilah aplikasi menyediakan navigasi ke aktivitas lain dalam aplikasi, atau opsi
utama yang memengaruhi penggunaan aplikasi itu sendiri— namun bukan yang menjalankan
aksi pada elemen di layar. Misalnya, menu opsi Anda mungkin menyediakan pilihan pengguna
untuk mengarahkan ke aktivitas lain, seperti menempatkan urutan, atau untuk aksi yang memiliki
efek global pada aplikasi, seperti mengubah setelan atau informasi profil.
Menu opsi muncul di sudut kanan bilah aplikasi. Bilah aplikasi terbagi menjadi empat area
fungsional berbeda yang berlaku untuk sebagian besar aplikasi:
1. Tombol navigasi atau Tombol Naik: Gunakan tombol navigasi dalam ruang ini untuk membuka
panel samping navigasi, atau menggunakan tombol Naik untuk mengarahkan ke atas melalui
hierarki layar aplikasi Anda ke aktivitas induk. Keduanya akan dijelaskan di bab berikutnya.
2. Judul: Judul dalam bilah aplikasi adalah judul aplikasi, atau nama yang didefinisikan dalam
AndroidManifest.xml oleh atribut android:label untuk aktivitas.
3. Ikon aksi untuk menu opsi: Setiap ikon aksi muncul dalam bilah aplikasi dan menyatakan salah
satu item pada menu opsi yang paling sering digunakan. Item menu opsi yang lebih jarang
digunakan akan muncul di menu opsi luapan.
4. Menu opsi luapan: Ikon luapan membuka munculan bersama item menu opsi yang tidak
ditampilkan seperti ikon dalam bilah aplikasi.
Item menu opsi yang sering digunakan akan muncul sebagai ikon dalam bilah aplikasi. Menu
opsi luapan menampilkan menu selebihnya:
1. Bilah aplikasi. Bilah aplikasi menyertakan judul aplikasi, menu opsi, dan tombol luapan.
2. Ikon aksi menu opsi. Dua item menu opsi pertama muncul sebagai ikon dalam bilah aplikasi.
3. Tombol luapan. Tombol luapan (tiga titik vertikal) membuka menu yang menampilkan item
menu opsi selengkapnya.
4. Menu luapan opsi. Setelah mengeklik tombol luapan, item menu opsi selengkapnya akan
muncul dalam menu luapan.
Setiap aktivitas yang menggunakan tema default juga memiliki ActionBar sebagai bilah
aplikasinya. Beberapa tema juga mempersiapkan ActionBar sebagai bilah aplikasi secara default.
Jika Anda memulai suatu aplikasi dari template seperti Empty Activity, sebuah ActionBar akan
muncul sebagai bilah aplikasi.
Akan tetapi, karena fitur ditambahkan ke ActionBar asli pada beragam rilis Android, ActionBar
asli akan berperilaku berbeda-beda bergantung pada versi Android yang berjalan pada perangkat
tersebut. Oleh karena itu, jika Anda menambahkan menu opsi, Anda harus menggunakan Toolbar
pustaka dukungan v7 appcompat sebagai bilah aplikasi. Menggunakan Toolbar akan
memudahkan dalam mempersiapkan bilah aplikasi yang bekerja pada beragam perangkat, serta
memberi Anda ruang untuk menyesuaikan bilah aplikasi bila nanti aplikasi Anda berkembang.
Bilah alat menyertakan berbagai fitur terbaru, dan bekerja pada perangkat apa pun yang bisa
menggunakan pustaka dukungan.
Untuk menggunakan Bilah Alat sebagai bilah aplikasi (daripada ActionBar default) untuk
aktivitas, lakukan salah satu hal berikut:
Mulai proyek Anda dengan template Basic Activity, yang mengimplementasikan Bilah Alat untuk
aktivitas sekaligus menu opsi dasar (dengan satu item, Settings). Anda bisa melewati bagian ini.
Lakukan sendiri, seperti yang ditampilkan dalam bagian ini:
2. Gunakan tema dan gaya NoActionBar untuk bilah aplikasi dan latar belakang.
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template akan
menambahkan pustaka dukungan berikut untuk Anda, sehingga Anda bisa melewati langkah ini.
Jika Anda tidak menggunakan template Basic Activity, tambahkan pustaka dukungan appcompat
(versi saat ini adalah v7) untuk kelas Toolbar, dan pustaka desain untuk tema NoActionBar, ke
proyek Anda:
1. Pilih Tools > Android > SDK Manager untuk memeriksa apakah Android Support Repository telah
dipasang; jika belum, pasanglah.
2. Buka file build.gradle untuk aplikasi Anda, dan tambahkan identifier proyek fitur pustaka
dukungan ke bagian dependencies . Misalnya, untuk menyertakan support:appcompat dan
support:design, tambahkan:
3. compile 'com.android.support:appcompat-v7:23.4.0'
4. compile 'com.android.support:design:23.4.0'
Catatan: Perbarui nomor versi untuk dependensi jika perlu. Jika nomor versi yang Anda tetapkan
lebih rendah dari nomor versi pustaka yang tersedia saat ini, Android Studio akan
memperingatkan Anda ("a newer version of com.android.support:design is available"). Perbarui
nomor versi ke versi yang disebutkan Android Studio untuk digunakan.
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template
tersebut akan menambahkan tema untuk menggantikan ActionBar dengan Toolbar, sehingga
Anda bisa melewati langkah ini.
Jika Anda tidak menggunakan template Basic Activity, Anda bisa menggunakan kelas Toolbar
untuk bilah aplikasi dengan mematikan ActionBar default menggunakan tema NoActionBar
untuk aktivitas tersebut. Tema dalam Android serupa dengan gaya, kecuali bahwa tema
diterapkan ke seluruh aplikasi atau aktivitas, bukan ke tampilan tertentu.
Bila Anda membuat proyek baru di Android Studio, sebuah tema aplikasi secara otomatis dibuat
untuk Anda. Misalnya, jika Anda memulai suatu proyek aplikasi dengan template Basic Activity
atau Empty Activity, tema AppTheme disediakan dalam direktori styles.xml dalam res > values.
Tip: Anda akan mengetahui selengkapnya tentang tema dalam bab mengenai sumber daya dapat
digambar, gaya, dan tema.
Anda bisa memodifikasi tema untuk menyediakan gaya bagi bilah aplikasi dan latar belakang
aplikasi, sehingga bilah aplikasi akan terlihat dan menonjol dibandingkan latar belakangnya.
Ikuti langkah-langkah ini:
1. Buka file styles.xml. Anda seharusnya sudah memiliki yang berikut ini dalam file:
2. <resources>
3. <!-- Base application theme. -->
4. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5. <!-- Customize your theme here. -->
6. <item name="colorPrimary">@color/colorPrimary</item>
7. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
8. <item name="colorAccent">@color/colorAccent</item>
9. </style>
10. ...
11. </resources>
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template
tersebut akan menambahkan tema AppBarLayout dan Toolbar untuk Anda, sehingga Anda bisa
melewati langkah ini.
Jika Anda tidak menggunakan template Basic Activity, Anda bisa menyertakan Toolbar dalam
layout aktivitas dengan menambahkan elemen AppBarLayout dan Toolbar .AppBarLayout
adalah LinearLayout vertikal yang mengimplementasikan banyak fitur konsep bilah aplikasi
desain material, seperti isyarat menggulir. Ingat hal berikut:
AppBarLayout juga memerlukan layout materi tersendiri yang seinduk untuk materi yang
digulir di bawah bilah aplikasi. Anda bisa menambahkan saudara ini sebagai grup tampilan
(seperti RelativeLayout atau LinearLayout) seperti berikut:
o Di dalam file layout yang sama untuk aktivitas (seperti dalam activity_main.xml)
o Dalam file layout tersendiri, seperti content_main.xml, yang kemudian bisa Anda
tambahkan ke file layout aktivitas dengan pernyataan include:
o <include layout="@layout/content_main" />
Anda perlu menyetel perilaku menggulir materi yang seinduk, seperti yang ditampilkan
di bawah ini dengan grup RelativeLayout, untuk menjadi instance dari
AppBarLayout.ScrollingViewBehavior:
<RelativeLayout
...
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
... >
</RelativeLayout>
android.support.design.widget.AppBarLayout$ScrollingViewBehavior
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template
tersebut akan menambahkan kode yang diperlukan untuk mempersiapkan bilah aplikasi,
sehingga Anda bisa melewati langkah ini.
Jika tidak menggunakan template Basic Activity, Anda bisa mengikuti langkah-langkah ini untuk
mempersiapkan bilah aplikasi dalam aktivitas:
1. Pastikan bahwa aktivitas tempat Anda ingin menampilkan bilah aplikasi memperluas
AppCompatActivity:
2. public class MyActivity extends AppCompatActivity {
3. ...
4. }
5. In the activity's onCreate() method, call the activity's setSupportActionBar() method, and pass
the activity's toolbar (assuming the Toolbar element's id is toolbar). The
setSupportActionBar() method sets the toolbar as the app bar for the activity:
6. @Override
7. protected void onCreate(Bundle savedInstanceState) {
8. super.onCreate(savedInstanceState);
9. setContentView(R.layout.activity_main);
10. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
11. setSupportActionBar(toolbar);
12. }
Aktivitas sekarang menampilkan bilah aplikasi. Secara default, bilah aplikasi berisi nama
aplikasi saja.
Android menyediakan format XML standar untuk mendefinisikan item menu opsi. Sebagai ganti
membangun menu dalam kode aktivitas, Anda bisa mendefinisikan menu dan semua itemnya
dalam sumber daya menu XML. Sumber daya menu mendefinisikan menu aplikasi (menu opsi,
menu konteks, atau menu munculan) yang bisa dimekarkan dengan MenuInflater, yang memuat
sumber daya sebagai objek Menu dalam aktivitas atau fragmen.
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template akan
menambahkan sumber daya menu untuk Anda dan memekarkan menu opsi dengan MenuInflater,
sehingga Anda bisa melewati langkah ini dan langsung ke "Mendefiniskan cara item menu
muncul".
Jika Anda tidak menggunakan template Basic Activity, gunakan pola desain pemekaran-sumber-
daya, yang memudahkan dalam membuat menu opsi. Ikuti langkah-langkah ini (lihat gambar di
bawah ini):
1. Sumber daya menu XML. Buat file sumber daya menu XML untuk item menu, dan tetapkan
atribut penampilan dan posisi seperti yang dijelaskan di bagian berikutnya.
2. Memekarkan menu. Ganti metode onCreateOptionsMenu() dalam aktivitas atau fragmen Anda
untuk memekarkan menu.
3. Menangani klik item menu. Item menu adalah tampilan, sehingga Anda bisa menggunakan
atribut android:onClick untuk setiap item menu. Akan tetapi, metode
onOptionsItemSelected() bisa menangani semua klik item menu pada satu tempat, dan
menentukan item menu mana yang diklik, yang membuat kode Anda mudah dipahami.
4. Melakukan aksi. Buat metode untuk melakukan aksi bagi setiap item menu opsi.
Ikuti langkah-langkah ini untuk menambahkan item menu ke sumber daya menu XML:
1. Klik direktori res, dan pilih File > New > Android resource directory, pilih menu dalam menu
tarik-turun Resource type, dan klik OK.
2. Klik direktori menu baru, dan pilih File > New > Menu resource file, masukkan nama file sebagai
menu_main atau yang semacamnya, dan klik OK. File menu_main.xml sekarang ada di dalam
direktori menu.
3. Buka file menu_main.xml (jika belum terbuka), dan klik tab Text di sebelah tab Design di bagian
bawah panel untuk menampilkan file.
4. Tambahkan item menu opsi pertama menggunakan tag <item … /> . Dalam contoh ini,
item tersebut adalah Settings:
5. <menu xmlns:android="http://schemas.android.com/apk/res/android"
6. ...>
7. <item
8. android:id="@+id/action_settings"
9. android:title="@string/settings" />
10. </menu>
Setelah mempersiapkan dan memekarkan sumber daya XML dalam kode aktivitas atau
fragmen, ikon luapan dalam bilah aplikasi yang diklik akan menampilkan menu opsi
hanya dengan satu opsi (Settings):
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template
tersebut akan menambahkan menu opsi dengan satu opsi: Settings.
Untuk menambahkan lebih banyak item menu opsi, tambahkan lebih banyak tag <item … />
dalam file menu_main.xml. Misalnya, dua item menu opsi didefinisikan dalam cuplikan berikut:
@string/settings (Settings) dan @string/action_order (Order):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
...>
<item
android:id="@+id/action_settings"
android:title="@string/settings" />
<item
android:id="@+id/action_order"
android:icon="@drawable/ic_order_white"
android:title="@string/action_order"/>
</menu>
Dalam setiap tag <item … /> Anda bisa menambahkan atribut untuk mendefinisikan cara item
menu muncul, seperti urutan penampilannya terkait item lain, dan apakah item tersebut bisa
muncul sebagai ikon dalam bilah aplikasi. Item yang Anda setel menjadi tidak muncul dalam
bilah aplikasi (atau tidak pas dalam bilah aplikasi karena orientasi tampilan) ditempatkan
berurutan dalam menu luapan).
Jika memungkinkan, Anda bisa menampilkan aksi yang paling sering digunakan menggunakan
ikon dalam bilah aplikasi, sehingga pengguna bisa mengekliknya tanpa harus mengeklik tombol
luapan terlebih dahulu.
Untuk menetapkan ikon untuk aksi, Anda perlu terlebih dulu menambahkan ikon sebagai aset
gambar ke folder drawable dengan mengikuti langkah-langkah ini (lihat Image Asset Studio
untuk keterangan lengkap):
1. Luaskan res dalam tampilan Project, dan klik-kanan (atau klik Command) drawable.
2. Pilih New > Image Asset. Dialog Configure Image Asset akan muncul.
5. Klik gambar clipart (logo Android) untuk memilih gambar clipart sebagai ikon. Laman ikon akan
muncul. Klik ikon yang ingin Anda gunakan.
6. (Opsional) Pilih HOLO_DARK dari menu tarik-turun Tema. Ini akan menyetel ikon menjadi putih
dengan latar belakang berwarna gelap (atau hitam). Klik Next.
android:icon: Gambar yang digunakan sebagai ikon item menu. Misalnya, item menu berikut
mendefinisikan ic_order_white sebagai ikonnya:
<item
android:id="@+id/action_order"
android:icon="@drawable/ic_order_white"
android:title="@string/action_order"/>
android:title: String untuk judul item menu.
android:titleCondensed: String yang digunakan sebagai judul singkat untuk situasi di mana
judul normal terlalu panjang.
Posisikan atribut
Order: 10
Status 20
Favorites 40
Contact 100
Catatan: Sementara angka 1, 2, 3, dan 4 juga bekerja dalam contoh di atas, angka 10, 20, 40, dan 100
meninggalkan ruangan untuk item menu tambahan yang akan ditambahkan di antara mereka nantinya.
Gunakan atribut app:showAsAction untuk menampilkan item menu sebagai ikon dalam bilah
aplikasi, dengan nilai sebagai berikut:
"always": Selalu tempatkan item ini dalam bilah aplikasi. Gunakan ini hanya jika item tersebut
penting untuk muncul dalam bilah aplikasi (seperti ikon Telusur). Jika Anda menyetel beberapa
item untuk selalu muncul dalam bilah aplikasi, mereka bisa menindih item lain dalam bilah
aplikasi, seperti judul aplikasi.
"ifRoom": Hanya tempatkan item ini dalam bilah aplikasi jika ada ruang untuk item tersebut.
Jika tidak ada cukup ruang untuk semua item yang ditandai "ifRoom", item dengan nilai
orderInCategory terendah akan ditampilkan dalam bilah aplikasi, dan item lainnya akan
ditampilkan dalam menu luapan.
"never": Jangan pernah tempatkan item ini dalam bilah aplikasi. Sebagai gantinya, cantumkan
item dalam menu luapan bilah aplikasi.
"withText": Sertakan juga teks judul (didefinisikan oleh android:title) dengan item
tersebut. Teks judul akan muncul jika item muncul dalam menu luapan, sehingga atribut
digunakan terutama menyertakan judul dengan ikon dalam bilah aplikasi.
Misalnya, ikon item menu berikut muncul dalam bilah aplikasi jika ada ruang untuk ikon
tersebut:
<item
android:id="@+id/action_favorites"
android:icon="@drawable/ic_favorites_white"
android:orderInCategory="40"
android:title="@string/action_favorites"
app:showAsAction="ifRoom" />
Dalam gambar di atas:
1. Ikon aksi menu opsi. Dua item menu opsi pertama muncul sebagai ikon aksi dalam bilah aplikasi:
Order (ikon keranjang belanja) dan Info (ikon "i").
2. Tombol luapan. Mengeklik tombol luapan akan menampilkan menu luapan.
3. Menu luapan opsi. Menu luapan menampilkan lebih banyak menu opsi: Favorites dan Contact.
Favorites (ikon hati) tidak pas dalam bilah aplikasi dengan orientasi vertikal, namun muncul
dalam orientasi horizontal pada ponsel cerdas, atau dalam kedua orientasi pada tablet, seperti
yang ditampilkan di bawah ini.
Jika Anda memulai suatu proyek aplikasi menggunakan template Basic Activity, template
tersebut akan menambahkan kode untuk memekarkan menu opsi dengan MenuInflater, sehingga
Anda bisa melewati langkah ini.
Jika Anda tidak menggunakan template Basic Activity, mekarkan sumber daya menu dalam
aktivitas Anda dengan menggunakan metode onCreateOptionsMenu() (dengan anotasi Override
) dengan metode getMenuInflater() dari kelas Activity.
Misalnya, Anda bisa mendefinisikan item Favorites dalam file sumber daya menu untuk
menggunakan atribut android:onClick untuk memanggil metode onFavoritesClick():
<item
android:id="@+id/action_favorites"
android:icon="@drawable/ic_favorites_white"
android:orderInCategory="40"
android:title="@string/action_favorites"
app:showAsAction="ifRoom"
android:onClick="onFavoritesClick" />
Akan tetapi, metode onOptionsItemSelected() dari kelas aktivitas bisa menangani semua klik
item menu pada satu tempat, dan menentukan item menu mana yang telah diklik, sehingga
membuat kode Anda lebih mudah dipahami. Template Basic Activity menyediakan implementasi
metode onOptionsItemSelected() dengan sebuah blok switch case untuk memanggil
metode yang sesuai (seperti showOrder) berdasarkan iditem menu, yang bisa Anda ambil
menggunakan metode getItemId() dari kelas Adapter:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_order:
showOrder();
return true;
case R.id.action_status:
showStatus();
return true;
case R.id.action_contact:
showContact();
return true;
default:
// Do nothing
}
return super.onOptionsItemSelected(item);
}
Menu kontekstual
Gunakan menu kontekstual untuk memungkinkan pengguna melakukan aksi pada tampilan yang
dipilih. Anda bisa menyediakan menu konteks untuk setiap Tampilan, namun menu konteks
paling sering digunakan untuk item dalam RecyclerView, GridView, atau kumpulan tampilan
lainnya, di mana pengguna bisa melakukan tindakan langsung pada setiap item.
Menu konteks, ditampilkan pada sisi kiri dalam gambar di bawah ini, muncul sebagai daftar item
menu mengambang bila pengguna melakukan ketukan lama pada elemen tampilan di layar.
Menu konteks umumnya digunakan untuk memodifikasi elemen tampilan atau menggunakannya
dalam beberapa cara. Misalnya, menu konteks dapat menyertakan Edit untuk mengedit elemen
tampilan, Delete untuk menghapusnya, dan Share untuk membagikannya melalui media sosial.
Pengguna bisa melakukan aksi kontekstual pada satu elemen tampilan untuk setiap kalinya.
Bilah aksi kontekstual, yang ditampilkan di sisi kanan gambar di bawah ini, muncul di bagian atas
layar di tempat bilah aplikasi atau di bawah bilah aplikasi, bersama item aksi yang memengaruhi
elemen tampilan yang dipilih. Pengguna bisa melakukan aksi pada beberapa elemen tampilan
sekaligus (jika aplikasi Anda memungkinkannya).
Ikuti langkah-langkah ini untuk membuat menu konteks mengambang bagi satu atau beberapa
elemen tampilan (lihat gambar di atas):
1. Buat file sumber daya menu XML untuk item menu, tetapkan atribut penampilan dan posisi
(seperti yang dijelaskan di bagian sebelumnya).
2. Daftarkan tampilan ke menu konteks dengan menggunakan metode registerForContextMenu()
dari kelas Activity.
5. Buat metode untuk melakukan aksi bagi setiap item menu konteks.
Buat file dan direktori sumber daya menu XML dengan mengikuti langkah-langkah di bagian
sebelumnya. Gunakan nama yang sesuai untuk file tersebut, seperti menu_context. Tambahkan
item menu konteks (dalam contoh ini, item menu adalah Edit, Share, dan Delete):
<item
android:id="@+id/context_edit"
android:title="@string/edit"
android:orderInCategory="10"/>
<item
android:id="@+id/context_share"
android:title="@string/share"
android:orderInCategory="20"/>
<item
android:id="@+id/context_delete"
android:title="@string/delete"
android:orderInCategory="30"/>
...
// Registering the context menu to the text view of the article.
TextView article_text = (TextView) findViewById(R.id.article);
registerForContextMenu(article_text);
...
Beberapa tampilan bisa didaftarkan ke menu konteks yang sama. Jika Anda ingin setiap item
dalam ListView atau GridView menyediakan menu konteks yang sama, daftarkan semua item
untuk menu konteks dengan meneruskan ListView atau GridView ke registerForContextMenu().
Bila tampilan yang telah didaftarkan menerima kejadian klik-lama, sistem akan memanggil
metode onCreateContextMenu() yang bisa Anda ganti dalam aktivitas atau fragmen. Inilah
tempat Anda mendefinisikan item menu, biasanya dengan memekarkan sumber daya menu.
Misalnya:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_context, menu);
}
Metode menuInfo adalah informasi ekstra tentang tampilan yang didaftarkan untuk menu
konteks. Informasi ini bervariasi, bergantung pada kelas v, yang bisa berupa RecyclerView atau
GridView. Jika Anda mendaftarkan RecyclerView atau GridView, Anda harus membuat instance
objek ContextMenu.ContextMenuInfo untuk menyediakan informasi tentang item yang dipilih,
dan meneruskannya sebagai menuInfo, seperti ID baris, posisi, atau tampilan anak.
Kelas MenuInflater menyediakan metode inflate(), yang memerlukan ID sumber daya sebagai
parameter, untuk sumber daya layout XML yang akan dimuat (menu_context dalam contoh di
atas), dan Menu dimekarkan menjadi (menu dalam contoh di atas).
Bila pengguna mengeklik sebuah item menu, sistem akan memanggil metode
onContextItemSelected(). Anda bisa mengganti metode ini dalam aktivitas atau fragmen untuk
menentukan item menu mana yang diklik, dan untuk tampilan mana menu tersebut dimunculkan.
Anda juga bisa menggunakannya untuk mengimplementasikan aksi yang sesuai untuk item
menu, seperti editNote() dan shareNote() di bawah untuk item menu Edit dan Share.
Misalnya:
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.context_edit:
editNote();
return true;
case R.id.context_share:
shareNote();
return true;
default:
return super.onContextItemSelected(item);
}
}
Contoh di atas menggunakan metode getItemId() untuk mendapatkan id bagi item menu yang
dipilih, dan menggunakannya dalam blok switch case untuk menentukan aksi mana yang akan
dilakukan. Metode id adalah atribut android:id yang ditetapkan untuk item menu dalam file
sumber daya menu XML.
Bila pengguna melakukan klik-lama pada artikel dalam tampilan teks, menu konteks
mengambang akan muncul dan pengguna bisa mengeklik item menu.
Jika Anda menggunakan informasi menuInfo untuk RecyclerView atau GridView, Anda bisa
menambahkan pernyataan sebelum blok kasus peralihan untuk mengumpulkan informasi spesifik
tentang tampilan yang dipilih (untuk info) dengan menggunakan
AdapterView.AdapterContextMenuInfo:
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Bilah aksi kontekstual muncul di bagian atas layar untuk menyajikan tindakan yang bisa
dilakukan pengguna pada tampilan setelah mengeklik lama tampilan, seperti yang ditampilkan
1. Bilah aksi kontekstual. Bilah ini menawarkan tiga tindakan pada sisi kanan (Edit, Share, dan
Delete) serta tombol Done (ikon panah ke kiri) pada sisi kiri.
2. Tampilan. Tampilan di mana klik-lama akan memicu bilah aksi kontekstual.
Bilah aksi kontekstual muncul hanya saat mode aksi kontekstual, implementasi sistem
ActionMode, terjadi akibat pengguna mengeklik lama pada Tampilan.
Saat mode ini diaktifkan, pengguna bisa memilih beberapa item (jika aplikasi Anda
memungkinkannya), menghapus pilihan item, dan melanjutkan navigasi dalam aktivitas. Mode
aksi dinonaktifkan dan bilah aksi kontekstual menghilang saat pengguna menghapus pilihan
semua item, menekan tombol Return, atau mengetuk Done (ikon panah ke kiri) pada sisi kiri
bilah.
Ikuti langkah-langkah ini untuk membuat bilah aksi kontekstual (lihat gambar di bawah ini):
1. Buat file sumber daya menu XML untuk item menu, dan tetapkan ikon untuk setiap item (seperti
yang dijelaskan dalam bagian sebelumnya).
2. Setel listener klik-lama ke tampilan yang harus memicu bilah aksi kontekstual menggunakan
metode setOnLongClickListener(). Panggil startActionMode() dalam metode
setOnLongClickListener() bila pengguna melakukan ketukan lama pada tampilan.
4. Buat metode untuk melakukan aksi bagi setiap item menu konteks.
Buat file dan direktori sumber daya menu XML dengan mengikuti langkah-langkah di bagian
sebelumnya. Gunakan nama yang sesuai untuk file tersebut, seperti menu_context. Tambahkan
ikon untuk item menu konteks (dalam contoh ini, item menu adalah Edit, Share, dan Delete).
Misalnya, item menu Edit akan memiliki atribut ini:
<item
android:id="@+id/context_edit"
android:orderInCategory="10"
android:icon="@drawable/ic_action_edit_white"
android:title="@string/edit" />
Bilah aksi kontekstual standar memiliki latar belakang gelap. Gunakan warna terang atau putih
untuk ikon. Jika Anda menggunakan ikon clipart, pilih HOLO_DARK untuk menu tarik-turun
Theme saat membuat aset gambar baru.
3. Persiapkan listener bilah aksi kontekstual dalam metode onCreate() , menggunakan View
sebagai tipe tampilan untuk menggunakan setOnLongClickListener:
4. @Override
5. protected void onCreate(Bundle savedInstanceState) {
6. ...
7. View articleView = findViewById(article);
8. articleView.setOnLongClickListener(new View.OnLongClickListener() {
9. ...
10. // Add method here to start ActionMode after long-click.
11. ...
12. });
13. }
Sebelum Anda bisa menambahkan kode ke onCreate() untuk memulai ActionMode, Anda harus
mengimplementasikan antarmuka ActionMode.Callback untuk mengelola daur hidup mode aksi.
Dalam metode callback-nya, Anda bisa menetapkan aksi untuk bilah aksi kontekstual, dan
merespons klik pada item aksi.
9. @Override
10. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
11. // Inflate a menu resource providing context menu items
12. MenuInflater inflater = mode.getMenuInflater();
13. inflater.inflate(R.menu.menu_context, menu);
14. return true;
15. }
16. Tambahkan metode onActionItemClicked() dengan penangan Anda untuk setiap item
menu:
17. @Override
18. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
19. switch (item.getItemId()) {
20. case R.id.context_edit:
21. editNote();
22. mode.finish();
23. return true;
24. case R.id.context_share:
25. shareNote();
26. mode.finish();
27. return true;
28. default:
29. return false;
30. }
Kode di atas menggunakan metode getItemId() untuk mendapatkan id bagi item menu
yang dipilih, dan menggunakannya dalam blok switch case untuk menentukan aksi
mana yang akan dilakukan. Metode id dalam setiap pernyataan case adalah atribut
android:id yang ditetapkan untuk item menu dalam file sumber daya menu XML.
Aksi yang ditampilkan adalah metode editNote() dan shareNote() , yang bisa Anda
buat dalam aktivitas yang sama. Setelah aksi dipilih, Anda bisa menggunakan metode
mode.finish() untuk menutup bilah aksi kontekstual.
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
Memulai ActionMode
Kode di atas terlebih dahulu memastikan bahwa instance ActionMode tidak dibuat lagi
jika sudah aktif dengan memeriksa apakah mActionMode nol sebelum memulai mode
aksi:
18. Tinjau kode untuk metode onCreate() dalam aktivitas, yang kini menyertakan
setOnLongClickListener() dan startActionMode():
19. @Override
20. protected void onCreate(Bundle savedInstanceState) {
21. super.onCreate(savedInstanceState);
22. setContentView(R.layout.activity_main);
23.
24. // set up the contextual action bar listener
25. View articleView = findViewById(article);
26. articleView.setOnLongClickListener(new View.OnLongClickListener() {
27. // Called when the user long-clicks on articleView
28. public boolean onLongClick(View view) {
29. if (mActionMode != null) return false;
30. // Start the contextual action bar
31. // using the ActionMode.Callback.
32. mActionMode =
33.
MainActivity.this.startActionMode(mActionModeCallback);
34. view.setSelected(true);
35. return true;
36. }
37. });
38. }
Menu munculan
PopupMenu adalah daftar vertikal untuk item yang ditambatkan pada sebuah Tampilan.
Munculnya di bawah tampilan jangkar jika ada ruang, atau di atas tampilan jika tidak ada.
Menu munculan biasanya digunakan untuk menyediakan luapan aksi (serupa dengan ikon aksi
luapan untuk menu opsi) atau bagian kedua dari perintah dua-bagian. Gunakan menu munculan
untuk tindakan diperluas yang terkait dengan region materi dalam aktivitas Anda. Tidak seperti
menu konteks, menu munculan yang ditambatkan ke sebuah Tombol (Tampilan), selalu tersedia,
dan tindakannya secara umum tidak memengaruhi materi Tampilan.
Misalnya, aplikasi Gmail menggunakan menu munculan yang ditambatkan ke ikon luapan dalam
bilah aplikasi saat menampilkan pesan email. Item menu munculan Reply, Reply All, dan
Forward terkait dengan pesan email, namun tidak memengaruhi atau berfungsi pada pesan.
Tindakan dalam menu munculan tidak boleh secara langsung memengaruhi materi yang
bersangkutan (gunakan menu kontekstual untuk langsung memengaruhi materi yang dipilih).
Seperti yang ditampilkan di bawah ini, sebuah munculan bisa ditambatkan ke tombol aksi luapan
1. Buat file sumber daya menu XML untuk item menu munculan, dan tetapkan atribut penampilan
dan posisi (seperti yang dijelaskan di bagian sebelumnya).
2. Tambahkan ImageButton untuk ikon menu munculan dalam file layout aktivitas XML.
4. Ganti metode onClick() untuk memekarkan menu munculan dan mendaftarkannya dengan
PopupMenu.OnMenuItemClickListener.
6. Buat metode untuk melakukan aksi bagi setiap item menu munculan.
Buat file dan direktori sumber daya menu XML dengan mengikuti langkah-langkah di bagian
sebelumnya. Gunakan nama yang sesuai untuk file tersebut, seperti menu_popup.
Gunakan ImageButton dalam layout aktivitas untuk ikon yang memicu menu munculan. Menu
munculan ditambatkan ke tampilan dalam aktivitas, sebagai ImageButton. Pengguna
mengekliknya untuk melihat menu.
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button_popup"
android:src="@drawable/@drawable/ic_action_popup"/>
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(MainActivity.this, mButton);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.menu_popup, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new
PopupMenu.OnMenuItemClickListener() {
...
// Add onMenuItemClick here
...
// Perform action here
...
}
Setelah membuat instance objek PopupMenu (popup dalam contoh di atas), metode
menggunakan kelas MenuInflater dan metode inflate()-nya, yang memerlukan sebagai
parameter:
id sumber daya untuk sumber daya layout XML yang akan dimuat ( menu_popup dalam contoh
di atas)
Menu tempat memekarkan menjadi (popup.getMenu() dalam contoh di atas).
Untuk melakukan aksi bila pengguna memilih item menu munculan, implementasikan callback
onMenuItemClick() dalam metode setOnClickListener() di atas, dan selesaikan metode
dengan popup.show untuk menampilkan menu munculan:
Sebagai rangkuman, keseluruhan metode onCreate() kini seharusnya tampak seperti ini:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
// popup button setup
mButton = (ImageButton) findViewById(R.id.button_popup);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(MainActivity.this, mButton);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.menu_popup, popup.getMenu());
Ketahui selengkapnya
Panduan Android API, bagian "Kembangkan":
o Menambahkan Bilah Aplikasi
o Menu
Lainnya:
o Panduan Android API, bagian "Desain":Ikon dan sumber daya yang bisa diunduh lainnya
Navigasi turunan
Ketahui selengkapnya
Dalam banyak kasus, Anda akan memerlukan sejumlah jalur berbeda melalui aplikasi Anda yang
menawarkan tipe navigasi berikut:
Navigasi tombol-kembali
Navigasi tombol-kembali—navigasi kembali melalui riwayat layar—sangat mengakar dalam
sistem Android. Pengguna Android mengharapkan tombol Kembali di sudut kiri bawah setiap
layar untuk membawa mereka ke layar sebelumnya. Serangkaian layar historis selalu dimulai
dengan Peluncur atau Launcher pengguna (layar utama perangkat), seperti yang ditampilkan
dalam gambar di bawah ini. Menekan Kembali beberapa kali akan mengembalikan pengguna ke
Launcher.
Anda tidak harus mengelola tombol Kembali di aplikasi. Sistem akan menangani tugas dan
back-stack—yakni daftar layar sebelumnya—secara otomatis. Tombol Kembali secara default
cukup melintasi daftar layar ini, yang membuang layar saat ini dari daftar saat pengguna
menekannya.
Akan tetapi, ada beberapa kasus di mana Anda ingin menggantikan perilaku tombol Kembali.
Misalnya, jika layar Anda berisi browser web yang disematkan, tempat pengguna bisa
berinteraksi dengan elemen laman untuk mengarahkan di antara laman web, Anda mungkin ingin
memicu perilaku kembali default dari browser yang disematkan saat pengguna menekan tombol
Kembali di perangkat.
Metode onBackPressed() dari kelas Activity dipanggil bila aktivitas mendeteksi bahwa pengguna
menekan tombol Kembali. Implementasi default hanya mengakhiri aktivitas saat ini, namun
Anda bisa menggantinya agar melakukan sesuatu:
@Override
public void onBackPressed() {
// Add the Back key handler here.
return;
}
Jika kode Anda memicu browser yang disematkan dengan perilakunya sendiri ke tombol
Kembali, Anda harus mengembalikan perilaku tombol Kembali ke perilaku default sistem, jika
pengguna menggunakan tombol Kembali untuk melebihi awal riwayat internal browser.
1. Layar induk. Layar induk (seperti layar utama aplikasi berita) memungkinkan navigasi turun ke
layar anak.
o Aktivitas utama suatu aplikasi biasanya adalah layar induk.
o Implementasikan layar induk sebagai Activity dengan navigasi turunan ke satu atau
beberapa layar anak.
2. Saudara layar anak level pertama. Saudara adalah beberapa layar dalam posisi yang sama dalam
hierarki dengan layar induk yang sama (seperti saudara kandung).
o Pada saudara level pertama, layar anak bisa berupa kumpulan layar yang mengumpulkan
judul berita, seperti yang ditampilkan di atas.
o Implementasikan navigasi lateral untuk mengarahkan dari satu saudara ke saudara lain
pada level yang sama.
o Jika ada layar level kedua, layar anak level pertama akan menjadi induk bagi saudara
layar anak level kedua. Implementasikan navigasi turunan untuk layar anak level kedua.
3. Saudara layar anak level kedua. Dalam aplikasi berita dan aplikasi lainnya yang menawarkan
beberapa level informasi, saudara layar anak level kedua mungkin menawarkan materi, misalnya
cerita.
o Implementasikan saudara layar anak level kedua sebagai Activity atau Fragment lain.
o Cerita pada level ini bisa meliputi elemen cerita yang disematkan seperti video, peta,
dan komentar, yang mungkin diimplementasikan sebagai fragmen.
Anda bisa memungkinkan pengguna untuk mengarahkan naik dan turun dari suatu induk, dan
menyamping di antara layar saudara:
Navigasi turunan: Mengarahkan turun dari suatu layar induk ke layar anak.
Navigasi leluhur: Mengarahkan naik dari suatu layar anak ke layar induk.
Navigasi lateral: Mengarahkan dari satu saudara ke saudara yang lain (pada level yang sama).
Anda bisa menggunakan aktivitas utama (sebagai layar induk) kemudian aktivitas atau fragmen
lainnya untuk mengimplementasikan hierarki layar dalam aplikasi.
Jika saudara layar anak level pertama memiliki layar anak level lain di bawahnya, Anda harus
mengimplementasikan layar level pertama sebagai aktivitas, sehingga daur hidupnya dikelola
dengan benar sebelum memanggil layar anak level kedua.
Misalnya, dalam gambar di atas, layar induk kemungkinan besar adalah aktivitas utama.
Aktivitas utama aplikasi (biasanya MainActivity.java) umumnya adalah layar induk untuk semua
layar lain dalam aplikasi, dan Anda akan mengimplementasikan pola navigasi dalam aktivitas
utama untuk memungkinkan pengguna berpindah ke aktivitas atau fragmen lain. Misalnya, Anda
bisa mengimplementasikan navigasi menggunakan suatu Maksud yang akan memulai aktivitas.
Tip: Penggunaan suatu Maksud dalam aktivitas saat ini untuk memulai aktivitas lain akan
menambahkan aktivitas saat ini ke tumpukan panggilan, sehingga tombol Kembali di aktivitas
lain (yang dijelaskan di bagian sebelumnya) akan mengembalikan pengguna ke aktivitas saat ini.
Sebagaimana yang Anda pelajari sebelumnya, sistem Android memulai kode dalam suatu
instance Aktivitas dengan metode callback yang mengelola daur hidup aktivitas untuk Anda.
(Pelajaran sebelumnya membahas daur hidup aktivitas; untuk informasi selengkapnya, lihat
"Mengelola Daur Hidup Aktivitas" di bagian Pelatihan pada Panduan Developer Android.)
Hierarki aktivitas induk dan anak didefinisikan dalam file AndroidManifest.xml. Misalnya, yang
berikut ini mendefinisikan OrderActivity sebagai anak dari MainActivityinduk:
<activity android:name=".OrderActivity"
android:label="@string/title_activity_order"
android:parentActivityName=
"com.example.android.droidcafe.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
Jika saudara layar anak tidak memiliki layar anak level lain di bawahnya, Anda bisa
mengimplementasikannya sebagai fragmen. Fragmen menyatakan perilaku atau porsi antarmuka
pengguna dalam suatu aktivitas. Anda bisa menganggap fragmen sebagai bagian modular dari
aktivitas, yang memiliki daur hidup sendiri, menerima kejadian masukan sendiri, dan yang bisa
Anda tambahkan atau buang saat aktivitas berjalan.
Anda bisa mengombinasikan beberapa fragmen dalam satu aktivitas tunggal. Misalnya, dalam
layar saudara bagian yang menampilkan cerita dan diimplementasikan sebagai suatu aktivitas,
Anda mungkin memiliki layar anak untuk klip video yang diimplementasikan sebagai fragmen.
Anda harus mengimplementasikan suatu cara bagi pengguna untuk mengarah ke fragmen klip
video, kemudian kembali ke aktivitas yang menampilkan cerita.
1. Tombol Naik untuk navigasi leluhur dari saudara level pertama ke induk.
2. Tombol Naik untuk navigasi leluhur dari saudara level kedua ke layar anak level pertama yang
bertindak sebagai layar induk.
Tombol Naik digunakan untuk berpindah dalam aplikasi berdasarkan hubungan hierarki antar
layar. Misalnya (denganmerujuk pada gambar di atas):
Jika layar anak level pertama menawarkan judul untuk berpindah ke layar anak level kedua,
saudara layar anak level kedua harus menawarkan tombol Naik yang akan mengembalikan ke
layar anak level pertama, yang merupakan induk mereka bersama.
Jika layar induk menawarkan navigasi ke saudara anak level pertama, maka saudara anak level
pertama harus menawarkan tombol Naik yang mengembalikan ke layar induk.
Jika layar induk adalah layar paling atas dalam aplikasi (yaitu, layar utama aplikasi), layar tersebut
tidak boleh menawarkan tombol Naik.
Tip: Tombol Kembali di bawah layar berbeda dari tombol Naik. Tombol Kembali menyediakan
navigasi ke layar mana pun yang Anda tampilkan sebelumnya. Jika Anda memiliki sejumlah
layar anak yang bisa disusuri oleh pengguna menggunakan pola navigasi lateral (seperti yang
dijelaskan nanti di bab ini), tombol Kembali akan mengirim pengguna kembali ke layar anak
sebelumnya, bukan ke layar induk. Gunakan tombol Naik jika Anda ingin menyediakan navigasi
leluhur dari layar anak kembali ke layar induk. Untuk informasi selengkapnya tentang navigasi
Naik, lihat Menyediakan Navigasi Naik.
Lihat bab konsep "Menu" untuk detail mengenai cara mengimplementasikan bilah aplikasi.
Untuk menyediakan tombol Naik bagi aktivitas layar anak, deklarasikan induk aktivitas sebagai
MainActivity dalam file AndroidManifest.xml. Anda juga bisa menyetel android:label ke
judul layar aktivitas, seperti "Order Activity" (yang diekstrak ke dalam sumber daya string
title_activity_order dalam kode di bawah). Ikuti langkah-langkah ini untuk
mendeklarasikan induk dalam AndroidManifest.xml:
1. Buka AndroidManifest.xml
2. Ubah elemen aktivitas untuk aktivitas layar anak (dalam contoh ini, OrderActivity) ke yang
berikut ini:
3. <activity android:name=".OrderActivity"
4. android:label="@string/title_activity_order"
5. android:parentActivityName=
6.
"com.example.android.optionsmenuorderactivity.MainActivity">
7. <meta-data
8. android:name="android.support.PARENT_ACTIVITY"
9. android:value=".MainActivity"/>
10. </activity>
Layar anak ("Order Activity") kini menyertakan tombol Naik dalam bilah aplikasi (disorot dalam
gambar di bawah ini), yang bisa diketuk oleh pengguna untuk mengarahkan kembali ke layar
induk.
Navigasi turunan
Dengan navigasi turunan, Anda memungkinkan pengguna untuk pergi dari layar induk ke layar
anak level pertama, dan dari layar anak level pertama turun ke layar anak level kedua.
Praktik terbaik untuk navigasi turunan dari layar induk ke saudara kumpulan adalah
menggunakan tombol atau target sederhana seperti susunan gambar atau tombol ikonis (disebut
juga dengan dasbor). Bila pengguna menyentuh tombol, layar saudara kumpulan akan membuka,
yang akan mengganti (layar) konteks saat ini seluruhnya.
Tip: Tombol dan target sederhana jarang sekali digunakan untuk berpindah ke saudara bagian
dalam suatu kumpulan. Lihat daftar, menu korsel, dan kartu di bagian berikutnya.
3. Pola navigasi turunan dari layar induk ke saudara anak level pertama.
Dasbor biasanya memiliki dua atau tiga baris dan kolom, dengan target sentuh luas untuk
membuatnya mudah digunakan. Dasbor adalah yang paling tepat bila setiap saudara kumpulan
sama pentingnya. Anda bisa menggunakan LinearLayout, RelativeLayout, atau GridLayout.
Lihat Layout untuk ringkasan cara kerja layout.
Panel samping navigasi adalah panel yang biasanya menampilkan opsi navigasi pada tepi kiri
layar, seperti yang ditampilkan pada sisi kanan gambar di bawah. Panel ini paling sering
tersembunyi, namun ditampilkan bila pengguna menggesekkan jari dari tepi kiri layar atau
menyentuh ikon navigasi dalam bilah aplikasi, seperti yang ditampilkan pada samping kiri
gambar di bawah ini.
Dalam gambar di atas:
Contoh bagus panel samping navigasi adalah aplikasi Gmail, yang menyediakan akses ke Inbox,
folder email berlabel, dan setelan. Praktik terbaik untuk menggunakan panel samping navigasi
adalah menyediakan navigasi turunan dari aktivitas induk ke semua aktivitas atau fragmen lain
dalam aplikasi. Panel samping navigasi bisa menampilkan banyak target navigasi sekaligus—
misalnya, bisa berisi tombol (seperti dasbor), tab, atau daftar item (panel samping Gmail).
Untuk membuat panel samping navigasi dalam aplikasi, Anda perlu melakukan yang berikut ini:
3. Persiapkan panel samping navigasi dan listener item dalam kode aktivitas.
Untuk membuat layout panel samping navigasi, gunakan DrawerLayout API yang tersedia dalam
Pustaka Dukungan. Untuk spesifikasi desain, ikuti prinsip desain panel samping navigasi dalam
panduan desain Panel Samping Navigasi.
Untuk menambahkan panel samping navigasi, gunakan DrawerLayout sebagai tampilan akar
layout aktivitas Anda. Di dalam DrawerLayout, tambahkan satu tampilan yang berisi materi
utama untuk layar (layout utama Anda saat panel samping disembunyikan) dan tampilan lain,
umumnya NavigationView, yang berisi materi panel samping navigasi.
Tip: Untuk membuat layout Anda lebih mudah dipahami, gunakan tag include untuk
menyertakan layout XML dalam layout XML lainnya.
NavigationView yang menyatakan menu navigasi standar yang bisa diisi oleh file XML sumber
daya menu.
activity_main.xml:
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
android:layout_gravity="start"
Gunakan atributandroid:fitsSystemWindows="true" untuk menyetel pengisi
DrawerLayout dan NavigationView untuk memastikan materi tidak menghamparkan
jendela sistem. DrawerLayout menggunakan fitsSystemWindows sebagai tanda bahwa
anaknya (seperti tampilan materi utama) perlu disisipkan, namun tetap menggambar latar
belakang bilah status atas di ruang itu. Akibatnya, panel samping navigasi tampak tumpang
tindih, namun tidak mengaburkan, bilah status atas yang tembus pandang. Sisipan yang Anda
dapatkan dari fitsSystemWindows akan dikoreksi pada semua versi platform untuk
memastikan materi Anda tidak tumpang tindih dengan komponen UI yang disediakan sistem.
Objek NavigationView menetapkan layout untuk header panel samping navigasi dengan atribut
app:headerLayout="@layout/nav_header_main". File nav_header_main.xml
mendefinisikan layout header ini untuk menyertakan ImageView dan TextView, yang umum
untuk panel samping navigasi, namun Anda juga bisa menyertakan Tampilan lain.
Tip: Tinggi header harus 160 dp, yang harus Anda ekstrak menjadi sumber daya dimensi
(nav_header_height).
nav_header_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:src="@android:drawable/sym_def_app_icon" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="@string/my_app_title"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
</LinearLayout>
app_bar_main.xml:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
Layout di atas menggunakan tag include untuk menyertakan layout content_main , yang
mendefinisikan layout layar aktivitas utama (content_main.xml). Dalam contoh layout di bawah
ini, layar aktivitas utama menampilkan TextView yang menampilkan string "Hello World!":
content_main.xml:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
Layout content_main harus anak pertama dalam DrawerLayout karena panel samping harus
berada di atas materi. Dalam layout kami di atas, layout content_main disertakan dalam layout
app_bar_main , yang merupakan anak pertama.
Layout content_main menggunakan sebuah grup tampilan RelativeLayout yang disetel
untuk menyesuaikan dengan lebar dan panjang tampilan induk, karena layout ini menyatakan
keseluruhan UI saat panel samping navigasi disembunyikan.
Perilaku layout untuk RelativeLayout disetel ke sumber daya string
@string/appbar_scrolling_view_behavior, yang mengontrol perilaku gulir layar
sehubungan dengan bilah aplikasi di bagian atas. Perilaku ini didefinisikan oleh kelas
AppBarLayout.ScrollingViewBehavior. Perilaku ini harus digunakan oleh Tampilan yang bisa
menggulir secara vertikal—perilaku ini mendukung pengguliran tersarang untuk menggulir
AppBarLayout yang seinduk secara otomatis.
Objek NavigationView di layout activity_main menetapkan item menu untuk panel samping
navigasi dengan menggunakan pernyataan berikut:
app:menu="@menu/activity_main_drawer"
Item menu didefinisikan dalam file activity_main_drawer.xml , yang berlokasi di app > res >
menu. Tag <group></group> mendefinisikan grup menu—kumpulan item yang memiliki ciri
sama, seperti apakah mereka terlihat, aktif, atau bisa dicentang. Suatu grup harus berisi satu atau
beberapa elemen <item></> dan merupakan anak dari elemen <menu> , seperti yang ditampilkan
di bawah ini. Selain mendefinisikan setiap judul item menu dengan atribut android:title , file
juga mendefinisikan setiap ikon item menu dengan atribut android:icon .
single: Hanya satu item dari grup ini yang bisa dicentang. Gunakan untuk tombol radio.
all: Semua item bisa dicentang. Gunakan untuk kotak centang.
Untuk menggunakan listener item menu panel samping navigasi, aktivitas yang menjadi host
panel samping navigasi harus mengimplementasikan antarmuka
OnNavigationItemSelectedListener:
6. Klik bola lampu peringatan merah, pilih Implement methods, dan pilih metode
onNavigationItemSelected(item:MenuItem):boolean.
@Override
public boolean onNavigationItemSelected(MenuItem item) {
return false;
}
}
Anda bisa mempelajari cara menggunakan stub ini di bagian berikutnya.
28. ActionBarDrawerToggle juga memungkinkan Anda menetapkan string yang digunakan untuk
menjelaskan tindakan buka/tutup panel samping untuk layanan aksesibilitas. Definisikan string
berikut ini dalam file string.xml Anda:
29. <string name="navigation_drawer_open">Open navigation drawer</string>
30. <string name="navigation_drawer_close">Close navigation
drawer</string>
Tulis kode dalam stub metode onNavigationItemSelected() untuk menangani pemilihan item
menu. Metode ini dipanggil bila item dalam menu panel samping navigasi diketuk.
Metode ini menggunakan pernyataan if untuk melakukan aksi yang sesuai berdasarkan iditem
menu, yang bisa Anda ambil dengan menggunakan metode getItemId():
@Override
public boolean onNavigationItemSelected(MenuItem item) {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
// Handle navigation view item clicks here.
switch (item.getItemId()) {
case R.id.nav_camera:
// Handle the camera import action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_camera));
return true;
case R.id.nav_gallery:
// Handle the gallery action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_gallery));
return true;
case R.id.nav_slideshow:
// Handle the slideshow action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_slideshow));
return true;
case R.id.nav_manage:
// Handle the tools action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_tools));
return true;
case R.id.nav_share:
// Handle the share action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_share));
return true;
case R.id.nav_send:
// Handle the send action (for now display a toast).
drawer.closeDrawer(GravityCompat.START);
displayToast(getString(R.string.chose_send));
return true;
default:
return false;
}
}
Setelah pengguna mengetuk pilihan di panel samping navigasi atau mengetuk di luar panel
samping, metode closeDrawer() DrawerLayout akan menutup panel samping.
Gunakan daftar gulir, seperti RecyclerView, untuk menyediakan target navigasi bagi navigasi
turunan. Daftar yang bergulir secara vertikal sering kali digunakan untuk layar yang
mencantumkan cerita, dengan setiap item daftar bertindak sebagai tombol bagi setiap cerita.
Untuk item materi yang lebih bersifat visual atau kaya media seperti foto atau video, Anda bisa
menggunakan daftar yang bergulir secara horizontal (disebut juga dengan menu korsel). Elemen
UI ini bagus untuk menyajikan item dalam suatu kumpulan (misalnya, daftar berita).
Dalam alur navigasi master/detail, layar master berisi daftar item, dan layar detail menampilkan
informasi detail tentang item tertentu. Navigasi turunan biasanya diimplementasikan oleh salah
satu hal berikut ini:
Menggunakan Maksud yang memulai aktivitas yang menyatakan layar detail. Untuk informasi
selengkapnya tentang Maksud, lihat Maksud dan Filter Maksud dalam Panduan Developer
Android.
Saat menambahkan Aktivitas Setelan, Anda bisa memperluas PreferenceActivity untuk membuat
layout master/detail dua panel agar mendukung layar lebar, dan menyertakan fragmen dalam
aktivitas untuk menggantikan materi aktivitas dengan fragmen setelan. Inilah pola yang berguna
jika Anda memiliki beberapa grup setelan dan harus mendukung layar berukuran tablet serta
ponsel cerdas. Anda akan mempelajari tentang Aktivitas Setelan dan PreferenceActivity dalam
bab berikutnya. Untuk informasi selengkapnya tentang menggunakan fragmen, lihat Fragmen
dalam Panduan Developer Android.
Ponsel cerdas paling tepat untuk menampilkan satu layar setiap kalinya—seperti layar master
(pada sisi kiri gambar di bawah) dan layar detail (pada sisi kanan gambar di bawah ini).
Sebaliknya, tampilan tablet, terutama saat dilihat pada orientasi lanskap, paling pas untuk
menampilkan beberapa panel materi sekaligus: master di sebelah kiri, dan detail di sebelah
kanan, seperti yang ditampilkan di bawah ini.
Menu opsi dalam bilah aplikasi
Bilah aplikasi umumnya berisi menu opsi, yang paling sering digunakan untuk pola navigasi bagi
navigasi turunan. Bilah ini juga berisi ikon Naik dari navigasi leluhur, ikon navigasi untuk
membuka panel samping navigasi, dan ikon filter untuk memfilter tampilan laman. Anda telah
mempelajari cara mempersiapkan menu opsi dan bilah aplikasi dalam bab sebelumnya.
Contoh navigasi lateral lainnya adalah kemampuan untuk menggesek ke kiri atau kanan pada
percakapan Gmail untuk menampilkan email baru atau lama dalam Inbox yang sama.
Anda bisa mengimplementasikan navigasi lateral dengan tab yang menyatakan setiap layar. Tab
muncul sepanjang bagian atas layar, seperti yang ditampilkan pada sisi kiri gambar di atas, yang
menyediakan navigasi ke layar lainnya. Navigasi tab adalah solusi umum untuk navigasi lateral
dari satu layar anak ke layar anak lainnya yang bersaudara—di posisi yang sama dalam hierarki
dan memiliki layar induk yang sama.
Tab paling tepat untuk rangkaian kecil (empat atau kurang) layar saudara. Anda bisa
mengombinasikannya dengan tampilan gesek, sehingga pengguna bisa menggesek dari satu layar
ke layar lainnya serta mengetuk tab.
Karena ada tab tunggal yang lebih dulu dipilih, pengguna selalu memiliki akses ke materi tab
tersebut dari layar induk tanpa navigasi lebih jauh.
Pengguna bisa beralih dengan cepat di antara layar-layar terkait, tanpa perlu mengunjungi lagi
layar induk terlebih dahulu.
Tab harus menetap di semua layar yang terkait. Hanya region materi yang ditentukan yang akan
berubah saat mengetuk tab, dan indikator harus tetap tersedia sepanjang waktu.
Peralihan ke tab lain tidak boleh diperlakukan sebagai riwayat. Misalnya, jika seorang pengguna
beralih dari tab A ke tab B, menekan tombol Naik pada bilah aplikasi tidak akan memilih lagi tab
A, namun justru akan mengembalikan pengguna ke layar induk.
1. Mendefinisikan layout tab. Kelas utama yang digunakan untuk menampilkan tab adalah
TabLayout. Kelas ini menyediakan layout horizontal untuk menampilkan tab. Anda bisa
menampilkan tab di bawah bilah aplikasi.
2. Mengimplementasikan Fragmen untuk setiap layar materi tab. Fragmen adalah perilaku atau
bagian antarmuka pengguna dalam suatu aktivitas. Fragmen seperti aktivitas mini di dalam
aktivitas utama, dengan daur hidupnya sendiri. Salah satu manfaat menggunakan fragmen untuk
materi tab adalah Anda bisa mengisolasi kode untuk mengelola materi tab dalam fragmen.
Untuk mengetahui tentang fragmen, lihat Fragmen dalam Panduan API.
3. Menambahkan adapter pager. Gunakan kelas PagerAdapter untuk mengisi "laman" (layar) di
dalam ViewPager, yaitu pengelola layout yang memungkinkan pengguna membalik ke kiri dan
kanan pada layar data. Sediakan implementasi PagerAdapter untuk menghasilkan layar yang
akan ditunjukkan oleh tampilan. ViewPager paling sering digunakan bersama Fragment, yang
merupakan cara praktis untuk menyediakan dan mengelola daur hidup setiap layar.
4. Membuat instance layout tab, dan menyetel teks untuk setiap tab.
5. Menggunakan PagerAdapter untuk mengelola tampilan layar ("laman"). Setiap layar
dinyatakan oleh fragmennya setiap.
FragmentPagerAdapter: Didesain untuk navigasi antar layar (laman) saudara yang menyatakan
jumlah layar yang tetap dan sedikit.
FragmentStatePagerAdapter: Didesain untuk paging ke semua kumpulan layar (laman) dengan
jumlah layar tidak ditentukan. Hal ini akan memusnahkan fragmen saat pengguna beralih ke
layar lain, sehingga meminimalkan penggunaan memori. Aplikasi untuk tantangan praktis ini
menggunakan FragmentStatePagerAdapter.
Untuk menggunakan TabLayout, Anda bisa mendesain layout aktivitas utama untuk
menggunakan Toolbar sebagai bilah aplikasi, TabLayout untuk tab di bawah bilah aplikasi, dan
ViewPager dalam layout akar untuk mengalihkan tampilan anak. Layout harus tampak sama
dengan yang berikut ini, dengan anggapan setiap tampilan anak mengisi layar:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/tab_layout"/>
Untuk setiap tampilan anak, buat file layout seperti tab_fragment1.xml, tab_fragment2.xml,
tab_fragment3.xml, dan seterusnya.
Mengimplementasikan setiap fragmen
Fragmen adalah perilaku atau bagian antarmuka pengguna dalam suatu aktivitas. Fragmen
seperti aktivitas mini di dalam aktivitas utama, dengan daur hidupnya sendiri. Untuk mengetahui
tentang fragmen, lihat Fragmen dalam Panduan API.
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.tab_fragment1, container, false);
}
}
3. Menggunakan blok switch case untuk mengembalikan layar (laman) agar ditampilkan
berdasarkan tab yang diklik
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new TabFragment1();
case 1:
return new TabFragment2();
case 2:
return new TabFragment3();
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
Di metode onCreate() dari aktivitas utama, buat instance layout tab dari elemen tab_layout
di layout, dan setel teks untuk setiap tab menggunakan addTab():
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Create an instance of the tab layout from the view.
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
// Set the text for each tab.
tabLayout.addTab(tabLayout.newTab().setText("Top Stories"));
tabLayout.addTab(tabLayout.newTab().setText("Tech News"));
tabLayout.addTab(tabLayout.newTab().setText("Cooking"));
// Set the tabs to fill the entire layout.
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
// Use PagerAdapter to manage page views in fragments.
...
}
Ekstrak sumber daya string untuk teks tab yang disetel oleh setText():
"Cooking" ke tab_label3
Gunakan PagerAdapter dalam metode onCreate() aktivitas utama untuk mengelola tampilan
layar ("laman") dalam fragmen. Setiap layar dinyatakan oleh fragmennya setiap. Anda juga perlu
menyetel listener untuk menentukan tab mana yang diketuk. Kode berikut ini harus muncul
setelah kode dari bagian sebelumnya dalam metode onCreate() :
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Use PagerAdapter to manage page views in fragments.
// Each page is represented by its own fragment.
// This is another example of the adapter pattern.
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
// Setting a listener for clicks.
viewPager.addOnPageChangeListener(new
TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
ViewPager adalah pengelola layout yang memungkinkan pengguna membalik "laman" (layar)
materi ke kiri dan ke kanan. ViewPager paling sering digunakan bersama Fragment, yang
merupakan cara praktis untuk menyediakan dan mengelola daur hidup setiap "laman".
ViewPager juga menyediakan kemampuan untuk menggesek "laman" secara horizontal.
Dalam contoh sebelumnya, Anda menggunakan ViewPager dalam layout akar untuk
mengalihkan layar anak. Ini menyediakan kemampuan bagi pengguna untuk menggesek dari satu
layar anak ke layar anak lainnya. Pengguna bisa beralih ke layar saudara dengan menyentuh dan
menyeret layar secara horizontal dalam arah layar berdekatan yang diinginkan.
Tampilan gesek paling tepat jika ada kesamaan dalam tipe materi di antara laman yang
bersaudara, dan jika jumlah saudara relatif kecil. Dalam kasus ini, pola bisa digunakan bersama
tab di atas region materi untuk menunjukkan laman saat ini dan laman yang tersedia, guna
membantu kemampuan untuk dapat ditemukan dan menyediakan lebih banyak konteks bagi
pengguna.
Tip: Sebaiknya hindari paging secara horizontal bila layar anak berisi permukaan geser
horizontal (seperti peta), karena interaksi yang saling bertentangan ini bisa menghalangi
kegunaan layar Anda.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Bilah Aksi
Menu
4.4: RecyclerView
Materi:
Komponen RecyclerView
Data
RecyclerView
Layout Item
Pengelola Layout
Animasi
Adapter
ViewHolder
Mengimplementasikan RecyclerView
1. Tambahkan dependensi ke app/build.gradle
2. Tambahkan RecyclerView ke layout aktivitas Anda
3. Buat layout untuk satu item
4. Buat adapter dengan view holder
5. Implementasikan kelas view holder
6. Buat RecyclerView
Praktik terkait
Ketahui selengkapnya
Saat Anda menampilkan banyak item dalam daftar yang bisa digulir, sebagian besar item tidak
terlihat. Misalnya, dalam daftar kata yang panjang atau banyak judul berita, pengguna hanya
melihat sedikit item daftar untuk setiap kalinya.
Atau, Anda bisa memiliki kumpulan data yang akan berubah saat pengguna berinteraksi
dengannya. Jika Anda membuat tampilan baru setiap kali data berubah, itu juga membuat banyak
tampilan, bahkan untuk kumpulan data yang kecil.
Dari perspektif kinerja, Anda bisa meminimalkan jumlah tampilan yang disimpan pada titik
tertentu (Memori), dan jumlah tampilan yang harus Anda buat (Waktu). Kedua tujuan ini bisa
dicapai dengan membuat agak lebih banyak tampilan daripada yang bisa dilihat pengguna pada
layar, dan buat cache serta gunakan kembali tampilan yang dibuat sebelumnya dengan data
berbeda saat pengguna menggulir ke dalam dan ke luar tampilan.
Kelas RecyclerView adalah versi ListView yang lebih canggih dan fleksibel. Widget ini adalah
kontainer untuk menampilkan rangkaian data besar yang bisa digulir secara sangat efisien
dengan mempertahankan tampilan dalam jumlah terbatas.
Gunakan widget RecyclerView bila Anda perlu menampilkan banyak data yang bisa digulir, atau
kumpulan data dengan elemen yang berubah pada waktu proses berdasarkan aksi pengguna atau
kejadian jaringan.
Komponen RecyclerView
Untuk menampilkan data dalam RecyclerView, Anda memerlukan bagian berikut:
Data. Tidak penting dari mana asal data. Anda bisa membuat data secara lokal, seperti
yang Anda lakukan dalam latihan, mendapatkannya dari database perangkat seperti yang
akan Anda lakukan dalam praktik nanti, atau menariknya dari awan.
RecyclerView. Daftar gulir yang berisi item daftar.
Instance RecyclerView sebagaimana didefinisikan dalam file layout aktivitas Anda akan
bertindak sebagai kontainer tampilan.
Layout untuk satu item data. Semua item daftar tampak sama, sehingga Anda bisa
menggunakan layout yang sama untuk semuanya. Layout item harus dibuat secara
terpisah dari layout aktivitas, sehingga satu per satu tampilan item bisa dibuat dan diisi
data.
Pengelola layout Pengelola layout menangani penyusunan (layout) komponen antarmuka
pengguna dalam suatu tampilan. Semua grup tampilan memiliki pengelola layout. Untuk
LinearLayout, sistem Android menangani layout untuk Anda. RecyclerView memerlukan
pengelola layout eksplisit untuk mengelola susunan item daftar yang terdapat di
dalamnya. Layout ini bisa vertikal, horizontal, atau berupa petak.
View holder. View holder memperluas kelas ViewHolder. View holder berisi tampilan
informasi untuk menampilkan satu item dari layout item.
View holder digunakan oleh adapter untuk menyediakan data, yang merupakan ekstensi
dari RecyclerView.ViewHolder
Diagram di bawah ini menampilkan hubungan antara komponen-komponen ini.
Data
Semua data yang bisa ditampilkan akan ditampilkan dalam RecyclerView.
Teks
Gambar
Ikon
RecyclerView
RecyclerView adalah:
Pengelola Layout
Pengelola layout memosisikan tampilan item di dalam grup tampilan, seperti RecyclerView dan
menentukan kapan harus menggunakan kembali tampilan item yang tidak lagi terlihat oleh
pengguna. Untuk menggunakan kembali (atau mendaur ulang) tampilan, pengelola layout bisa
meminta adapter untuk mengganti materi tampilan dengan elemen lain dari kumpulan data.
Mendaur ulang tampilan dengan cara ini akan meningkatkan kinerja karena menghindari
pembuatan tampilan yang tidak diperlukan atau melakukan pencarian findViewById() yang
mahal.
Animasi
Animasi untuk menambahkan dan menghapus item diaktifkan secara default dalam
RecyclerView. Untuk menyesuaikan animasi ini, perluas kelas RecyclerView.ItemAnimator dan
gunakan metode RecyclerView.setItemAnimator().
Adapter
Adapter membantu dua antarmuka yang tidak kompatibel untuk bekerja bersama. Dalam
RecyclerView, adapter menghubungkan data dengan tampilan. Adapter bertindak sebagai
perantara antara data dan tampilan. Adapter menerima atau mengambil data, melakukan semua
pekerjaan yang diperlukan agar bisa ditampilkan dalam suatu tampilan, dan menempatkan data
dalam tampilan.
Misalnya, adapter bisa menerima data dari database sebagai objek Cursor, mengekstrak kata dan
definisinya, mengonversinya menjadi string, dan menempatkan string dalam suatu tampilan item
yang memiliki tampilan teks, satu untuk kata dan satu untuk definisi. Anda akan mengetahui
selengkapnya tentang kursor dalam bab berikutnya.
View holder
RecyclerView.ViewHolder menjelaskan tampilan data dan metadata tentnag tempatnya dalam
RecyclerView. Setiap view holder menampung satu rangkaian data. Adapter menambahkan data
ke view holder untuk ditampilkan oleh pengelola layout.
Definisikan layout view holder Anda dalam file sumber daya XML. Layout ini bisa berisi
(hampir) semua tipe tampilan, termasuk elemen yang bisa diklik.
Mengimplementasikan RecyclerView
Mengimplementasikan RecyclerView memerlukan langkah-langkah berikut:
dependencies {
...
compile 'com.android.support:recyclerview-v7:24.1.1'
...
}
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
Gunakan RecyclerView dari pustaka dukungan agar kompatibel dengan perangkat lama. Satu-
satunya atribut yang diperlukan adalah id, beserta lebar dan tinggi. Sesuaikan item tersebut,
bukan grup tampilan ini.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="6dp">
<TextView
android:id="@+id/word"
style="@style/word_title" />
</LinearLayout>
Tampilan teks memiliki elemen @style . Gaya adalah kumpulan properti yang menetapkan
sosok suatu tampilan. Anda bisa menggunakan gaya untuk berbagi atribut tampilan dengan
beberapa tampilan. Sebuah cara mudah untuk membuat gaya adalah dengan mengekstrak gaya
elemen UI yang sudah Anda buat. Misalnya, setelah menata gaya TextView, Right-click >
Refactor > Extract > Style pada elemen tersebut dan ikuti konfirmasi dialog. Lebih detail
mengenai gaya ada dalam praktik dan dalam bab berikutnya.
Dalam konstruktor, dapatkan inflater dari konteks saat ini, dan data Anda.
Kelas ini biasanya didefinisikan sebagai kelas dalam untuk adapter dan memperluas
RecyclerView.ViewHolder.
Jika Anda ingin menambahkan penanganan klik, Anda perlu mengimplementasikan listener klik.
Salah satu cara untuk melakukannya adalah dengan memiliki view holder yang
mengimplementasikan metode listener klik.
@Override
public void onClick(View v) {
wordItemView.setText ("Clicked! "+ wordItemView.getText());
}
Perhatikan, untuk memasang listener klik ke elemen view holder lain, Anda harus melakukannya
secara dinamis dalam onBindViewHolder. (Anda akan melakukan ini pada praktik nanti, saat
Anda akan memperluas kode RecyclerView dari praktik.)
6. Buat RecyclerView
Terakhir, untuk mengikat semuanya, dalam metode onCreate() aktivitas Anda:
RecyclerView adalah cara efisien untuk menampilkan data daftar gulir. RecyclerView
menggunakan pola adapter untuk menghubungkan data dengan tampilan item daftar. Untuk
mengimplementasikan RecyclerView, Anda perlu membuat adapter dan view holder, dan metode
yang mengambil data serta menambahkannya ke item daftar.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Buat RecyclerView
Ketahui selengkapnya
RecyclerView
Kelas RecyclerView
Kelas RecyclerView.Adapter
Kelas RecyclerView.ViewHolder
Kelas RecyclerView.LayoutManager
Gambar
Gaya
Tema
Praktik terkait
Ketahui selengkapnya
Dalam bab ini Anda akan mengetahui cara menggunakan sumber daya dapat digambar, yaitu
kompilasi gambar yang bisa digunakan dalam aplikasi. Android menyediakan kelas dan sumber
daya untuk membantu Anda menyertakan gambar sempurna dalam aplikasi dengan dampak
minimal pada kinerjanya.
Anda juga akan mengetahui cara menggunakan gaya serta tema agar menghasilkan penampilan
yang konsisten untuk semua elemen dalam aplikasi dengan mengurangi jumlah kode.
File gambar
File nine-patch
Daftar layer
Yang tidak dibahas dalam bab ini:
Sumber daya dapat digambar untuk bentuk Sumber daya dapat digambar untuk skala
Sumber daya dapat digambar untuk sisipan
Daftar keadaan
Sumber daya dapat digambar untuk klip
Daftar level
Untuk menampilkan sumber daya dapat digambar, gunakan kelas ImageView untuk membuat
Tampilan. Di elemen <ImageView> dalam file XML Anda, definisikan cara menampilkan sumber
daya dapat digambar dan tempat menggambarnya. Misalnya, ImageView ini menampilkan
gambar yang disebut "birthdaycake.png":
<ImageView
android:id="@+id/tiles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/birthdaycake" />
Atribut android:id menyetel nama pintasan yang Anda gunakan nanti untuk memanggil
gambar.
Atribut android:layout_width dan android:layout_height menetapkan ukuran
Tampilan. Dalam contoh ini, tinggi dan lebar disetel ke wrap_content, yang berarti Tampilan
hanya cukup besar untuk memasukkan gambar di dalamnya, plus pengisi.
Atribut android:src memberikan lokasi menyimpan gambar. Jika Anda memiliki beberapa
versi gambar yang cocok untuk beberapa resolusi layar berbeda, simpan gambar dalam folder
bernama res/drawable-[density]/. Misalnya, simpan versi birthdaycake.png yang cocok untuk
layar hdpi dalam res/drawable-hdpi/birthdaycake.png. Untuk informasi selengkapnya, lihat
panduan multilayar.
<ImageView> juga memiliki atribut yang bisa Anda gunakan untuk memotong gambar jika
gambar terlalu besar atau memiliki rasio aspek berbeda dari layout atau Tampilan. Untuk detail
lengkap, lihat dokumentasi kelas ImageView.
Untuk menyatakan sumber daya dapat digambar dalam aplikasi Anda, gunakan kelas Drawable
atau salah satu subkelasnya. Misalnya, kode ini mengambil gambar birthdaycake.png sebagai
Drawable:
File gambar
File gambar merupakan file bitmap generik. Android mendukung file gambar dalam sejumlah
format: WebP (diutamakan), PNG (diutamakan), dan JPG (diterima). Format GIF dan BMP
didukung, namun tidak disarankan.
Format WebP sepenuhnya didukung dari Android 4.2. WebP memadatkan lebih baik daripada
format lain dalam hal kompresi lossless dan lossy, yang berpotensi menghasilkan gambar lebih
dari 25% lebih kecil daripada format JPEG. Anda bisa mengonversi gambar PNG dan JPEG
yang ada menjadi format WebP sebelum diunggah. Untuk informasi selengkapnya tentang WebP,
lihat dokumentasi WebP.
Simpan file gambar dalam folder res/drawable. Gunakan gambar tersebut bersama atribut
android:src untuk ImageView dan turunannya, atau untuk membuat kelas BitmapDrawable
dalam kode Java.
Ketahuilah bahwa gambar terlihat berbeda pada layar yang memiliki kepadatan piksel serta rasio
aspek yang berbeda. Untuk informasi tentang mendukung ukuran layar yang berbeda, lihat
Mempercepat aplikasi Anda, di bawah ini, dan panduan ukuran layar.
Catatan: Selalu gunakan gambar dengan ukuran yang sesuai, karena gambar bisa menggunakan banyak
ruang disk dan memengaruhi kinerja aplikasi Anda.
File nine-patch
9-patch adalah gambar PNG yang Anda gunakan untuk mendefinisikan region yang dapat
direntang. Gunakan 9-patch sebagai gambar latar belakang bagi Tampilan untuk memastikan
Tampilan terlihat pas untuk orientasi dan ukuran layar yang berbeda.
Simpan file 9-patch dengan ekstensi 9.png dalam folder res/drawable. Gunakan gambar tersebut
bersama atribut android:src untuk ImageView dan turunannya, atau untuk membuat kelas
NinePatchDrawable dalam kode Java.
Untuk membuat 9-patch, gunakan alat (bantu) Draw 9-Patch di Android Studio. Alat (bantu)
tersebut memungkinkan Anda memulai dengan PNG biasa dan mendefinisikan border 1 piksel di
sekeliling gambar di tempat yang memungkinkan sistem Android merentang gambar jika
diperlukan. Untuk menggunakan alat (bantu):
1. Masukkan file PNG dalam folder res/drawable. (Caranya, salin file gambar dalam folder
app/src/main/res/drawable proyek Anda.)
2. Dalam Android Studio, klik-kanan pada file dan pilih Create 9-Patch file. Android Studio
menyimpan file dengan ekstensi .9.png.
3. Di Android Studio, klik dua kali file .9.png untuk membuka editor.
#
1. Border untuk menunjukkan region yang siap direntang melebar (secara horizontal).
Misalnya, dalam Tampilan yang lebih lebar daripada gambar, setrip hijau di sisi kiri dan
kanan 9-patch ini bisa direntang untuk mengisi Tampilan. Tempat yang bisa direntang
ditandai dengan warna hitam. Klik untuk menghitamkan piksel.
2. Border untuk menunjukkan region yang siap direntang memanjang (secara vertikal). Misalnya,
dalam Tampilan yang lebih tinggi daripada gambar, setrip hijau di bagian atas dan bawah 9-patch
ini bisa direntang untuk mengisi Tampilan.
3. Nonaktifkan piksel dengan mengeklik tombol shift (klik ctrl pada Mac).
6. Centang Show patches untuk pratinjau jalur yang dapat direntang dalam area menggambar.
Tip: Pastikan region yang dapat direntang setidaknya berukuran 2x2 piksel. Jika tidak, region bisa
menghilang bila skala gambar diturunkan.
Untuk pembahasan lebih detail tentang cara membuat file 9-patch dengan region yang dapat
direntang, lihat panduan 9-patch.
Di Android, Anda bisa membangun gambar dengan melapiskan gambar lain, seperti yang bisa
dilakukan di GIMP dan program manipulasi gambar lainnya. Setiap layer dinyatakan oleh
sumber daya dapat digambar individual. Sumber daya dapat digambar yang membentuk gambar
tunggal diatur dan dikelola dalam suatu elemen <layer-list> dalam XML. Dalam <layer-
list>, setiap sumber daya dapat digambar dinyatakan melalui elemen <item> .
Layer digambar di atas setiap dengan urutan yang didefinisikan dalam file XML, berarti sumber
daya dapat digambar yang terakhir dalam daftar akan digambar paling atas. Misalnya, sumber
daya dapat digambar untuk daftar layer dibuat dari tiga sumber daya dapat digambar yang saling
melapis:
Dalam XML berikut, yang mendefinisikan daftar layer ini, gambar android_blue didefinisikan
terakhir, sehingga digambar terakhir dan ditampilkan paling atas:
LayerDrawable adalah objek sumber daya dapat digambar yang mengelola larik sumber daya
dapat digambar lainnya. Untuk informasi selengkapnya tentang cara menggunakan sumber daya
dapat digambar untuk daftar layer, lihat panduan daftar layer.
Sumber daya dapat digambar untuk bentuk adalah persegi panjang, oval, garis, atau cincin yang
Anda definisikan dalam XML. Anda bisa menetapkan ukuran dan gaya bentuk dengan
menggunakan atribut XML.
Misalnya, file XML ini membuat persegi panjang dengan sudut tumpul dan gradien warna.
Warna pengisi persegi berubah dari putih (#000000) di sudut kiri bawah menjadi biru (#0000dd)
di sudut kanan atas. Atribut angle menentukan cara gradien dimiringkan:
Dengan anggapan bahwa file XML sumber daya dapat digambar untuk bentuk disimpan di
res/drawable/gradient_box.xml, XML layout berikut menerapkan sumber daya dapat digambar
untuk bentuk sebagai latar belakang untuk Tampilan:
<TextView
android:background="@drawable/gradient_box"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
Kode berikut menampilkan cara mendapatkan sumber daya dapat digambar untuk bentuk lewat
program dan menggunakannya sebagai latar belakang Tampilan, sebagai alternatif untuk
mendefinisikan atribut latar belakang dalam XML:
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
Anda bisa menyetel atribut lain bagi sumber daya dapat digambar untuk bentuk. Sintaks
lengkapnya adalah seperti berikut:
Untuk detail tentang atribut ini, lihat referensi sumber daya dapat digambar untuk bentuk.
StateListDrawable adalah objek sumber daya dapat digambar yang menggunakan gambar
berbeda untuk menyatakan objek yang sama, bergantung pada keadaan objek tersebut berada.
Misalnya, sebuah widget Button bisa ada dalam salah satu dari sejumlah keadaan (ditekan,
difokuskan, diarahkan ke atas, atau tidak satu pun dari keadaan ini). Dengan menggunakan
sumber daya dapat digambar untuk daftar keadaan, Anda bisa menyediakan beragam gambar
latar untuk setiap keadaan.
Anda bisa menjelaskan daftar keadaan dalam file XML. Setiap grafik dinyatakan melalui elemen
<item> di dalam sebuah elemen <selector> . Setiap <item> menggunakan sebuah atribut
state_ untuk menunjukkan situasi tempat menggunakan grafik.
Selama setiap perubahan keadaan, Android akan menyusuri daftar keadaan dari atas ke bawah.
Item pertama yang cocok dengan keadaan saat ini akan digunakan, yang berarti pemilihan ini
tidak berdasarkan pada "kecocokan terbaik," melainkan cukup dengan item pertama yang
memenuhi kriteria minimum keadaan tersebut.
Daftar keadaan dalam contoh berikut mendefinisikan gambar yang akan ditampilkan bila tombol
dalam keadaan berbeda. Bila tombol ditekan—yaitu, bila state_pressed="true"—aplikasi
akan menampilkan gambar bernama button_pressed. Bila tombol sedang difokus
(state_focused="true"), atau bila tombol diarahkan ke atas (state_hovered="true"),
aplikasi akan menampilkan tombol berbeda.
Sumber daya dapat digambar untuk daftar level mendefinisikan alternatif sumber daya dapat
digambar, setiap mendapat nilai numerik maksimum. Untuk memilih sumber daya dapat
digambar yang akan digunakan, panggil metode setLevel() , yang meneruskan integer yang
cocok dengan integer tingkat maksimum yang didefinisikan dalam XML. Sumber daya dengan
tingkat maksimum terendah lebih besar dari atau sama dengan integer yang diteruskan ke dalam
setLevel() akan dipilih.
Misalnya, XML berikut mendefinisikan daftar level yang menyertakan dua alternatif sumber
daya dapat digambar, status_off dan status_on:
Untuk memilih sumber daya dapat digambar status_off , panggil setLevel(0). Untuk
memilih sumber daya dapat digambar status_on , panggil setLevel(1).
Contoh penggunaan LevelListDrawable adalah ikon indikator tingkat daya baterai yang
menggunakan gambar berbeda untuk menunjukkan beragam tingkat daya baterai saat ini.
TransitionDrawable adalah sumber daya dapat digambar yang memudar bersilang di antara
dua sumber daya dapat digambar. Untuk mendefinisikan sumber daya dapat digambar untuk
transisi dalam XML, gunakan elemen <transition> . Setiap sumber daya dapat digambar
dinyatakan melalui elemen <item> di dalam elemen <transition> . Tidak lebih dari dua
elemen <item> yang didukung.
Misalnya, sumber daya dapat digambar ini memudar bersilang di antara sumber daya dapat
digambar untuk keadaan "hidup" dan "mati":
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/on" />
<item android:drawable="@drawable/off" />
</transition>
Untuk transisi maju, artinya berubah dari sumber daya dapat digambar yang pertama ke yang
kedua, panggil startTransition(). Untuk transisi ke arah lain, panggil
reverseTransition(). Setiap metode ini memerlukan argumen bertipe int, yang menyatakan
jumlah milidetik untuk transisi.
Di Android 5.0 (API level 21) dan di atasnya, Anda bisa mendefinisikan sumber daya dapat
digambar untuk vektor, yakni gambar yang didefinisikan oleh suatu jalur. Sumber daya dapat
digambar untuk vektor menskalakan tanpa kehilangan definisi. Sebagian besar sumber daya
dapat digambar untuk vektor menggunakan file SVG, yaitu file teks biasa atau file biner
kompresi yang menyertakan koordinat dua dimensi sebagai cara menggambar pada layar.
Karena file SVG adalah teks, file tersebut lebih hemat ruang daripada file gambar lainnya. Selain
itu, Anda juga hanya memerlukan satu file untuk gambar vektor sebagai ganti satu file untuk
setiap kepadatan layar, seperti kasus untuk gambar bitmap.
Untuk memasukkan gambar vektor atau ikon Desain Material yang ada ke dalam proyek Android
Studio Anda sebagai sumber daya dapat digambar untuk vektor:
Untuk membuat gambar vektor, definisikan detail bentuk di dalam elemen XML <vector> .
Misalnya, kode berikut mendefinisikan bentuk hati dan mengisinya dengan warna merah (#f00):
<vector xmlns:android="http://schemas.android.com/apk/res/android"
<!-- intrinsic size of the drawable -->
android:height="256dp"
android:width="256dp"
<!-- size of the virtual canvas -->
android:viewportWidth="32"
android:viewportHeight="32">
Jika Anda telah memiliki gambar dalam format SVG, ada sejumlah cara untuk mendapatkan
informasi pathData gambar:
Di Android Studio, klik-kanan pada folder sumber daya dapat digambar dan pilih New > Vector
Asset untuk membuka alat (bantu) Vector Asset Studio. Gunakan alat (bantu) ini untuk
mengimpor file SVG lokal.
Gunakan alat (bantu) konversi file seperti svg2android.
Buka gambar dalam editor teks, atau jika Anda menampilkan gambar di browser, tampilkan
sumber laman. Cari informasi d= , yang setara dengan pathData dalam XML Anda.
Gambar vektor dinyatakan dalam Android sebagai objek VectorDrawable. Untuk detail tentang
sintaks pathData , lihat referensi Jalur SVG. Untuk mempelajari cara menganimasikan properti
sumber daya dapat digambar untuk vektor, lihat Animasikan Sumber Daya Dapat Digambar
untuk Vektor.
Gambar
Gambar, dari ikon peluncur ke gambar spanduk, digunakan dalam banyak cara di Android.
Setiap kasus penggunaan memiliki syarat berbeda untuk resolusi, skalabilitas, dan kesederhanaan
gambar. Di bagian ini, Anda akan mempelajari beberapa macam cara untuk menghasilkan
gambar dan menyertakannya dalam aplikasi.
Membuat ikon
Setiap aplikasi memerlukan setidaknya sebuah ikon peluncur, dan seringkali aplikasi
menyertakan ikon untuk tindakan bilah aksi, notifikasi, dan kasus penggunaan lainnya.
Buat serangkaian gambar dari ikon yang sama dalam resolusi dan ukuran berbeda, sehingga ikon
tampak sama di berbagai perangkat yang memiliki kepadatan layar berbeda. Anda bisa
menggunakan Image Asset Studio untuk melakukannya.
Gunakan sumber daya dapat digambar untuk vektor, yang menskalakan secara otomatis tanpa
membuat gambar menjadi pecah atau kabur. Anda bisa menggunakan Vector Asset Studio untuk
melakukannya.
Android Studio menyertakan alat (bantu) bernama Image Asset Studio yang membantu Anda
membuat ikon aplikasi sendiri dari ikon Desain Material, gambar khusus, dan string teks. Alat ini
menghasilkan serangkaian ikon dengan resolusi yang sesuai untuk setiap kepadatan layar umum
yang didukung aplikasi Anda. Image Asset Studio menempatkan ikon yang baru dihasilkan
dalam folder kepadatan-khusus pada folder res/ dalam proyek Anda. Pada waktu proses, Android
menggunakan sumber daya yang sesuai berdasarkan kepadatan layar tempat menjalankan
aplikasi Anda.
Ikon peluncur
Bilah aksi dan ikon tab
Ikon notifikasi
Untuk menggunakan Image Asset Studio, klik-kanan pada folder res/ di Android Studio dan pilih
New > Image Asset. Wizard Configure Asset Studio akan terbuka dan memandu Anda melalui
proses ini.
Untuk informasi selengkapnya tentang Image Asset Studio, lihat panduan Image Asset Studio.
Vector Asset Studio
Mulai dengan API 21, Anda bisa menggunakan sumber daya dapat digambar untuk vektor
sebagai ganti file gambar untuk ikon.
Kelebihan menggunakan sumber daya dapat digambar untuk vektor sebagai ikon:
Sumber daya dapat digambar untuk vektor bisa mengurangi ukuran file APK secara dramatis,
karena Anda tidak perlu menyertakan banyak versi untuk setiap gambar ikon. Anda bisa
menggunakan satu gambar vektor untuk menskalakan ke semua resolusi dengan mulus.
Pengguna mungkin lebih suka mengunduh aplikasi yang memiliki file lebih kecil dan ukuran
paket lebih kecil.
Kelemahan penggunaan sumber daya dapat digambar untuk vektor sebagai ikon:
Sumber daya dapat digambar untuk vektor hanya bisa menyertakan detail dengan jumlah
terbatas. Sumber daya dapat digambar untuk vektor sebagian besar digunakan untuk ikon yang
tidak begitu detail seperti ikon Desain Material. Ikon dengan detail lebih banyak biasanya
memerlukan beberapa file gambar.
Sumber daya dapat digambar untuk vektor tidak didukung pada perangkat yang menjalankan API
level 20 ke bawah.
Untuk menggunakan sumber daya dapat digambar untuk vektor pada perangkat yang
menjalankan API level 20 ke bawah, Anda harus memutuskan antara dua metode kompatibilitas
mundur:
Secara default, pada waktu pembangunan, sistem membangun versi bitmap sumber daya dapat
digambar untuk vektor Anda dalam resolusi yang berbeda. Hal ini memungkinkan ikon berjalan
pada perangkat yang tidak bisa menggambar sumber daya dapat digambar untuk vektor.
Kelas VectorDrawableCompat dalam Pustaka Dukungan Android memungkinkan Anda
mendukung sumber daya dapat digambar untuk vektor dalam Android 2.1 (API level 7) dan yang
lebih tinggi.
Vector Asset Studio adalah alat (bantu) yang membantu Anda menambahkan ikon Desain
Material dan sumber daya dapat digambar untuk vektor ke proyek Android. Untuk
menggunakannya, klik-kanan pada folder res/ di Android Studio dan pilih New > Vector Asset.
Wizard Configure Asset Studio akan terbuka dan memandu Anda melalui proses ini.
Untuk informasi selengkapnya tentang menggunakan Vector Asset Studio dan dukungan
kompatibilitas mundur, lihat panduan Vector Asset Studio.
Gambar spanduk, gambar profil pengguna, dan gambar lainnya dalam semua bentuk dan ukuran.
Dalam banyak kasus, gambar tersebut lebih besar daripada seharusnya untuk antarmuka
pengguna (UI) aplikasi pada umumnya. Misalnya, aplikasi Galeri sistem menampilkan foto yang
diambil menggunakan kamera perangkat Android, dan foto ini umumnya memiliki resolusi yang
jauh lebih tinggi daripada kepadatan layar perangkat. Perangkat Android memiliki memori
terbatas, sehingga idealnya Anda hanya perlu memuat foto versi resolusi rendah dalam memori.
Versi resolusi rendah harus cocok dengan ukuran komponen UI yang menampilkannya. Gambar
dengan resolusi lebih tinggi tidak memberikan manfaat jelas, namun tetap memerlukan memori
yang berharga dan menambah overhead kinerja tambahan karena tambahan penskalaan sambil-
jalan.
Anda bisa memuat gambar dengan ukuran yang diubah secara manual, namun sejumlah pustaka
pihak ketiga telah dibuat untuk membantu memuat, menskalakan, dan meng-cache gambar.
Pustaka pemuatan gambar seperti Glide dan Picasso bisa menangani pengaturan ukuran,
penyimpanan ke cache, dan menampilkan gambar. Pustaka pihak ketiga ini dioptimalkan untuk
seluler, dan didokumentasikan dengan baik.
Glide mendukung pengambilan, decoding, dan penampilan video diam, gambar, dan GIF
animasi. Anda bisa menggunakan Glide untuk memuat gambar dari Web API, serta gambar yang
ada dalam file sumber daya. Glide menyertakan fitur seperti pemuatan gambar placeholder
(untuk memuat gambar yang lebih detail), animasi memudar bersilang, dan penyimpanan ke
cache secara otomatis.
1. Unduh pustaka.
2. Sertakan dependensi di aplikasi Anda dalam file app-level build.gradle, dengan mengganti
<em>n.n.n</em> dengan Glide versi terbaru: compile
'com.github.bumptech.glide:glide:<em>n.n.n</em>'
Anda bisa menggunakan Glide untuk memuat gambar ke dalam elemen UI. Contoh berikut
memuat gambar dari URL ke dalam sebuah ImageView:
Dalam cuplikan kode, this lihat konteks aplikasi. Ganti "URL" dengan URL lokasi gambar.
Secara default, gambar disimpan dalam cache lokal dan diakses dari sana bila nanti dipanggil.
Untuk informasi selengkapnya tentang Picasso, lihat dokumentasi Picasso dan tag [picasso] pada
stack overflow.
Untuk membandingkan fitur pustaka yang berbeda, telusuri di stack overflow, misalnya Glide vs.
Picasso.
Saat mengambil gambar, aplikasi bisa menggunakan banyak data. Untuk menghemat data,
pastikan permintaan Anda mulai dari sekecil mungkin. Definisikan dan simpan gambar yang
belum disesuaikan ukurannya pada sisi server, kemudian minta gambar yang sudah disesuaikan
ukurannya dengan Tampilan.
Simpan gambar Anda ke cache sehingga setiap gambar hanya perlu melewati jaringan sekali.
Bila gambar diminta, terlebih dahulu periksa cache Anda. Mintalah gambar melalui jaringan saja
jika gambar tidak ada dalam cache. Gunakan pustaka pemuatan gambar seperti Glide atau
Picasso untuk menangani caching. Pustaka ini juga mengelola ukuran cache, membuang gambar
lama atau yang tidak digunakan. Untuk informasi selengkapnya tentang pustaka, lihat bagian
pustaka pada bab ini.
Untuk memaksimalkan kinerja dalam konteks berbeda, setel aturan bersyarat untuk cara aplikasi
menangani gambar, dengan bergantung pada tipe koneksi dan stabilitas. Gunakan
ConnectivityManager untuk menentukan tipe koneksi dan status, kemudian setel aturan
bersyarat yang sesuai. Misalnya, bila pengguna sedang menggunakan koneksi data (bukan WiFi),
turunkan resolusi gambar yang diminta di bawah resolusi layar. Tingkatkan lagi resolusi layar
yang diminta saat pengguna menggunakan WiFi.
Saat aplikasi Anda mengambil gambar melalui jaringan, koneksi lambat akan membuat
pengguna menunggu. Inilah cara membuat aplikasi Anda terasa cepat, walaupun gambar dimuat
dengan lambat:
Prioritaskan gambar yang lebih penting sehingga dimuat lebih dulu. Pustaka seperti Glide dan
Picasso memungkinkan Anda meminta berdasarkan prioritas gambar.
Prioritaskan permintaan teks sebelum permintaan gambar. Jika aplikasi Anda dapat digunakan
tanpa gambar, misalnya jika berupa aplikasi umpan berita, membiarkan pengguna menggulir
gambar bisa membuat aplikasi fungsional dan bahkan mungkin merender permintaan gambar
usang.
Jika menampilkan warna placeholder, Anda mungkin ingin penampilan aplikasi tetap konsisten
di saat aplikasi memuat gambar. Gunakan pustaka Palette untuk memilih warna placeholder
berdasarkan keseimbangan warna gambar yang diminta. Pertama, sertakan pustaka Palette dalam
file build.gradle Anda.
dependencies: {
compile 'com.android.support:palette-v7:24.2.1'
}
Tarik warna dominan untuk gambar yang Anda inginkan dan setel sebagai warna latar belakang
dalam ImageView. Jika Anda mengambil gambar menggunakan pustaka, letakkan kode berikut
setelah mendefinisikan URL yang akan dimuat ke dalam ImageView:
Untuk menghemat bandwidth dan agar aplikasi tetap berjalan cepat, gunakan format WebP untuk
menyajikan dan mengirim gambar.
Cara lain untuk menghemat bandwith adalah dengan menyajikan dan meng-cache gambar
berukuran khusus. Caranya, izinkan klien menetapkan resolusi dan ukuran yang diperlukan
untuk perangkat dan Tampilan mereka, kemudian buat dan cache gambar yang diperlukan pada
sisi server sebelum Anda mengirimkannya.
Misalnya, laman landas umpan berita mungkin hanya meminta gambar kecil. Sebagai ganti
mengirim gambar berukuran penuh, kirim saja gambar kecil yang ditetapkan oleh ImageView.
Anda bisa mengurangi ukuran gambar kecil lebih jauh dengan memproduksi gambar pada
resolusi yang berbeda.
Gaya
Di Android, gaya adalah kumpulan atribut yang mendefinisikan tampilan dan format Tampilan.
Anda bisa menerapkan gaya yang sama ke sejumlah Tampilan dalam aplikasi; misalnya,
sejumlah TextView mungkin memiliki ukuran teks dan layout yang sama. Penggunaan gaya
memungkinkan Anda menyimpan atribut umum ini di satu lokasi dan menerapkannya ke setiap
TextView dengan menggunakan satu baris kode dalam XML.
Anda bisa mendefinisikan gaya sendiri atau menggunakan salah satu dari gaya platform yang
disediakan Android.
Atribut name . Gunakan nama gaya bila Anda menerapkan gaya ke Tampilan.
Atribut parent opsional. Anda akan mempelajari cara menggunakan atribut parent di bagian
Pewarisan di bawah ini.
Sejumlah elemen <item> sebagai elemen anak <style>. Setiap <item> menyertakan satu
atribut gaya.
Contoh ini membuat gaya yang memformat teks untuk menggunakan jenis huruf spasi tunggal
abu-abu muda, sehingga tampak seperti kode:
<resources>
<style name="CodeFont">
<item name="android:typeface">monospace</item>
<item name="android:textColor">#D7D6D7</item>
</style>
</resources>
<TextView
style="@style/CodeFont"
android:text="@string/code_string" />
Pewarisan
Gaya baru bisa mewarisi properti gaya yang ada. Bil Anda membuat gaya yang mewarisi
properti, cukup definisikan properti yang ingin diubah atau ditambahkan. Anda bisa mewarisi
properti dari gaya platform dan dari gaya yang dibuat sendiri. Untuk mewarisi gaya platform,
gunakan atribut parent untuk menetapkan ID sumber daya gaya yang ingin Anda warisi.
Misalnya, inilah cara mewarisi penampilan teks default platform Android (gaya
TextAppearance ) dan mengubah warnanya:
Untuk menerapkan gaya ini, gunakan @style/GreenText. Untuk mewarisi gaya yang dibuat
sendiri, gunakan nama gaya yang ingin Anda warisi sebagai bagian pertama pada nama gaya
baru, dan pisahkan bagian tersebut dengan titik:
name="StyleToInherit.Qualifier"
Misalnya, untuk membuat gaya yang mewarisi gaya CodeFont yang didefinisikan di atas,
gunakan CodeFont sebagai bagian pertama pada nama gaya baru:
<style name="CodeFont.RedLarge">
<item name="android:textColor">#FF0000</item>
<item name="android:textSize">34sp</item>
</style>
Contoh ini menyertakan atribut typeface dari gaya CodeFont asli, menggantikan atribut
textColor asal dengan merah, dan menambahkan atribut baru, textSize. Untuk menerapkan
gaya ini, gunakan @style/CodeFont.RedLarge.
Tema
Anda bisa membuat tema dengan cara yang sama dengan membuat gaya, yaitu dengan
menambahkan elemen <style> di dalam elemen <resources> dalam file XML yang terletak di
folder res/values/.
Gaya diterapkan pada Tampilan. Di XML, Anda menerapkan gaya menggunakan atribut style .
Tema diterapkan ke semua Aktivitas atau aplikasi, bukan ke Tampilan individual. Di XML, Anda
bisa menerapkan sebuah tema mengggunakan atribut android:theme .
Gaya apa pun bisa digunakan sebagai tema. Misalnya, Anda bisa menerapkan gaya CodeFont
sebagai tema Aktivitas, dan semua teks di dalam Aktivitas akan menggunakan font spasi tunggal
abu-abu.
Menerapkan tema
Untuk menerapkan tema ke aplikasi Anda, deklarasikan tema dalam elemen <application> di
dalam file AndroidManifest.xml. Contoh ini menerapkan tema AppTheme ke seluruh aplikasi:
Untuk menerapkan tema ke Aktivitas, deklarasikan tema dalam elemen <activity> dalam file
AndroidManifest.xml. Dalam contoh ini, atribut android:theme menerapkan tema platform
Theme_Dialog ke Aktivitas:
<activity android:theme="@android:style/Theme.Dialog">
Tema default
Bila membuat proyek baru di Android Studio, tema default akan didefinisikan untuk Anda dalam
file style.xml. Misalnya, kode ini mungkin ada dalam file styles.xml Anda:
Platform Android menyediakan kumpulan gaya dan tema yang bisa Anda gunakan dalam
aplikasi. Untuk menemukan daftar semua tema, Anda perlu melihat di dua tempat:
Kelas R.style mencantumkan sebagian besar gaya dan tema platform yang tersedia.
Kelas support.v7.appcompat.R.style mencantumkan lebih banyak lagi. Gaya dan tema ini
memiliki "AppCompat" dalam namanya, dan didukung oleh pustaka v7 appcompat.
Nama gaya dan tema menyertakan setrip bawah. Untuk menggunakannya dalam kode Anda,
ganti setrip bawah dengan titik. Misalnya, inilah cara menerapkan tema Theme_NoTitleBar ke
aktivitas:
<activity android:theme="@android:style/Theme.NoTitleBar"
<TextView
style="@style/AlertDialog.AppCompat"
android:text="@string/code_string" />
Dokumentasi tidak menjelaskan semua gaya dan tema secara detail, namun Anda bisa
menyimpulkan dari namanya. Misalnya, dalam Theme.AppCompat.Light.DarkActionBar
"Theme" menunjukkan bahwa gaya ini dimaksudkan untuk digunakan sebagai tema.
"AppCompat" menunjukkan bahwa tema ini didukung oleh pustaka v7 appcompat.
"Light" menunjukkan bahwa tema terdiri dari latar belakang terang, yaitu putih secara default.
Semua warna teks dalam tema ini adalah gelap, agar kontras dengan latar belakang yang terang.
(Jika menginginkan latar belakang gelap dan teks terang, tema Anda bisa mewarisi dari tema
seperti Theme.AppCompat tanpa "Light" dalam namanya.)
"DarkActionBar" menunjukkan bahwa warna gelap digunakan untuk bilah aksi, sehingga semua
teks atau ikon dalam bilah aksi berwarna terang.
Untuk mengetahui selengkapnya tentang penggunaan gaya dan tema platform, kunjungi panduan
gaya dan tema.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Panduan sumber daya sumber daya dapat digambar
Panduan Image Asset Studio
Desain Material adalah filosofi desain visual yang dibuat Google tahun 2014. Tujuan Desain
Material adalah pengalaman pengguna terpadu lintas platform dan ukuran perangkat. Desain
Material menyertakan serangkaian panduan untuk gaya, layout, gerakan, dan aspek desain
aplikasi lainnya. Panduan lengkap tersedia di Spesifikasi Desain Material.
Desain Material adalah untuk aplikasi web desktop serta aplikasi seluler. Bab ini memfokuskan
pada Desain Material untuk aplikasi seluler di Android.
Dalam Desain Material, elemen dalam aplikasi Android Anda berperilaku seperti material
sungguhan: mentransmisikan bayangan, menempati ruang, dan saling berinteraksi.
Desain Material melibatkan pilihan warna yang disengaja, citra detail, tipografi skala besar, dan
ruang putih intensional yang menghasilkan antarmuka yang menyolok dan grafik.
Beri penekanan pada tindakan pengguna dalam aplikasi Anda, sehingga pengguna langsung tahu
apa yang harus dilakukan, dan cara melakukannya. Misalnya, sorot hal-hal yang bisa berinteraksi
dengan pengguna, seperti tombol, bidang EditText, dan switch.
1. Dalam layout ini, tombol aksi mengambang disorot dengan warna aksen merah muda.
Gerakan bermakna
Buat animasi dan gerakan lain dalam aplikasi Anda menjadi bermakna, sehingga gerakan tidak
terjadi secara acak. Gunakan gerakan untuk memperkuat ide bahwa pengguna adalah penggerak
utama aplikasi. Misalnya, desain aplikasi Anda sehingga sebagian besar gerakan diinisiasi oleh
tindakan pengguna, bukan oleh kejadian di luar kontrol pengguna. Anda juga bisa menggunakan
gerakan untuk memfokuskan perhatian pengguna, memberi masukan yang halus bagi pengguna,
atau menyoroti elemen aplikasi Anda.
Bila aplikasi Anda menghadirkan suatu objek kepada pengguna, pastikan gerakannya tidak
memotong keberlangsungan pengalaman pengguna. Misalnya, pengguna seharusnya tidak perlu
menunggu animasi atau transisi selesai.
Bagian Gerakan dalam bab ini menjelaskan detail selengkapnya tentang cara menggunakan
gerakan dalam aplikasi Anda.
Warna
Palet warna Desain Material
Prinsip Desain Material menyertakan penggunaan warna menyolok. Palet warna Desain Material
berisi warna-warna yang bisa dipilih, setiap dengan warna primer dan bayangan yang diberi label
dari 50 hingga 900:
Pilih warna dengan label "500" sebagai warna primer merek Anda. Gunakan warna
tersebut dan bayangan warna itu dalam aplikasi Anda.
Pilih warna kontras sebagai warna aksen dan gunakan untuk membuat sorotan dalam
aplikasi Anda. Pilih warna apa pun yang dimulai dengan "A".
Bila membuat proyek Android dalam Android Studio, contoh skema warna Desain Material akan
dipilihkan untuk Anda dan diterapkan ke tema. Dalam values/colors.xml, tiga elemen <color>
didefinisikan, colorPrimary, colorPrimaryDark, dan colorAccent:
Dalam values/styles.xml, tiga warna yang telah didefinisikan diterapkan ke tema default, yang
menerapkan warna ke beberapa elemen aplikasi secara default:
colorPrimary digunakan oleh sejumlah Tampilan secara default. Misalnya, dalam tema
AppTheme , colorPrimary digunakan sebagai warna latar belakang untuk bilah aksi.
Ubah nilai ini ke "500" yang dipilih sebagai warna primer merek Anda.
colorPrimaryDark digunakan dalam area yang memerlukan sedikit kontras dengan
warna primer, misalnya bilah status. Setel nilai ini ke versi yang sedikit lebih gelap dari
warna primer Anda.
colorAccent digunakan sebagai warna sorotan untuk sejumlah Tampilan. Ini juga
digunakan untuk switch dalam posisi "aktif", tombol aksi mengambang, dan lainnya.
Dalam tangkapan layar di bawah ini, latar belakang bilah aksi menggunakan colorPrimary
(indigo), bilah status menggunakan colorPrimaryDark (bayangan indigo yang lebih gelap), dan
switch dalam posisi "aktif" menggunakan colorAccent (warna merah muda).
1. Dalam layout ini, switch pada posisi "hidup" disorot dengan warna aksen merah muda.
Sebagai rangkuman, inilah cara menggunakan palet warna Desain Material dalam aplikasi
Android Anda:
1. Pilih warna primer untuk aplikasi dari palet warna Desain Material dan salin nilai
heksanya ke dalam item colorPrimary dalam colors.xml.
2. Pilih tingkatan warna yang lebih gelap dari warna ini dan salin nilai heksanya ke dalam
item colorPrimaryDark .
3. Pilih warna aksen dari tingkatan warna yang dimulai dengan "A" dan salin nilai heksanya
ke dalam item colorAccent.
4. Jika Anda memerlukan lebih banyak warna, buat elemen <color> tambahan dalam file
colors.xml. Misalnya, Anda bisa memilih versi indigo yang lebih terang dan buat elemen
<color> tambahan bernama colorPrimaryLight. (Namanya terserah Anda.)
5. <color name="colorPrimaryLight">#9FA8DA</color>
6. <!-- A lighter shade of indigo. -->
Kontras
Pastikan semua teks dalam UI aplikasi Anda kontras dengan latar belakangnya. Di tempat yang
berlatar belakang gelap, berikan warna terang untuk teks di atasnya, dan sebaliknya. Kontras
semacam ini penting untuk keterbacaan dan aksesibilitas, karena tidak semua orang melihat
warna dengan cara yang sama.
Jika menggunakan tema platform seperti Theme.AppCompat, Anda yang akan menangani kontras
antara teks dan latar belakangnya. Misalnya:
Gunakan kontras warna untuk menciptakan pemisahan visual di antara elemen aplikasi Anda.
Gunakan warna colorAccent Anda untuk menarik perhatian pada elemen UI utama seperti
tombol aksi mengambang dan switch dalam posisi "aktif".
Opasitas
Aplikasi Anda bisa menampilkan teks dengan derajat opasitas berbeda untuk menyatakan
relativitas kepentingan informasi. Misalnya, teks yang kurang penting mungkin hampir
transparan (opasitas rendah).
Setel atribut android:textColor menggunakan salah satu format ini: "#rgb", "#rrggbb",
"#argb", atau "#aarrggbb". Untuk menyetel opasitas teks, gunakan format "#argb" atau
"#aarrggbb" dan sertakan nilai untuk saluran alfa. Saluran alfa adalah a atau aa pada awal nilai
textColor .
Nilai opasitas maksimum, FF dalam heksa, akan membuat warna buram sepenuhnya. Nilai
minimum, 00 dalam heksa, akan membuat warna transparan sepenuhnya.
1. Putuskan tingkat opasitas yang ingin Anda gunakan, dalam persentase. Tingkat opasitas
yang digunakan untuk teks bergantung pada apakah latar belakang Anda terang atau
gelap. Untuk mengetahui tingkat opasitas yang digunakan dalam situasi berbeda, lihat
Porsi warna teks pada panduan Desain Material.
2. Lipat gandakan persentase tersebut, sebagai nilai desimal, hingga 255. Misalnya, jika
Anda memerlukan teks utama yang 87% buram, lipat gandakan menjadi 0,87 x 255.
Hasilnya adalah 221,85.
3. Bulatkan hasil ke bilangan bulat terdekat: 222.
4. Gunakan konverter heksa untuk mengonversikan hasil menjadi heksa: DE. Jika hasilnya
nilai tunggal, awali dengan 0.
Dalam kode XML berikut, latar belakang teks adalah gelap, dan warna teks utama adalah 87%
putih (deffffff). Dua angka pertama kode warna (de) menunjukkan opasitas.
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="45dp"
android:background="@color/colorPrimaryDark"
android:textColor="#deffffff"/>
Tipografi
Jenis huruf
Roboto adalah jenis huruf Desain Material standar di Android. Roboto memiliki enam bobot:
Thin, Light, Regular, Medium, Bold, dan Black.
Gaya font
Platform Android menyediakan gaya dan ukuran font yang telah didefinisikan sebelumnya, yang
bisa Anda gunakan dalam aplikasi. Gaya dan ukuran ini dikembangkan untuk mengimbangi
kepadatan materi dan kenyamanan membaca dalam ketentuan umum. Ukuran ditetapkan dengan
sp (piksel yang bisa diskalakan) agar memungkinkan mode ketik besar untuk aksesibilitas.
Berhati-hatilah agar tidak menggunakan terlalu banyak ukuran sekaligus gaya berbeda dalam
layout Anda.
Untuk menggunakan salah satu gaya yang telah didefinisikan sebelumnya ini dalam Tampilan,
setel atribut android:textAppearance . Atribut ini mendefinisikan penampilan default teks:
warna, jenis huruf, ukuran, dan gaya. Gunakan gaya kompatibel-mundur
TextAppearance.AppCompat.
Misalnya, untuk membuat TextView muncul dalam gaya Display 3, tambahkan atribut berikut ke
TextView dalam XML:
android:textAppearance="@style/TextAppearance.AppCompat.Display3"
Untuk informasi selengkapnya mengenai penataan gaya teks, lihat Tipografi panduan Desain
Material.
Layout
Metrik dan keyline
Komponen dalam template Desain Material yang ditujukan untuk perangkat seluler, tablet, dan
desktop sejajar dengan petak kotak 8 dp. Dp adalah piksel yang tidak tergantung kepadatan, unit
abstrak berdasarkan kepadatan layar. Dp serupa dengan sp, namun sp juga diskalakan oleh
pilihan ukuran font pengguna. Itu sebabnya sp lebih disukai untuk aksesibilitas. Untuk informasi
selengkapnya tentang unit pengukuran, lihat unit Layout, Tampilan, dan Sumber Daya.
Petak kotak 8 dp memandu penempatan elemen dalam layout Anda. Setap kotak dalam petak
berukuran 8 dp x 8 dp, sehingga tinggi dan lebar tiap elemen dalam layout adalah kelipatan 8 dp.
1. Bilah status dalam layout adalah setinggi 24dp, setara ketinggian kotak tiga petak.
2. Bilah alat setinggi 56 dp, setara ketinggian kotak tujuh petak.
3. Salah satu batas materi sebelah kanan adalah 16 dp dari tepi layar, setara lebar kotak dua
persegi.
Ikonografi dalam bilah alat sejajar dengan kotak petak 4 dp sebagai ganti kotak persegi 8 dp,
sehingga dimensi ikon dalam bilah alat adalah kelipatan 4 dp.
Keyline adalah outline dalam petak layout yang menentukan penempatan teks dan ikon.
Misalnya, keyline menandai tepi margin dalam layout.
1. Keyline yang menampilkan margin kiri tepi layar, dalam hal ini adalah 16 dp.
2. Keyline yang menampilkan margin kiri materi terkait dengan ikon atau avatar, 72 dp.
3. Keyline yang menampilkan margin kanan tepi layar, 16 dp.
Tipografi Desain Material selaras dengan petak patokan 4 dp, yaitu petak yang terbuat dari garis-
garis horizontal saja.
Panduan Desain Material menyediakan template yang bisa diunduh untuk layar UI yang umum
digunakan. Untuk mengetahui selengkapnya tentang metrik dan keyline dalam Desain Material,
kunjungi panduan metrik dan keyline.
Gunakan Desain Material komponen untuk panduan spesifikasi dan perilaku tombol, chip, kartu,
dan banyak lagi elemen UI lainnya. Gunakan pola Desain Material untuk panduan cara
memformat tanggal dan waktu, isyarat, panel samping navigasi, dan banyak lagi aspek UI
lainnya.
Bagian ini mengajarkan tentang Pustaka Dukungan Desain dan beberapa komponen serta pola
yang tersedia untuk Anda. Untuk dokumentasi lengkap tentang komponen dan pola yang bisa
Anda gunakan, lihat panduan Desain Material
Paket Desain menyediakan API untuk mendukung penambahan komponen Desain Material dan
pola ke aplikasi Anda. Pustaka Dukungan Desain menambahkan dukungan untuk beragam
komponen dan pola Desain Material yang akan Anda bangun. Untuk menggunakan pustaka,
sertakan dependensi berikut dalam file build.gradle Anda:
compile 'com.android.support:design:25.0.1'
Untuk memastikan Anda memiliki nomor versi terbaru Pustaka Dukungan Desain, periksa laman
Pustaka Dukungan.
Gunakan tombol aksi mengambang (FAB) bagi tindakan yang ingin Anda sarankan untuk dipakai
pengguna. FAB adalah ikon lingkaran yang mengambang "di atas" UI. Saat difokus, warnanya
sedikit berubah, dan tampak terangkat bila dipilih. Saat diketuk, FAB bisa berisi tindakan terkait.
<android.support.design.widget.FloatingActionButton
android:id="@+id/addNewItemFAB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_plus_sign"
app:fabSize="normal"
app:elevation="10%" />
Atribut fabSize menyetel ukuran FAB. Ukurannya bisa "normal" (56 dp), "mini" (40 dp), atau
"auto", dengan perubahan yang berdasarkan ukuran jendela.
Elevasi FAB adalah jarak antara permukaan dan kedalaman bayangannya. Anda bisa menyetel
atribut elevation sebagai referensi ke sumber daya, string, Boolean, atau sejumlah cara lainnya.
Untuk mengetahui tentang semua atribut yang bisa Anda setel untuk FAB termasuk clickable,
rippleColor, dan backgroundTint, lihat FloatingActionButton. Untuk memastikan Anda
menggunakan FAB sebagaimana dimaksud, periksa informasi penggunaan dalam panduan
Desain Material yang ekstensif.
Panel samping navigasi
Panel samping navigasi adalah panel yang bergeser masuk dari kiri dan berisi tujuan navigasi
untuk aplikasi Anda. Panel samping navigasi membentang setinggi layar, dan semua di
belakangnya terlihat, namun gelap.
Untuk mengimplementasikan panel samping navigasi, gunakan DrawerLayout API yang tersedia
dalam Pustaka Dukungan.
Dalam XML Anda, gunakan objek DrawerLayout sebagai tampilan akar layout. Di dalamnya,
tambahkan dua tampilan, satu untuk layout utama saat panel samping disembunyikan, dan satu
untuk materi panel samping.
Misalnya, layout berikut memiliki dua tampilan anak: FrameLayout yang berisi materi utama
(diisi oleh Fragmen pada waktu proses), dan ListView untuk panel samping navigasi.
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
Untuk informasi selengkapnya, lihat Membuat Panel Samping Navigasi dan informasi
penggunaan dalam panduan Desain Material.
Snackbar
Snackbar menyediakan masukan singkat tentang suatu operasi melalui pesan dalam bilah
horizontal di layar. Snackbar berisi baris teks tunggal yang secara langsung terkait dengan
operasi yang dilaksanakan. Snackbar bisa berisi aksi teks, namun tidak ada ikon.
1. Snackbar
Snackbar secara otomatis hilang setelah waktu tunggu atau setelah interaksi pengguna di tempat
lain pada layar. Anda bisa mengaitkan snackbar dengan berbagai tampilan (setiap objek yang
diturunkan dari kelas View). Akan tetapi, jika Anda mengaitkan snackbar dengan
CoordinatorLayout, snackbar akan mendapatkan fitur tambahan:
Snackbar.make(findViewById(R.id.myCoordinatorLayout), R.string.email_sent,
Snackbar.LENGTH_SHORT).show;
Untuk informasi selengkapnya, lihat referensi Membangun dan Menampilkan Pesan Munculan
dan Snackbar. Untuk memastikan Anda menggunakan snackbar sebagaimana dimaksud, lihat
informasi penggunaan snackbar dalam panduan Desain Material.
Tip: Toast serupa dengan snackbar, namun toast biasanya digunakan untuk perpesanan sistem,
dan toast tidak bisa digesek keluar dari layar.
Tab
Gunakan tab untuk mengatur materi tingkat tinggi. Misalnya, pengguna dapat menggunakan tab
untuk beralih antara Tampilan, rangkatan data, atau aspek fungsional aplikasi. Sajikan tab
sebagai baris tunggal di atas materi terkait. Buat label tab yang pendek dan informatif.
Anda bisa menggunakan tab dengan tampilan gesek yang bisa digunakan pengguna untuk beralih
di antara tab dengan isyarat jari horizontal (paging horizontal). Jika tab Anda menggunakan
tampilan gesek, jangan sandingkan tab dengan materi yang juga mendukung gesekan.
Untuk informasi mengenai implementasi tab, lihat Membuat Tampilan Gesek dengan Tab. Untuk
memastikan Anda menggunakan tab sebagaimana dimaksud, lihat informasi penggunaan tab
dalam panduan Desain Material.
Kartu
Kartu adalah sheet material yang berfungsi sebagai titik masuk informasi yang lebih detail.
Setiap kartu mencakup satu subjek saja. Sebuah kartu bisa berisi foto, teks, dan tautan. Kartu
bisa menampilkan materi berisi elemen dengan ukuran bervariasi, seperti foto dengan panjang
teks yang berbeda.
compile 'com.android.support:cardview-v7:24.2.1'
Daftar
Daftar adalah kolom baris bersambung tunggal yang sama lebarnya. Setiap baris berfungsi
sebagai kontainer petak. Petak berisi materi, dan tingginya bisa bervariasi dalam daftar.
Untuk membuat daftar, gunakan widget RecyclerView. Sertakan dependensi berikut dalam file
build.gradle.
compile 'com.android.support:recyclerview-v7:24.2.1'
Untuk informasi selengkapnya mengenai pembuatan daftar di Android, lihat panduan daftar
kreatif.
Gerakan
Gerakan dalam dunia Desain Material digunakan untuk menjelaskan hubungan spasial,
fungsionalitas, dan intensi dengan keindahan dan fluiditas. Gerakan menampilkan cara aplikasi
Anda diatur dan apa yang bisa dilakukannya.
1. Responsif. Gerakan dengan cepat merespons masukan pengguna secara tepat saat
pengguna memicunya.
2. Alami. Gerakan diilhami oleh kekuatan dalam dunia nyata. Misalnya, gaya sungguhan
seperti gravitasi mengilhami gerakan elemen sepanjang busur, bukan dalam garis lurus.
3. Sadar. Material menyadari keadaan sekitarnya, termasuk pengguna dan material lain di
sekitarnya. Objek bisa tertarik pada objek lain dalam UI, dan merespons sesuai dengan
maksud pengguna. Saat elemen bertransisi ke dalam tampilan, gerakannya
dikoreografikan sedemikian rupa untuk mendefinisikan hubungannya.
4. Intensional. Gerakan memandu fokus pengguna ke tempat yang tepat pada saat yang
tepat. Gerakan bisa mengomunikasikan sinyal berbeda, misalnya apakah suatu aksi tidak
tersedia.
Animasi
Ada tiga cara untuk membuat animasi dalam aplikasi Anda:
Animasi properti mengubah properti objek dalam periode waktu yang ditetapkan. Sistem
animasi properti dikenalkan dalam Android 3.0 (API level 11). Animasi properti lebih
fleksibel daripada animasi tampilan, dan menawarkan lebih banyak fitur.
Animasi tampilan memperhitungkan titik mulai penggunaan animasi, titik akhir, rotasi,
dan aspek animasi lainnya. Sistem animasi tampilan Android lebih tua dari pada sistem
animasi properti dan hanya bisa digunakan untuk Tampilan. Sistem ini relatif mudah
dipersiapkan dan menawarkan cukup kemampuan untuk banyak kasus penggunaan.
Animasi dapat digambar memungkinkan Anda memuat serangkaian sumber daya dapat
digambar berturut-turut untuk membuat animasi. Animasi dapat digambar berguna jika
Anda ingin menganimasikan sesuatu yang lebih mudah dinyatakan dengan sumber daya
dapat digambar, seperti kemajuan gambar bitmap.
Untuk detail lengkap tentang tiga tipe animasi ini, lihat Ringkasan Animasi dan Grafik.
Tema Desain Material menyediakan beberapa animasi default untuk masukan sentuh dan
aktivitas. API animasi memungkinkan Anda membuat animasi khusus untuk masukan sentuh
dalam kontrol UI, perubahan keadaan tampilan, dan transisi aktivitas.
Masukan sentuh
Masukan sentuh menyediakan konfirmasi instan pada titik kontak saat pengguna berinteraksi
dengan elemen UI. Animasi masukan sentuh default untuk tombol menggunakan kelas
RippleDrawable, yang bertransisi di antara berbagai keadaan dengan efek riak.
Dalam contoh ini, riak tinta meluas dari titik sentuhan untuk mengonfirmasi masukan pengguna.
Kartu "mengangkat" dan mentransmisikan bayangan untuk menunjukkan keadaan aktif:
Di sebagian besar kasus, Anda harus menerapkan fungsionalitas riak dalam XML tampilan
dengan menetapkan latar belakang tampilan seperti berikut:
Atau, Anda bisa mendefinisikan RippleDrawable sebagai sumber daya XML dengan
menggunakan elemen <ripple> .
Anda bisa menetapkan warna ke objek-objek RippleDrawable. Untuk mengubah warna default
masukan sentuh, gunakan atribut tema android:colorControlHighlight .
Singkap melingkar
// create the animator for this view (the start radius is zero)
Animator anim =
ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
Transisi aktivitas
Transisi aktivitas adalah animasi yang menyediakan koneksi visual di antara berbagai keadaan
UI Anda. Anda bisa menetapkan animasi khusus untuk masuk dan keluar transisi, dan untuk
transisi elemen bersama di antara aktivitas.
Transisi masuk menentukan cara tampilan dalam aktivitas masuk suatu adegan. Misalnya
dalam transisi letupan masuk, tampilan memasuki adegan dari luar dan melayang ke arah
pusat layar.
Transisi keluar menentukan cara tampilan dalam aktivitas keluar dari adegan tersebut.
Misalnya dalam transisi letupan keluar, tampilan keluar dari adegan dengan bergerak
menjauhi pusat layar.
Transisi elemen bersama menentukan penggunaan bersama suatu tampilan oleh dua
transisi aktivitas di antara aktivitas-aktivitas ini. Misalnya, jika dua aktivitas memiliki
gambar yang sama dalam berbagai posisi dan ukuran, transisi elemen
changeImageTransform bersama akan menerjemahkan dan menskalakan gambar dengan
halus di antara aktivitas ini.
Untuk menggunakan transisi ini, setel atribut transisi dalam elemen <style> di XML Anda.
Contoh berikut membuat tema bernama BaseAppTheme yang mewarisi salah satu tema Desain
Material. Tema BaseAppTheme menggunakan ketiga tipe transisi aktivitas:
Untuk mengaktifkan transisi materi jendela dalam kode Java Anda, panggil metode
Window.requestFeature():
// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Window.setEnterTransition()
Window.setExitTransition()
Window.setSharedElementEnterTransition()
Window.setSharedElementExitTransition()
Untuk detail tentang metode ini, lihat dokumentasi referensi Jendela.
Untuk informasi selengkapnya tentang implementasi transisi dalam aplikasi Anda, lihat panduan
transisi aktivitas.
Gerakan melengkung
Dalam Android 5.0 (API level 21) ke atas, Anda bisa mendefinisikan kurva pengaturan waktu
khusus dan pola gerakan melengkung untuk animasi. Caranya, gunakan kelas
PathInterpolator, yang menginterpolasikan jalur objek berdasarkan kurva Bézier atau objek
Path. Interpolator menetapkan kurva gerakan dalam bujur sangkar 1x1, dengan titik-titik jangkar
di (0,0) dan (1,1) dan titik-titik kontrol yang Anda tetapkan menggunakan argumen konstruktor.
Anda juga bisa mendefinisikan interpolator jalur sebagai sumber daya XML:
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.4"
android:controlY1="0"
android:controlX2="1"
android:controlY2="1"/>
Sistem menyediakan sumber daya XML untuk tiga kurva dasar dalam spesifikasi desain
material:
@interpolator/fast_out_linear_in.xml
@interpolator/fast_out_slow_in.xml
@interpolator/linear_out_slow_in.xml
Kelas ObjectAnimator memiliki konstruktor yang bisa Anda gunakan untuk menganimasikan
koordinat sepanjang jalur menggunakan dua atau beberapa properti sekaligus. Misalnya, kode
Java berikut menggunakan sebuah objek Path untuk menganimasikan properti X dan Y suatu
tampilan:
ObjectAnimator mAnimator;
mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
...
mAnimator.start();
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Desain Material untuk Android
Desain Material untuk Developer
Layout adaptif adalah layout yang bekerja dengan baik pada berbagai orientasi dan ukuran layar,
berbagai perangkat, berbagai lokal dan bahasa, serta sebagai versi Android.
Dalam bab ini Anda akan mempelajari cara membuat layout adaptif dengan mengeksternalkan
dan mengelompokkan sumber daya, menyediakan sumber daya alternatif, dan menyediakan
sumber daya default dalam aplikasi.
Selalu eksternalkan sumber daya seperti sumber daya dapat digambar, ikon, layout, dan string.
Inilah alasan mengapa hal itu penting:
Anda bisa memelihara sumber daya yang dieksternalkan secara terpisah dari kode
lainnya. Jika sumber daya digunakan di sejumlah tempat dalam kode dan perlu diubah,
Anda hanya perlu mengubahnya di satu tempat.
Anda bisa menyediakan sumber daya alternatif yang mendukung konfigurasi perangkat
tertentu, misalnya perangkat dengan berbagai bahasa atau ukuran layar. Hal ini menjadi
semakin penting karena semakin banyak perangkat berbasis Android yang tersedia.
Misalnya, tangkapan layar berikut menampilkan hierarki file untuk proyek kecil, sebagaimana
terlihat dalam tampilan Project "Android" di Android Studio. Folder yang berisi sumber daya
default proyek ini menggunakan nama standar: drawable, layout, menu, mipmap (untuk ikon),
dan values.
Tabel 1 mencantumkan nama folder sumber daya standar. Tipe dijelaskan lebih lengkap dalam
panduan Menyediakan Sumber Daya.
Lihat Sumber Daya String, Sumber Daya Gaya, dan Tipe Sumber Daya Lainnya.
File XML arbitrer yang bisa dibaca pada waktu proses dengan memanggil
xml/ Resources.getXml(). Berbagai file konfigurasi XML, seperti konfigurasi yang dapat
ditelusuri, harus disimpan di sini, bersama setelan preferensi.
Jika tidak ada sumber daya yang tersedia untuk konfigurasi perangkat tertentu, Android
menggunakan sumber daya default yang Anda sertakan dalam aplikasi—sumber daya dapat
digambar default, yang terdapat dalam folder res/drawable/, string teks default, yang ada dalam
file res/values/strings.xml, dan seterusnya.
Seperti sumber daya default, sumber daya alternatif disimpan dalam folder dalam res/. Folder
sumber daya alternatif menggunakan konvensi penamaan berikut:
<resource_name>-<config_qualifier>
<resource_name> adalah nama folder untuk tipe sumber daya ini, seperti yang
ditampilkan dalam Tabel 1. Misalnya, "drawable" atau "values".
<config_qualifier> menetapkan konfigurasi perangkat yang menggunakan sumber
daya ini. Qualifier yang memungkinkan ditampilkan dalam Tabel 2.
Untuk menambahkan beberapa qualifier ke satu nama folder, pisahkan qualifier dengan
tanda hubung. Jika menggunakan qualifier untuk folder sumber daya, Anda harus
mencantumkannya agar qualifier tersebut dicantumkan dalam Tabel 2.
Sumber daya string yang dilokalkan ke bahasa Jepang akan ada dalam file res/values-
ja/strings.xml. Sumber daya string default (sumber daya yang akan digunakan bila
sumber daya khusus bahasa tidak ditemukan) akan ada dalam
res/values/strings.xml. Perhatikan, file XML memiliki nama identik, dalam hal ini
"strings.xml".
Sumber daya gaya untuk API level 21 dan yang lebih tinggi akan ada dalam file
res/values-v21/styles.xml . Sumber daya gaya default akan ada dalam
res/values/styles.xml.
Sumber daya layout untuk layout kanan ke kiri yang berjalan dalam mode "malam" akan
ada dalam folder res/layout-ldrtl-night/ .
Dalam tampilan "Android" di Android Studio, qualifier tidak ditambahkan ke akhir folder.
Sebagai gantinya, qualifier akan ditampilkan berupa label di sisi kanan file dalam tanda kurung.
Misalnya, dalam tampilan "Android" di bawah ini, folder res/values/dimens.xml/
menampilkan dua file:
Dalam tampilan "Project" di Android Studio, informasi yang sama disajikan secara berbeda,
seperti yang ditampilkan dalam tangkapan layar di bawah ini.
1. Dalam tampilan "Project" di Android Studio, sumber daya default untuk dimensi
ditampilkan dalam folder res/values .
2. Sumber daya alternatif untuk dimensi ditampilkan dalam folder res/values-
<qualifier> .
Qualifier ini dijelaskan secara detail dalam Menyediakan Sumber Daya Alternatif.
notnight
Nilai-nilai yang memungkinkan:
1. Memilih tampilan "Android" di Android Studio. Jika Anda tidak melihat opsi ini,
pastikan jendela alat (bantu) Project terlihat dengan memilih View > Tool Windows >
Project.
Untuk menggunakan Android Studio dalam membuat folder sumber daya alternatif khusus
konfigurasi yang baru dalam res/:
Jika Anda tidak bisa melihat folder baru di jendela alat (bantu) Project di Android Studio,
beralihlah ke tampilan "Project", seperti yang ditampilkan dalam tangkapan layar di bawah ini.
Jika Anda tidak melihat opsi ini, pastikan jendela alat (bantu) Project terlihat dengan memilih
Simpan sumber daya alternatif dalam folder baru File sumber daya alternatif harus diberi nama
yang sama persis dengan file sumber daya default, misalnya "styles.xml" atau "dimens.xml".
Untuk dokumentasi lengkap tentang sumber daya alternatif, lihat Menyediakan Sumber Daya
Alternatif.
Orientasi layar
port: Perangkat dalam mode potret (vertikal). Misalnya, res/layout-port/ akan berisi
file layout untuk digunakan saat perangkat dalam mode potret.
land: Perangkat dalam mode lanskap (horizontal). Misalnya, res/layout-land/ akan
berisi file layout untuk digunakan saat perangkat dalam mode lanskap.
Jika pengguna memutar layar saat aplikasi berjalan, dan sumber daya alternatif tersedia, Android
akan secara otomatis memuat ulang aplikasi Anda dengan sumber daya alternatif yang cocok
dengan konfigurasi perangkat baru. Untuk informasi tentang mengontrol cara aplikasi Anda
berperilaku selama perubahan konfigurasi, lihat Menangani Perubahan Waktu Proses.
Untuk membuat varian file XML layout Anda untuk orientasi lanskap dan tampilan yang lebih
besar, gunakan editor layout. Untuk menggunakan editor layout:
Layout untuk orientasi lanskap yang berbeda akan muncul, dan file XML baru akan dibuatkan
untuk Anda. Misalnya, Anda memiliki file bernama "activity_main.xml (land)" beserta file
"activity_main.xml" asal. Anda bisa menggunakan editor untuk mengubah layout baru tanpa
mengubah layout asal.
Lebar terkecil
Qualifier lebar terkecil menetapkan lebar minimum perangkat. Ini adalah tinggi dan lebar layar
terpendek yang tersedia, "lebar terkecil" untuk layar. Lebar terkecil adalah karakteristik
perangkat yang memiliki ukuran layar tetap, dan tidak berubah saat orientasi layar berubah.
Tetapkan lebar terkecil dalam unit dp, menggunakan format berikut ini:
sw<N>dp
dalam hal ini: <N> adalah lebar minimum. Misalnya, sumber daya dalam suatu file bernama
res/values-sw320dp/styles.xml digunakan jika lebar layar perangkat selalu setidaknya 320
dp.
Anda bisa menggunakan qualifier ini untuk memastikan layout tertentu tidak akan digunakan
kecuali jika lebar yang tersedia setidaknya <N> dps, bagaimanapun orientasi layar saat ini.
Bila aplikasi Anda menyediakan beberapa folder sumber daya dengan nilai berbeda untuk
qualifier lebar terkecil, sistem akan menggunakan nilai terdekat dengan (tanpa melebihi) lebar
terkecil perangkat.
Contoh:
Versi platform
Qualifier versi platform menetapkan API level minimum yang didukung oleh perangkat.
Misalnya, gunakan v11 untuk API level 11 (perangkat dengan Android 3.0 atau yang lebih
tinggi). Lihat dokumen Android API level untuk informasi selengkapnya tentang nilai ini.
Gunakan qualifier versi platform bila Anda menggunakan sumber daya untuk fungsionalitas
yang tidak tersedia dalam versi Android sebelumnya.
Misalnya, gambar WebP memerlukan API level 14 (Android 4.0) atau yang lebih tinggi, dan
untuk dukungan penuh diperlukan API level 17 (Android 4.2) atau yang lebih tinggi. Jika Anda
menggunakan gambar WebP:
Letakkan versi default gambar dalam folder res/drawable . Gambar ini harus
menggunakan format gambar yang didukung untuk semua API level, misalnya PNG.
Letakkan versi gambar WebP dalam folder res/drawable-v17 . Jika perangkat
menggunakan API Level 17 atau yang lebih tinggi, Android akan memilih sumber daya
ini pada waktu proses.
Pelokalan
Qualifier pelokalan menetapkan bahasa, dan region yang bersifat opsional. Qualifier ini adalah
dua huruf kode bahasa ISO 639-1, bisa diikuti oleh dua huruf kode region ISO 3166-1-alpha-2
(diawali oleh huruf kecil r).
Anda bisa menetapkan bahasa saja, namun tidak boleh region saja. Contoh:
res/values-fr-rFR/strings.xml
String dalam file ini digunakan pada perangkat yang dikonfigurasi untuk bahasa Prancis
dan regionnya juga disetel ke France.
res/mipmap-fr-rCA/
Ikon dalam folder ini digunakan pada perangkat yang dikonfigurasi untuk bahasa Prancis
dan regionnya disetel ke Canada.
res/layout-ja/content_main.xml
Layout ini digunakan pada perangkat yang dikonfigurasi untuk bahasa Jepang.
Jika pengguna mengubah bahasa atau region dalam setelan sistem perangkat saat aplikasi
berjalan, dan jika sumber daya alternatif tersedia, Android akan secara otomatis memuat ulang
aplikasi Anda dengan sumber daya alternatif yang cocok dengan konfigurasi perangkat baru.
Untuk informasi tentang mengontrol cara aplikasi Anda berperilaku selama perubahan
konfigurasi, lihat Menangani Perubahan Waktu Proses.
Untuk panduan lengkap tentang pelokalan, lihat Melokalkan dengan Sumber Daya.
Sumber daya default memiliki nama folder sumber daya standar (values, misalnya) tanpa
qualifier dalam nama folder atau dalam tanda kurung setelah nama file.
Kadang-kadang versi Android baru menambahkan qualifier konfigurasi yang tidak didukung
versi lama. Jika Anda menggunakan qualifier sumber daya baru dan mempertahankan
kompatibilitas kode dengan versi Android lama, maka saat versi Android lama menjalankan
aplikasi, aplikasi akan mogok kecuali jika sumber daya default tersedia. Hal ini karena versi
Android lama tidak bisa menggunakan sumber daya alternatif yang diberi nama dengan qualifier
baru.
Misalnya, anggaplah minSdkVersion Anda disetel ke 4 dan tetapkan semua sumber daya dapat
digambar menggunakan mode malam, yang berarti bahwa Anda meletakkan sumber daya dapat
digambar dalam res/drawable-night/ dan res/drawable-notnight/. Dalam contoh ini:
Bila perangkat API level 4 perangkat menjalankan aplikasi, perangkat tidak bisa
mengakses sumber daya dapat digambar. Versi Android tidak mengetahui tentang night
dan notnight, karena qualifier ini tidak ditambahkan hingga API level 8. Aplikasi
mogok, karena tidak menyertakan sumber daya default apa pun untuk digunakan.
Dalam contoh ini, Anda mungkin ingin notnight menjadi kasus default Anda. Untuk
menyelesaikan masalah, keluarkan qualifier notnight dan masukkan sumber daya dapat
digambar Anda dalam res/drawable/ dan res/drawable-night/. Dengan solusi ini:
Bila perangkat API level 4 menjalankan aplikasi, aplikasi akan menggunakan sumber
daya dalam folder res/drawable/ default.
Bila perangkat pada API level 8 atau yang lebih tinggi menggunakan aplikasi, aplikasi
akan menggunakan sumber daya dalam folder res/drawable-night/ kapan pun
perangkat dalam mode malam. Pada saat lainnya, perangkat akan menggunakan sumber
daya (notnight) default.
Untuk menyediakan kompatibilitas perangkat terbaik, sediakan sumber daya default untuk setiap
sumber daya yang diperlukan aplikasi Anda. Setelah sumber daya default Anda berada di
tempatnya, buat sumber daya alternatif untuk konfigurasi perangkat khusus dengan
menggunakan qualifier konfigurasi perangkat khusus seperti yang ditampilkan dalam Tabel 2.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Menyediakan Sumber Daya
Ringkasan Sumber Daya
Melokalkan dengan Sumber Daya
Praktik terkait
Ketahui selengkapnya
Catatan: Kami sangat menyarankan Anda menggunakan Android Studio untuk membangun aplikasi
pengujian, karena menyediakan persiapan proyek, penyertaan pustaka, dan kemudahan pengemasan.
Anda bisa menjalankan pengujian UI pada berbagai perangkat Android fisik maupun virtual, kemudian
menganalisis hasilnya serta membuat perubahan kode tanpa meninggalkan lingkungan development.
UI berisi tampilan dengan elemen grafik seperti tombol, menu, dan bidang teks, masing-masing
dengan serangkaian properti. Untuk menguji UI dengan benar, Anda perlu:
Sediakan masukan ke semua tampilan UI. Gunakan kesempatan ini untuk menguji masukan yang
tidak benar, seperti teks saat yang diharapkan adalah angka.
Periksa keluaran dan representasi data UI—seperti string dan integer—untuk melihat apakah
konsisten dengan yang Anda harapkan.
Selain fungsionalitas, pengujian UI mengevaluasi elemen desain seperti layout, warna, font,
ukuran font, label, kotak teks, format teks, keterangan, tombol, daftar, ikon, tautan, dan materi.
Pengujian Manual
Sebagai developer aplikasi, Anda mungkin menguji setiap komponen UI secara manual saat
menambahkan komponen ke UI aplikasi. Seiring berjalannya development, satu pendekatan
terhadap pengujian UI adalah meminta seorang penguji melakukan serangkaian operasi
pengguna pada aplikasi target dan memverifikasi apakah aplikasi itu berperilaku dengan benar.
Akan tetapi, pendekatan manual ini bisa menghabiskan waktu, membosankan, dan rawan
kesalahan. Dengan menguji UI aplikasi kompleks secara manual, Anda tidak mungkin bisa
mencakup semua permutasi interaksi pengguna. Anda juga harus melakukan pengujian berulang
ini secara manual pada berbagai konfigurasi perangkat dalam emulator, dan pada berbagai
perangkat berbeda. Singkatnya, masalah inheren pada pengujian manual dibagi menjadi dua
kategori:
Ukuran domain: UI memiliki banyak operasi yang memerlukan pengujian. Bahkan aplikasi yang
relatif kecil bisa memiliki ratusan kemungkinan operasi UI. Selama siklus development, UI bisa
berubah secara signifikan, meskipun aplikasi dasarnya tidak berubah. Pengujian manual dengan
petunjuk untuk mengikuti jalur tertentu melalui UI bisa gagal sewaktu-waktu, karena tombol,
item menu, atau dialog bisa mengubah lokasi atau penampilan.
Urutan: Beberapa fungsionalitas aplikasi hanya bisa tercapai dengan urutan kejadian UI.
Misalnya, untuk menambahkan gambar pada pesan yang akan dikirim, pengguna mungkin harus
mengetuk tombol kamera dan menggunakan kamera untuk mengambil gambar, atau tombol
foto untuk memilih gambar yang sudah ada, kemudian menghubungkan gambar tersebut
dengan pesan—biasanya dengan mengetuk tombol bagikan atau kirim. Bertambahnya jumlah
kemungkinan operasi juga menambah masalah pengurutan.
Pengujian otomatis
Saat mengotomatiskan pengujian interaksi pengguna, Anda membebaskan diri dan sumber daya
untuk pekerjaan lainnya. Untuk menghasilkan serangkaian kasus pengujian, desainer pengujian
berupaya mencakup semua fungsionalitas sistem dan menguji keseluruhan UI. Melakukan semua
interaksi UI secara otomatis memudahkan dalam menjalankan pengujian untuk berbagai keadaan
perangkat (seperti orientasi) dan berbagai konfigurasi.
Untuk menguji aplikasi Android, umumnya Anda harus membuat tipe pengujian UI otomatis ini:
Pengujian UI yang bekerja dalam satu aplikasi: Memverifikasi apakah aplikasi berperilaku seperti
yang diharapkan bila pengguna melakukan aksi tertentu atau memasukkan masukan tertentu.
Pengujian ini memungkinkan Anda memeriksa apakah aplikasi mengembalikan keluaran UI yang
benar sebagai respons terhadap interaksi pengguna dalam aktivitas aplikasi. Kerangka kerja
pengujian UI seperti Espresso yang memungkinkan Anda melakukan simulasi tindakan pengguna
lewat program dan menguji interaksi pengguna dalam-aplikasi yang kompleks.
Pengujian UI yang mencakup beberapa aplikasi: Memverifikasi perilaku interaksi yang tepat di
antara beberapa aplikasi pengguna atau antara aplikasi pengguna dan aplikasi sistem. Misalnya,
Anda bisa menguji suatu aplikasi yang meluncurkan aplikasi Maps untuk menampilkan arah, atau
meluncurkan picker kontak Android untuk memilih penerima pesan. Kerangka kerja pengujian UI
yang mendukung interaksi lintas-aplikasi, seperti UI Automator, memungkinkan Anda membuat
pengujian untuk skenario berdasarkan pengguna.
Kerangka kerja pengujian Espresso dalam Android Testing Support Library menyediakan API
untuk menulis pengujian UI guna menyimulasikan interaksi pengguna dalam satu aplikasi.
Pengujian Espresso berjalan pada perangkat sesungguhnya atau emulator dan berperilaku seolah-
olah pengguna sesungguhnya sedang menggunakan aplikasi.
Anda bisa menggunakan Espresso untuk membuat pengujian UI guna memverifikasi hal-hal
berikut secara otomatis:
Aplikasi mengembalikan keluaran UI yang tepat sebagai respons terhadap urutan tindakan
pengguna pada suatu perangkat.
Navigasi dan kontrol masukan aplikasi menampilkan aktivitas, tampilan, dan bidang yang tepat.
Aplikasi akan merespons secara tepat dengan dependensi tiruan, seperti data dari server luar,
atau bisa bekerja dengan metode backend yang dimatikan untuk menyimulasikan interaksi
sungguhan dengan komponen backend yang bisa diprogram untuk menjawab dengan
serangkaian respons yang telah didefinisikan.
Manfaat utama menggunakan Espresso adalah akses ke informasi instrumentasi, seperti konteks
aplikasi, sehingga Anda bisa memantau semua interaksi sistem yang dimiliki sistem Android
pada aplikasi. Manfaat utama lainnya adalah secara otomatis menyinkronkan tindakan pengujian
dengan UI aplikasi. Espresso mendeteksi kapan thread utama tidak digunakan, sehingga bisa
menjalankan pengujian Anda pada waktu yang tepat, yang akan memperbaiki keandalan
pengujian Anda. Kemampuan ini juga membebaskan Anda dari keharusan menambahkan solusi
pengaturan waktu, seperti masa tidur, dalam kode pengujian.
UI Automator API memungkinkan Anda berinteraksi dengan elemen yang terlihat pada
perangkat. Pengujian Anda bisa mencari komponen UI dengan menggunakan deskriptor seperti
teks yang ditampilkan dalam komponen itu atau keterangan materinya. Alat (bantu) penampil
menyediakan antarmuka visual untuk memeriksa hierarki layout dan menampilkan properti
komponen UI yang tampak di latar depan perangkat.
Seperti Espresso, UI Automator memiliki akses ke informasi interaksi sistem sehingga Anda bisa
memantau semua interaksi yang dimiliki sistem Android dengan aplikasi.
Pengujian Anda bisa mengirim Maksud atau meluncurkan Aktivitas (tanpa menggunakan
perintah shell) dengan mendapatkan objek Context melalui getContext().
Anda bisa menyimulasikan interaksi pengguna pada sekumpulan item, seperti lagu dalam album
musik atau daftar email dalam inbox.
Anda bisa menggunakan metode JUnit Assert untuk menguji apakah komponen UI dalam aplikasi
mengembalikan hasil yang diharapkan.
Instrumentasi Android adalah serangkaian metode kontrol, atau kait, dalam sistem Android, yang
mengontrol komponen Android dan cara sistem Android memuat aplikasi.
Biasnaya, sistem menjalankan semua komponen aplikasi dalam proses yang sama. Anda bisa
mengizinkan beberapa komponen, seperti penyedia materi, untuk berjalan dalam proses terpisah,
namun biasanya tidak bisa memaksa aplikasi ke proses yang sama dengan aplikasi yang berjalan
lainnya.
Akan tetapi, pengujian instrumentasi bisa memuat paket pengujian sekaligus aplikasi ke dalam
proses yang sama. Karena komponen aplikasi dan pengujiannya dalam proses yang sama,
pengujian Anda bisa memanggil metode dalam komponen, dan memodifikasi serta memeriksa
bidang dalam komponen.
Instrumentasi memungkinkan Anda memantau semua interaksi yang dimiliki sistem Android
pada aplikasi, dan memungkinkan pengujian memanggil metode dalam aplikasi, dan
memodifikasi serta memeriksa bidang dalam aplikasi, tanpa bergantung pada daur hidup normal
aplikasi.
Biasanya, komponen Android berjalan dalam daur hidup yang ditentukan sistem. Misalnya, daur
hidup objek Activity dimulai bila sebuah Maksud mengaktifkan Aktivitas. Sistem akan
memanggil metode onCreate() objek, kemudian metode onResume(). Bila pengguna memulai
aplikasi lain, sistem akan memanggil metode onPause(). Jika kode Aktivitas memanggil metode
finish(), sistem akan memanggil metode onDestroy().
Android Framework API tidak menyediakan cara yang bisa digunakan kode aplikasi untuk
memanggil metode callback ini secara langsung, namun Anda bisa melakukannya menggunakan
pengujian Espresso atau UI Automator bersama instrumentasi.
Anda mungkin sudah memiliki Android Support Repository dan Android Testing Support
Library yang dipasang bersama Android Studio. Untuk memeriksa Android Support Repository,
ikuti langkah-langkah ini:
Menambahkan dependensi
Bila Anda memulai proyek untuk faktor bentuk Ponsel dan Tablet menggunakan API 15:
Android 4.0.3 (Ice Cream Sandwich) sebagai SDK minimum, Android Studio versi 2.2 dan
yang lebih baru secara otomatis menyertakan dependensi yang Anda perlukan untuk
menggunakan Espresso. Untuk memastikan bahwa Anda memiliki dependensi ini, ikuti langkah-
langkah ini:
1. Buka file build.gradle (Modul: app) dalam proyek untuk memastikan yang berikut ini telah
disertakan (bersama dependensi lain) di bagian dependencies pada file build.gradle (Modul:
app) Anda:
2. androidTestCompile('com.android.support.test.espresso:espresso-
core:2.2.2', {
3. exclude group: 'com.android.support', module: 'support-
annotations'
4. })
5. testCompile 'junit:junit:4.12'
6. Android Studio juga menambahkan pernyataan instrumentasi berikut ke akhir bagian
defaultConfig :
7. testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
Catatan: Jika telah membuat proyek di versi Android Studio sebelumnya, Anda mungkin harus
menambahkan dependensi dan pernyataan instrumentasi sendiri.
1. Bila selesai, klik tautan Sync Now dalam notifikasi tentang file Gradle di sudut kanan atas
jendela.
Untuk menulis pengujian, Espresso dan UI Automator, gunakan JUnit sebagai kerangka kerja
pengujian. JUnit adalah kerangka kerja pengujian unit yang paling populer dan banyak
digunakan untuk Java. Kelas pengujian Anda yang menggunakan Espresso atau UI Automator
harus dituliskan sebagai kelas pengujian JUnit 4. Jika belum memiliki JUnit, Anda bisa
mendapatkannya di http://junit.org/junit4.
Catatan: Revisi JUnit terbaru adalah JUnit 5. Akan tetapi, untuk tujuan penggunaan Espresso atau UI
Automator, yang disarankan adalah versi 4.12.
Untuk membuat kelas pengujian JUnit 4 dasar, buat kelas Java untuk pengujian dalam direktori
yang ditetapkan pada awal bagian ini. Kelas ini harus berisi satu atau beberapa metode dan
aturan perilaku yang didefinisikan oleh anotasi JUnit.
@RunWith(AndroidJUnit4.class)
public class RecyclerViewTest {
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void recyclerViewTest() {
...
}
}
@RunWith
Database Tidak Ya Ya
Untuk keterangan anotasi Android @SmallTest, @MediumTest, dan @LargeTest lihat "Ukuran
Pengujian" dalam Blog Pengujian Google. Sebagai rangkuman anotasi JUnit, lihat Package
org.junit.
@Rule
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
ServiceTestRule adalah aturan JUnit yang menyediakan mekanisme sederhana untuk memulai
dan mematikan layanan sebelum dan setelah durasi pengujian Anda. Aturan ini juga menjamin
layanan berhasil terhubung saat memulai (atau mengikat ke) suatu layanan.
@Test
Metode pengujian dimulai dengan anotasi @Test dan berisi kode untuk dijalankan dan
memverifikasi satu fungsi dalam komponen yang ingin Anda uji:
@Test
public void testActivityLaunch() { … }
Dalam kasus yang jarang, Anda perlu mempersiapkan variabel-variabel atau mengeksekusi
urutan langkah sebelum atau setelah melakukan pengujian antarmuka pengguna. Anda bisa
menetapkan metode yang akan dijalankan sebelum menjalankan metode @Test , dengan
menggunakan anotasi @Before , dan metode yang akan dijalankan setelahnya, dengan
menggunakan anotasi @After .
@Before: Metode @Test akan mengeksekusi setelah metode yang ditetapkan oleh anotasi
@Before . Metode @Before menghentikan sebelum eksekusi metode @Test .
@After: Metode @Test akan mengeksekusi sebelum metode ditetapkan oleh anotasi
@After .
Untuk membuat pengujian yang seimbang, sebaiknya miliki alat yang memungkinkan Anda
memilih dengan tepat aspek pengujian dan menjelaskan nilai yang harus dimiliki. Pengujian
akan gagal bila perilaku aspek yang diuji menyimpang dari perilaku yang diharapkan, walaupun
tetap lulus saat dibuat perubahan minor yang tidak terkait dengan perilaku. Alat (bantu) yang
tersedia untuk Espresso adalah kerangka kerja Hamcrest.
Hamcrest (anagram dari "matchers") adalah kerangka kerja yang membantu penulisan pengujian
perangkat lunak di Java. Kerangka kerja ini memungkinkan Anda membuat matcher pernyataan
khusus, yang memungkinkan aturan pencocokan didefinisikan secara deklaratif.
Tulis pengujian Espresso berdasarkan apa yang mungkin dilakukan pengguna saat berinteraksi
dengan aplikasi Anda. Konsep utamanya adalah mencari kemudian berinteraksi dengan elemen
UI. Inilah langkah-langkah dasarnya:
3. Nyatakan dan verifikasi hasilnya: Memeriksa keadaan tampilan untuk mengetahui apakah telah
mencerminkan keadaan atau perilaku yang diharapkan, sebagaimana yang didefinisikan oleh
pernyataan.
Untuk membuat metode pengujian, Anda menggunakan tipe ekspresi Hamcrest berikut untuk
membantu menemukan tampilan dan berinteraksi dengannya:
ViewActions: Ekspresi ViewAction memungkinkan Anda melakukan suatu aksi pada tampilan
yang sudah ditemukan oleh ViewMatcher. Aksi tersebut bisa berupa salah satu aksi yang bisa
dilakukan pada tampilan, misalnya klik. Misalnya:
.perform(click())
ViewAssertions: Ekspresi ViewAssertion memungkinkan Anda menyatakan atau memeriksa
keadaan tampilan yang ditemukan oleh ViewMatcher. Misalnya:
.check(matches(isDisplayed()))
Anda bisa melihat cara kerja ketiga ekspresi dalam pernyataan berikut, yang mengombinasikan
ViewMatcher untuk menemukan tampilan, ViewAction untuk melakukan aksi, dan
ViewAssertion untuk memeriksa apakah hasil aksi cocok dengan pernyataan:
onView(withId(R.id.my_view)) // withId(R.id.my_view) is a
ViewMatcher
.perform(click()) // click() is a ViewAction
.check(matches(isDisplayed())); // matches(isDisplayed()) is a
ViewAssertion
Mengapa kerangka kerja Hamcrest berguna untuk pengujian? Sebuah pernyataan sederhana,
misalnya assert (x == y), memungkinkan Anda menyatakan selama pengujian bahwa
ketentuan tertentu harus bernilai true. Jika ketentuan bernilai false, maka pengujian gagal.
Namun, pernyataan sederhana tidak menyediakan pesan kesalahan yang berguna. Dengan
sekelompok pernyataan, Anda bisa menghasilkan pesan kesalahan yang lebih berguna, namun
hal ini akan menyebabkan ledakan jumlah pernyataan.
Untuk tutorial Hamcrest, lihat Tutorial Hamcrest. Untuk rangkuman singkat ekspresi matcher
Hamcrest, lihat daftar rujukan Espresso.
Menguji AdapterView
Dalam AdapterView seperti spinner, tampilan diisi dengan tampilan anak secara dinamis pada
waktu proses. Jika tampilan target yang ingin Anda uji ada dalam spinner, metode onView()
mungkin tidak akan bekerja karena hanya subset tampilan yang bisa dimuat dalam hierarki
tampilan saat ini.
Espresso menangani hal ini dengan menyediakan metode onData() terpisah, yang dapat memuat
item adapter terlebih dulu dan membuatnya difokus sebelum mengoperasikan padanya atau salah
satu tampilan anaknya. Metode onData() menggunakan objek DataInteraction dan metodenya,
misalnya atPosition(), check(), dan perform() untuk mengakses tampilan target. Espresso
menangani pemuatan elemen tampilan target ke dalam hierarki tampilan saat ini, pengguliran ke
tampilan anak target, dan penempatan tampilan tersebut ke dalam fokus.
Misalnya, pernyataan onView() dan onData() berikut akan menguji klik item spinner:
1. Temukan dan klik spinner itu sendiri (pengujian harus mengeklik spinner itu sendiri terlebih dulu
agar dapat mengeklik item lainnya dalam spinner):
2. onView(withId(R.id.spinner_simple)).perform(click());
3. Temukan kemudian klik item dalam spinner yang cocok dengan semua ketentuan berikut:
Seperti yang bisa Anda lihat dalam pernyataan di atas, ekspresi matcher bisa dikombinasikan
untuk membuat ekspresi maksud yang fleksibel:
allOf: Menghasilkan kecocokan jika objek yang diperiksa cocok dengan semua matcher yang
ditetapkan. Anda bisa menggunakan allOf() untuk mengombinasikan beberapa matcher,
misalnya containsString() dan instanceOf().
is: Hamcrest berusaha keras untuk membuat keterbacaan pengujian Anda setinggi mungkin.
Matcher is adalah wrapper yang tidak menambahkan perilaku ekstra pada matcher dasar,
melainkan membuat kode pengujian Anda menjadi lebih terbaca.
instanceOf: Menyebabkan kecocokan jika objek yang diperiksa merupakan instance dari tipe
yang ditetapkan; dalam hal ini adalah sebuah string. Kecocokan ini ditentukan dengan
memanggil metode Class.isInstance(Object), dengan meneruskan objek yang akan diperiksa.
@RunWith(AndroidJUnit4.class)
public class SpinnerSelectionTest {
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
@Test
public void iterateSpinnerItems() {
String[] myArray = mActivityRule.getActivity().getResources()
.getStringArray(R.array.labels_array);
Pengujian mengeklik setiap item spinner dari atas ke bawah, yang akan memeriksa apakah item
muncul di bidang teks. Berapa pun banyaknya item spinner yang didefinisikan dalam larik, atau
bahasa apa pun yang digunakan untuk item spinner—pengujian akan menjalankan semuanya dan
memeriksa keluarannya terhadap larik.
7. Menggunakan panjang (size) larik, loop for berulang pada setiap item spinner.
8. ...
9. int size = myArray.length;
10. for (int i=0; i<size; i++) {
11. // Find the spinner and click on it.
12. ...
13. The onView() statement within the for loop finds the spinner and clicks on it. The test must
click the spinner itself in order click any item in the spinner:
14. ...
15. // Find the spinner and click on it.
16. onView(withId(R.id.label_spinner)).perform(click());
17. ...
18. The onData() statement finds and clicks a spinner item:
19. ...
20. // Find the spinner item and click on it.
21. onData(is(myArray[i])).perform(click());
22. ...
Spinner diisi dari larik myArray , sehingga myArray[i] menyatakan elemen spinner dari
larik. Karena loop for mengulangi for (int i=0; i<size; i++), loop akan
melakukan klik pada setiap elemen spinner (myArray[i]) yang ditemukannya.
23. Pernyataan onView() terakhir menemukan tampilan teks (text_phonelabel) dan memeriksa
apakah item spinner tersebut adalah bagian dari string:
24. ...
25. onView(withId(R.id.text_phonelabel))
26. .check(matches(withText(containsString(myArray[i]))));
27. ...
RecyclerView berguna bila Anda memiliki sekumpulan data dengan elemen yang berubah pada
waktu proses berdasarkan aksi pengguna atau kejadian jaringan. RecyclerView adalah komponen
UI yang didesain untuk merender sekumpulan data, dan bukan subkelas dari AdapterView
melainkan ViewGroup. Ini berarti Anda tidak bisa menggunakan onData(), yang khusus untuk
AdapterView, untuk berinteraksi dengan item daftar.
Akan tetapi, ada kelas bernama RecyclerViewActions yang mengekspos API kecil untuk
beroperasi pada RecyclerView. Misalnya, pengujian berikut mengeklik item dari daftar
berdasarkan posisi:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
@RunWith(AndroidJUnit4.class)
public class RecyclerView {
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void recyclerViewTest() {
ViewInteraction recyclerView = onView(
allOf(withId(R.id.recyclerview), isDisplayed()));
recyclerView.perform(actionOnItemAtPosition(15, click()));
ViewInteraction textView = onView(
allOf(withId(R.id.word), withText("Clicked! Word 15"),
childAtPosition(
childAtPosition(
withId(R.id.recyclerview),
11),
0),
isDisplayed()));
textView.check(matches(withText("Clicked! Word 15")));
@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup &&
parentMatcher.matches(parent)
&& view.equals(((ViewGroup)
parent).getChildAt(position));
}
};
}
}
...
// TypeSafeMatcher() returned
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("Child at position "
+ position + " in parent ");
parentMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup &&
parentMatcher.matches(parent)
&& view.equals(((ViewGroup)
parent).getChildAt(position));
}
};
}
}
Merekam pengujian
Sebuah fitur Android Studio (di versi 2.2 dan lebih baru) memungkinkan Anda merekam
pengujian Espresso, dengan membuat pengujian secara otomatis.
Setelah memilih untuk merekam pengujian, gunakan aplikasi Anda seperti halnya pengguna
biasa. Saat Anda mengeklik UI aplikasi, kode pengujian yang bisa diedit akan dibuatkan untuk
Anda. Tambahkan pernyataan untuk memeriksa apakah tampilan berisi nilai tertentu.
Anda bisa merekam beberapa interaksi sekaligus bersama UI dalam satu sesi perekaman. Anda
juga bisa merekam beberapa pengujian dan mengedit pengujian untuk melakukan tindakan
lainnya, menggunakan kode yang direkam sebagai cuplikan untuk disalin, ditempel, dan diedit.
1. Pilih Run > Record Espresso Test, pilih target penerapan Anda (emulator atau perangkat) dan klik
OK.
2. Berinteraksilah dengan UI untuk melakukan apa yang ingin Anda uji. Dalam hal ini, gulir daftar
kata di aplikasi pada emulator atau perangkat, dan ketuk Word 15. Jendela Record Your Test akan
menampilkan aksi yang direkam ("Tap RecyclerView with element position 15").
3. Klik Add Assertion dalam jendela Record Your Test. Tangkapan layar UI aplikasi akan muncul di
panel kanan jendela. Pilih Clicked! Word 15 di tangkapan layar sebagai elemen UI yang ingin
Anda periksa. Langkah ini akan menghasilkan sebuah pernyataan untuk tampilan elemen yang
dipilih.
4. Pilih text is dari menu tarik-turun kedua, dan masukkan teks yang ingin Anda lihat dalam elemen
UI tersebut.
5. Klik Save Assertion, kemudian klik Complete Recording.
6. Dalam dialog yang muncul, Anda bisa mengedit nama pengujian, atau menerima nama yang
disarankan (seperti MainActivityTest).
Untuk menggunakan UI Automator, Anda harus sudah menyetel lingkungan pengujian Anda
dengan cara yang sama untuk Espresso:
androidTestCompile
'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
1. Pasang kemudian luncurkan aplikasi pada perangkat fisik seperti ponsel cerdas.
2. Hubungkan perangkat ke komputer development Anda.
3. Buka jendela terminal dan arahkan ke direktori /tools/. Untuk menemukan jalur tertentu, pilih
Preferences di Android Studio, dan klik Appearance & Behavior > System Settings> Android
SDK. Jalur lengkap untuk akan muncul dalam kotak Android SDK Location di bagian atas layar.
Untuk memastikan bahwa pengujian UI Automator bisa mengakses elemen UI aplikasi, periksa
apakah elemen memiliki label teks yang terlihat, nilai-nilai android:contentDescription, atau
keduanya. Anda bisa menampilkan properti elemen UI dengan mengikuti langkah-langkah ini
(lihat gambar di bawah ini):
1. Setelah meluncurkan uiautomatorviewer, tampilan akan kosong. Klik tombol Device Screenshot.
2. Arahkan ke atas elemen UI di cuplikan pada panel sebelah kiri untuk melihat elemen dalam
hierarki layout pada panel kanan atas.
3. Atribut layout dan properti lainnya untuk elemen UI akan muncul di panel kanan bawah.
Gunakan informasi ini untuk membuat pengujian yang memilih elemen UI yang cocok dengan
atribut atau properti tertentu yang terlihat.
Dalam aplikasi yang ditampilkan di atas, tombol aksi mengambang warna merah meluncurkan
aplikasi Maps. Ikuti langkah-langkah ini untuk menguji aksi yang dilakukan tombol aksi
mengambang:
Dengan menggunakan viewer, Anda bisa menentukan elemen UI mana yang bisa diakses untuk
kerangka kerja UI Automator.
Kerangka kerja UI Automator bergantung pada fitur aksesibilitas kerangka kerja Android untuk
mencari elemen UI individual. Implementasikan properti tampilan seperti berikut:
Tip: Anda bisa membuat kontrol masukan menjadi lebih mudah diakses oleh orang yang
memiliki gangguan penglihatan, dengan menggunakan atribut layout XML
android:contentDescription . Teks dalam atribut ini tidak muncul pada layar, namun
jika pengguna mengaktifkan layanan aksesibilitas yang menyediakan perintah yang bisa
didengar, maka bila pengguna mengarahkan ke kontrol itu, teksnya akan dibacakan.
1. Akses perangkat yang akan diuji: Instance kelas InstrumentRegistry yang berisi referensi ke
instrumentasi yang berjalan dalam proses bersama dengan argumen instrumentasi. Kelas ini juga
menyediakan cara yang mudah bagi pemanggil untuk mendapatkan instrumentasi, konteks
aplikasi, dan Bundle argumen instrumentasi. Anda bisa mendapatkan objek UiDevice dengan
memanggil metode getInstance() dan meneruskan objek Instrumentasi kepadanya—
InstrumentationRegistry.getInstrumentation()—sebagai argumen. Misalnya:
2. mDevice =
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
3. Akses elemen UI yang ditampilkan pada perangkat: Dapatkan UiObject dengan memanggil
metode findObject(). Misalnya:
4. UiObject okButton = mDevice.findObject(new UiSelector()
5. .text("OK"))
6. .className("android.widget.Button"));
7. Lakukan aksi: Simulasikan interaksi pengguna tertentu untuk dilakukan pada elemen UI
itu dengan memanggil metode UiObject. Misalnya:
Anda bisa mengulang langkah 2 dan 3 sesuai kebutuhan untuk menguji interaksi
pengguna lebih kompleks yang melibatkan beberapa komponen UI atau urutan tindakan
pengguna.
11. Verifikasi hasilnya: Periksa apakah UI mencerminkan keadaan atau perilaku yang diharapkan
setelah interaksi pengguna ini dilakukan. Anda bisa menggunakan metode JUnit Assert untuk
menguji apakah komponen UI dalam aplikasi mengembalikan hasil yang diharapkan. Misalnya:
12. UiObject result = mDevice.findObject(By.res(CALC_PACKAGE, "result"));
13. assertEquals("5", result.getText());
Mengakses perangkat
Kelas UiDevice menyediakan metode untuk mengakses dan memanipulasi keadaan perangkat.
Tidak seperti Espresso, UI Automator bisa memverifikasi perilaku interaksi yang tepat di antara
berbagai aplikasi pengguna, atau antara aplikasi pengguna dan aplikasi sistem. UI Automator
memungkinkan Anda berinteraksi dengan elemen yang terlihat pada suatu perangkat. Dalam
pengujian, Anda bisa memanggil metode UiDevice untuk memeriksa keadaan beragam properti,
misalnya orientasi saat ini atau ukuran tampilan. Pengujian Anda bisa menggunakan objek
UiDevice untuk melakukan tindakan tingkat perangkat, misalnya memaksa perangkat ke rotasi
tertentu, menekan tombol perangkat keras D-pad, dan menekan tombol Beranda.
Praktik yang baik adalah memulai pengujian Anda dari layar utama perangkat. Dari layar utama,
Anda bisa memanggil metode yang disediakan oleh UI Automator API untuk memilih dan
berinteraksi dengan elemen UI tertentu. Cuplikan kode berikut menampilkan bagaimana
pengujian Anda bisa mendapatkan instance UiDevice, menyimulasikan penekanan tombol
Beranda, dan meluncurkan aplikasi:
import org.junit.Before;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.Until;
...
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ChangeTextBehaviorTest {
@Before
public void startMainActivityFromHomeScreen() {
// Initialize UiDevice instance
mDevice =
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
Mengakses elemen UI
Gunakan metode findObject() kelas UiObject untuk mengambil instance UiObject yang
menyatakan elemen UI yang cocok dengan kriteria pemilih. Untuk mengakses elemen UI
tertentu, gunakan kelas UiSelector yang menyatakan kueri untuk elemen tertentu dalam UI yang
ditampilkan saat ini.
Anda bisa menggunakan kembali instance UiObject yang dibuat di bagian lain pengujian
aplikasi. Kerangka kerja pengujian UI Automator akan menelusuri tampilan saat ini untuk
menemukan suatu kecocokan setiap kali pengujian Anda menggunakan instance UiObject untuk
mengeklik elemen UI elemen atau menjalankan kueri atas suatu atribut.
Yang berikut ini menampilkan bagaimana pengujian Anda akan membentuk instance UiObject
dengan menggunakan findObject() bersama UiSelector yang menyatakan tombol Cancel, dan
yang menyatakan tombol OK:
Jika lebih dari satu elemen yang cocok, elemen pertama yang cocok dalam hierarki layout
(ditemukan dengan bergerak dari atas ke bawah, kiri ke kanan) akan dikembalikan sebagai target
UiObject. Saat membentuk UiSelector, Anda bisa merangkai beberapa atribut dan properti untuk
memperbaiki penelusuran. Jika tidak ditemukan elemen UI yang cocok, pengecualian
(UiAutomatorObjectNotFoundException) akan dilontarkan.
Walaupun mungkin berguna untuk merujuk ke atribut android:text dari elemen ListView atau
RecycleView karena tidak ada ID sumber daya (atributandroid:id ) untuk elemen semacam itu,
sebaiknya gunakan ID sumber daya saat menetapkan pemilih, bukan atribut android:text atau
android:contentDescription . Tidak semua elemen memiliki atribut teks (misalnya, ikon
dalam bilah alat). Pengujian bisa gagal jika ada perubahan kecil pada teks komponen UI, dan
pengujian tidak akan berguna bagi aplikasi yang diterjemahkan ke dalam bahasa lain karena
pemilih teks Anda tidak akan cocok dengan sumber daya string yang diterjemahkan.
Menjalankan tindakan
Setelah pengujian mengambil objek UiObject, Anda bisa memanggil metode dalam kelas
UiObject untuk melakukan interaksi pengguna pada komponen UI yang dinyatakan oleh objek
itu. Misalnya, instance UiObject yang dibuat di bagian sebelumnya untuk tombol OK dan Cancel
bisa digunakan untuk melakukan klik:
swipeUp(): Melakukan aksi gesek pada UiObject. Begitu juga, metode swipeDown(), swipeLeft(),
dan swipeRight() akan melakukan tindakan yang sesuai.
Gunakan kelas UiCollection jika Anda ingin menyimulasikan interaksi pengguna pada
sekumpulan elemen UI (misalnya, judul lagu atau daftar email). Untuk membuat objek
UiCollection, tetapkan UiSelector yang akan menelusuri kontainer UI atau wrapper elemen UI
anak lainnya, misalnya grup layout yang berisi elemen UI anak.
Yang berikut ini menampilkan bagaimana pengujian Anda bisa menggunakan UiCollection untuk
menyatakan album video yang ditampilkan dalam FrameLayout:
Gunakan kelas UiScrollable untuk menyimulasikan pengguliran vertikal atau horizontal pada
tampilan. Teknik ini berguna bila elemen UI diposisikan tidak tampak dan Anda perlu
menggulirnya untuk menampilkannya. Misalnya, cuplikan kode berikut menampilkan cara
menyimulasikan pengguliran ke bawah menu Settings dan pengeklikan opsi About phone:
Memverifikasi hasilnya
Anda bisa menggunakan metode JUnit Assert untuk menguji apakah komponen UI dalam
aplikasi mengembalikan hasil yang diharapkan. Misalnya, Anda bisa menggunakan assertFalse()
untuk menyatakan bahwa suatu ketentuan bernilai false untuk menguji apakah syarat tersebut
benar-benar menghasilkan nilai false. Gunakan assertEquals() untuk menguji apakah hasil angka
titik-mengambang sama dengan pernyataan:
assertEquals("5", result.getText());
Yang berikut ini menampilkan bagaimana pengujian Anda bisa menemukan sejumlah tombol
dalam aplikasi kalkulator, mengekliknya berurutan, kemudian memverifikasi apakah hasil
ditampilkan benar:
Untuk menjalankan semua pengujian di sebuah direktori, klik-kanan pada direktori dan pilih
Run tests.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dokumentasi Android Studio:
Tutorial Hamcrest
Dokumentasi Espresso
Contoh Espresso
Dasar-dasar Espresso
Dukungan Pengujian Android - Pola Pengujian Android #3 (tampilan onData dan adapter)
Lainnya:
o Ukuran Pengujian
Thread UI
AsyncTask
Penggunaan AsyncTask
Contoh AsyncTask
Mengeksekusi AsyncTask
Membatalkan AsyncTask
Keterbatasan AsyncTask
Loader
AsyncTaskLoader
Penggunaan AsyncTaskLoader
Praktik terkait
Ketahui selengkapnya
Ada dua cara untuk melakukan pemrosesan latar belakang di Android: menggunakan kelas
AsyncTask , atau menggunakan kerangka kerja Loader , yang menyertakan kelas
AsyncTaskLoader yang menggunakan AsyncTask. Di sebagian besar situasi, Anda akan
memilih kerangka kerja Loader , namun penting untuk mengetahui cara kerja AsyncTask ,
sehingga Anda bisa membuat pilihan yang bagus.
Dalam bab ini Anda akan mempelajari alasan pentingnya memproses beberapa tugas di latar
belakang, di luar thread UI. Anda akan mempelajari cara menggunakan AsyncTask, bila tidak
menggunakan AsyncTask, dan dasar-dasar penggunaan loader.
Thread UI
Bila aplikasi Android dimulai, aplikasi membuat thread utama, yang sering disebut thread UI.
Thread UI mengirimkan kejadian ke widget antarmuka pengguna (UI) yang sesuai, dan ini
merupakan tempat aplikasi Anda berinteraksi dengan komponen dari toolkit UI Android
(komponen dari paket android.widget dan android.view).
Thread UI perlu memberikan perhatiannya untuk menggambar UI dan menjaga aplikasi tetap
responsif terhadap masukan pengguna. Jika semuanya terjadi di thread UI, operasi panjang
seperti akses jaringan atau kueri database bisa memblokir seluruh UI. Dari perspektif pengguna,
aplikasi tersebut akan mogok. Lebih buruk lagi, jika thread UI diblokir selama lebih dari
beberapa detik (saat ini sekitar 5 detik) pengguna akan ditampilkan dialog "application not
responding" (ANR). Pengguna bisa memutuskan untuk keluar dari aplikasi dan mencopot
pemasangannya.
Selesaikan semua pekerjaan dalam waktu kurang dari 16 md untuk setiap layar UI.
Jangan menjalankan tugas asinkron dan tugas lain yang berjalan lama pada thread UI.
Sebagai gantinya, implementasikan tugas pada thread latar belakang menggunakan
AsyncTask (untuk tugas singkat atau yang bisa disela) atau AsyncTaskLoader (untuk
tugas berprioritas tinggi, atau tugas yang perlu melaporkan kembali ke pengguna atau
UI). 2. Lakukan pekerjaan UI hanya pada thread UI.
Jangan menggunakan thread latar belakang untuk memanipulasi UI Anda, karena toolkit UI
Android bukan thread-safe.
AsyncTask
Gunakan kelas AsyncTask untuk mengimplementasikan tugas asinkron yang berjalan lama di
thread pekerja. (Thread pekerja adalah thread yang bukan thread utama atau thread UI.)
AsyncTask memungkinkan Anda menjalankan operasi latar belakang dan mempublikasikan hasil
di thread UI tanpa memanipulasi thread atau penangan.
Untuk detail selengkapnya mengenai metode ini, lihat referensi AsyncTask. Di bawah ini
adalah diagram urutan pemanggilan.
Penggunaan AsyncTask
Untuk menggunakan kelas AsyncTask , definisikan subkelas AsyncTask yang menggantikan
metode doInBackground(Params...) (dan biasanya juga metode onPostExecute(Result) ).
Bagian ini menjelaskan parameter dan penggunaan AsyncTask, kemudian menampilkan contoh
lengkap.
Parameter AsyncTask
Tetapkan tipe data untuk setiap tipe parameter ini, atau gunakan Void jika tipe parameter tidak
akan digunakan. Misalnya:
Tipe parameter "Params" adalah String, yang berarti bahwa MyAsyncTask memerlukan
satu atau beberapa string sebagai parameter di doInBackground(), misalnya untuk
digunakan di kueri.
Tipe parameter "Progress" adalah Void, yang berarti bahwa MyAsyncTask tidak akan
menggunakan metode publishProgress() atau onProgressUpdate() .
Contoh AsyncTask
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
URL untuk tipe parameter "Params". Tipe URL berarti Anda bisa meneruskan sejumlah
URL ke dalam panggilan, dan URL secara otomatis diteruskan ke dalam metode
doInBackground() sebagai larik.
Integer untuk tipe parameter "Progress".
Mengeksekusi AsyncTask
Setelah Anda mendefinisikan subkelas AsyncTask, buat instance-nya di thread UI. Kemudian
panggil execute() di instance, dengan meneruskan sejumlah parameter. (Parameter tersebut
sesuai dengan tipe parameter "Params" yang dibahas di atas).
Membatalkan AsyncTask
Anda bisa membatalkan tugas kapan saja, dari thread apa pun, dengan memanggil metode
cancel() .
Metode cancel() akan mengembalikan false jika tugas tidak bisa dibatalkan, biasanya
karena sudah diselesaikan secara normal. Jika tidak, cancel() akan mengembalikan
true.
Untuk mengetahui apakah tugas sudah dibatalkan, periksa nilai yang dikembalikan
isCancelled() secara berkala dari doInBackground(Object[]), misalnya dari dalam
loop seperti yang ditampilkan dalam contoh di atas. Metode isCancelled() akan
mengembalikan true jika tugas dibatalkan sebelum diselesaikan secara normal.
Secara default, tugas yang sedang diproses boleh diselesaikan. Untuk memperbolehkan
cancel() menyela thread yang sedang mengeksekusi tugas, teruskan true untuk nilai
mayInterruptIfRunning.
Keterbatasan AsyncTask
AsyncTask tidak praktis untuk beberapa kasus penggunaan:
Bila konfigurasi perangkat berubah sewaktu AsyncTask berjalan, misalnya jika pengguna
mengubah orientasi layar, aktivitas yang membuat AsyncTask akan dimusnahkan dan
dibuat ulang. Metode AsyncTask tidak dapat mengakses aktivitas yang baru saja dibuat
dan hasil AsyncTask tidak akan dipublikasikan.
Objek AsyncTask lama tetap ada, dan aplikasi Anda bisa kehabisan memori atau mogok.
Untuk semua situasi lainnya, gunakan AsyncTaskLoader, adalah bagian dari kerangka kerja
Loader yang akan dijelaskan berikutnya.
Loader
Tugas latar belakang biasanya digunakan untuk memuat data seperti laporan prakiraan cuaca
atau ulasan film. Pemuatan data bisa jadi banyak menggunakan memori, dan Anda ingin data
tersedia sekalipun jika konfigurasi perangkat berubah. Untuk situasi ini, gunakan loader, yang
berupa rangkaian kelas yang memfasilitasi pemuatan data ke dalam aktivitas.
Loader menggunakan kelas LoaderManager untuk mengelola satu atau beberapa loader.
LoaderManager menyertakan serangkaian callback bila loader telah dibuat, bila pemuatan
datanya selesai, dan bila disetel ulang.
Memulai loader
Gunakan kelas LoaderManager untuk mengelola satu atau beberapa instance Loader dalam
aktivitas atau fragmen. Gunakan initLoader() untuk melakukan inisialisasi dan
mengaktifkannya. Biasanya, Anda melakukan ini dalam metode onCreate() aktivitas. Misalnya:
ID unik yang mengidentifikasi loader. ID ini bisa berupa apa saja yang Anda inginkan.
Argumen opsional yang disediakan ke loader saat pembuatan, dalam bentuk Bundle. Jika
loader sudah ada, parameter ini akan diabaikan.
Implementasi LoaderCallbacks, yang dipanggil oleh LoaderManager untuk melaporkan
kejadian loader. Dalam contoh ini, kelas lokal mengimplementasikan antarmuka
LoaderManager.LoaderCallbacks , sehingga meneruskan referensi ke dirinya sendiri,
this.
Jika loader yang ditetapkan melalui ID sudah ada, maka loader yang dibuat terakhir
menggunakan ID itu akan digunakan kembali.
Jika loader yang ditetapkan melalui ID tidak ada, initLoader() akan memicu metode
onCreateLoader). Di sinilah Anda mengimplementasikan kode untuk membuat
instance dan mengembalikan loader baru.
Catatan:Bila initLoader() membuat loader atau menggunakan kembali loader yang
ada, implementasi LoaderCallbacks yang diberikan akan dikaitkan dengan loader dan
dipanggil bila keadaan loader berubah. Jika loader yang diminta sudah ada dan sudah
menghasilkan data, maka sistem segera memanggil onLoadFinished() (selama
initLoader()), jadi bersiaplah jika hal ini terjadi.
Bila initLoader() menggunakan kembali loader yang ada, maka data yang telah dimuat loader
tidak akan diganti, namun kadang-kadang Anda perlu menggantinya. Misalnya, bila Anda
menggunakan kueri pengguna untuk melakukan penelusuran dan pengguna memasukkan kueri
baru, Anda perlu memuat ulang data dengan menggunakan istilah penelusuran baru. Dalam
situasi ini, gunakan metode restartLoader() dan teruskan ID loader yang ingin dimulai ulang.
Hal ini akan memaksa muatan data lain dengan data masukan baru.
Jika sudah ada loader dengan ID yang diberikan, restartLoader() akan memulai ulang
loader yang diidentifikasi dan mengganti datanya.
Jika tidak ada loader dengan ID yang diberikan, restartLoader() akan memulai loader
baru.
Callback LoaderManager
Untuk berinteraksi dengan loader, gunakan salah satu callback LoaderManager di aktivitas
yang memerlukan data:
Panggil onCreateLoader() agar bisa membuat instance dan mengembalikan loader baru
untuk ID yang diberikan.
Panggil onLoadFinished() bila loader yang dibuat sebelumnya selesai memuat. Di
sinilah Anda biasanya ingin memindahkan data ke dalam tampilan aktivitas.
Panggil onLoaderReset() bila loader yang dibuat sebelumnya sedang disetel ulang,
sehingga datanya tidak tersedia. Di sinilah aplikasi harus membuang semua referensi apa
pun yang dimilikinya ke data loader.
Subkelas Loader bertanggung jawab atas pemuatan data sebenarnya. Subkelas Loader yang
Anda gunakan bergantung pada tipe data yang dimuat, namun salah satu yang paling mudah
adalah AsyncTaskLoader, yang akan dijelaskan berikutnya. AsyncTaskLoader menggunakan
AsyncTask untuk menjalankan tugas pada thread pekerja.
AsyncTaskLoader
AsyncTaskLoader adalah loader yang setara dengan AsyncTask. AsyncTaskLoader
menyediakan metode, loadInBackground(), yang dijalankan di thread terpisah. Hasil
loadInBackground() secara otomatis dikirimkan ke thread UI, melalui onLoadFinished()
LoaderManager callback.
Penggunaan AsyncTaskLoader
Untuk mendefinisikan subkelas AsyncTaskLoader, buat kelas yang memperluas
AsyncTaskLoader<D>, dalam hal ini D adalah tipe data yang sedang Anda muat. Misalnya,
AsyncTaskLoader ini akan memuat daftar string:
@Override
public List<String> loadInBackground() {
List<String> data = new ArrayList<String>;
//TODO: Load the data from the network or from a database
return data;
}
Mengimplementasikan callback
@Override
public Loader<List<String>> onCreateLoader(int id, Bundle args) {
return new StringListLoader(this, args.getString("queryString"));
}
Callback onLoaderReset() hanya dipanggil bila loader akan dimusnahkan, sehingga seringkali
Anda bisa mengosongkan onLoaderReset() , karena Anda tidak akan mencoba mengakses data
setelah loader ini dimusnahkan.
Bila Anda menggunakan AsyncTaskLoader, data Anda akan bertahan bila ada perubahan
konfigurasi perangkat. Jika aktivitas Anda dmusnahkan secara permanen, loader ini akan
dimusnahkan bersamanya, tanpa tugas yang menanti dan mengonsumsi sumber daya sistem.
Loader juga memiliki manfaat lain, misalnya loader bisa memantau perubahan sumber data dan
memuat ulang data jika terjadi perubahan. Anda akan mengetahui selengkapnya tentang loader
tertentu di pelajaran berikutnya.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Buat AsyncTask
Ketahui selengkapnya
Referensi AsyncTask
Referensi AsyncTaskLoader
Referensi LoaderManager
Proses dan Thread
Panduan loader
7.2: Hubungkan ke Internet
Materi:
Pengantar
Keamanan jaringan
Menyertakan izin dalam manifes
Menjalankan operasi jaringan di thread pekerja
Membuat koneksi HTTP
Mem-parse hasil
Mengelola keadaan jaringan
Praktik terkait
Ketahui selengkapnya
Sebagian besar aplikasi Android memiliki beberapa data yang berinteraksi dengan pengguna;
seperti artikel berita, informasi cuaca, kontak, data game, informasi pengguna, dan lainnya.
Seringkali, data ini disediakan melalui jaringan oleh API web.
Dalam pelajaran ini, Anda akan mempelajari tentang keamanan jaringan dan cara membuat
panggilan jaringan, yang melibatkan tugas-tugas ini:
Keamanan jaringan
Transaksi jaringan berisiko inheren, karena mereka melibatkan transmisi data yang boleh jadi
bersifat privat untuk pengguna. Orang semakin sadar dengan risiko ini, terutama ketika
perangkat mereka melakukan transaksi jaringan, jadi sangat penting jika aplikasi Anda
mengimplementasikan praktik terbaik untuk menjaga data pengguna tetap aman setiap saat.
Gunakan protokol yang sesuai untuk data sensitif. Misalnya untuk lalu lintas web aman,
gunakan subkelas HttpsURLConnection dari HttpURLConnection.
Gunakan HTTPS sebagai ganti HTTP di mana saja HTTPS didukung pada server, karena
perangkat seluler sering menghubungkan pada jaringan tidak aman seperti hotspot Wi-Fi
publik. Pertimbangkan penggunaan SSLSocketClass untuk mengimplementasikan
komunikasi level soket yang diautentikasi dan dienkripsi.
Jangan gunakan porta jaringan host lokal untuk menangani komunikasi interproses
sensitif (IPC), karena aplikasi lain di perangkat bisa mengakses porta lokal ini. Sebagai
gantinya, gunakan mekanisme yang memungkinkan Anda menggunakan autentikasi,
misalnya Service.
Jangan mempercayai data yang telah diunduh dari HTTP atau protokol tidak aman
lainnya. Validasi masukan yang dimasukkan ke dalam WebView dan respons ke maksud
yang Anda keluarkan terhadap HTTP.
Untuk praktik terbaik dan tips keamanan, lihat artikel Tips Keamanan.
Saat menggunakan jaringan, praktik terbaiknya adalah memantau keadaan jaringan perangkat
sehingga Anda tidak berupaya membuat panggilan jaringan ketika jaringan tidak tersedia. Untuk
mengakses keadaan jaringan perangkat, aplikasi memerlukan izin tambahan:
Catatan: Jika menjalankan operasi jaringan di thread utama sebagai ganti di thread pekerja,
Anda akan menerima kesalahan.
Untuk membuka koneksi HTTP, Anda perlu membangun URI permintaan. URI biasanya dibuat
dari URL dasar dan sekumpulan parameter kueri yang menetapkan sumber daya yang dimaksud.
Misalnya untuk menelusuri lima hasil buku pertama untuk "Pride and Prejudice" di Google
Books API, gunakan URI berikut:
https://www.googleapis.com/books/v1/volumes?
q=pride+prejudice&maxResults=5&printType=books
Untuk menyusun URI permintaan lewat program, gunakan metode URI.parse() dengan metode
buildUpon() dan appendQueryParameter() . Kode berikut membangun URI lengkap yang
ditampilkan di atas:
// Build up the query URI, limiting results to 5 items and printed books.
Uri builtURI = Uri.parse(BOOK_BASE_URL).buildUpon()
.appendQueryParameter(QUERY_PARAM, "pride+prejudice")
.appendQueryParameter(MAX_RESULTS, "5")
.appendQueryParameter(PRINT_TYPE, "books")
.build();
Di thread pekerja yang menjalankan transaksi jaringan Anda, misalnya dalam penggantian
metode doInBackground() di AsyncTask, gunakan kelas HttpURLConnection untuk
menjalankan permintaan GET HTTP dan mengunduh data yang diperlukan aplikasi. Begini
caranya:
1. Untuk memperoleh HttpURLConnectionbaru, panggil URL.openConnection()
menggunakan URI yang Anda bangun. Transmisikan hasilnya ke HttpURLConnection.
URI adalah properti utama permintaan, namun header permintaan juga bisa menyertakan
metadata seperti kredensial, tipe materi pilihan, dan cookie sesi.
o Jika Anda tidak ingin menggunakan jaringan untuk masukan, setel setDoInput
ke false. (Defaultnya adalah true.)
o Untuk metode lain yang bisa Anda setel, lihat dokumentasi referensi
HttpURLConnection dan URLConnection.
4. Panggil disconnect() untuk menutup koneksi. Memutus koneksi akan melepas sumber
daya yang ditahan oleh koneksi sehingga sumber daya bisa ditutup atau digunakan
kembali.
Jika mengeposkan data melalui jaringan dan tidak hanya menerima data, Anda perlu
mengunggah isi permintaan, yang menampung data yang akan diposkan. Caranya:
Catatan: Semua panggilan jaringan harus dijalankan di thread pekerja dan bukan di thread UI.
Contoh permintaan
Contoh berikut mengirimkan permintaan ke URL yang dibangun di bagian Membangun URI
Anda, di atas. Permintaan memperoleh HttpURLConnectionbaru, membuka aliran masukan,
membaca respons, mengubah respons menjadi string, dan menutup koneksi.
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
// Start the query
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
inputStream = conn.getInputStream();
InputStream merupakan sumber byte yang dapat dibaca. Setelah Anda mendapatkan
InputStream, biasanya kemudian mendekode atau mengubahnya menjadi tipe data yang
diperlukan. Dalam contoh di atas, InputStream menyatakan teks biasa dari laman web yang
berada di https://www.googleapis.com/books/v1/volumes?
q=pride+prejudice&maxResults=5&printType=books.
Mem-parse hasil
Bila Anda membuat kueri API web, hasilnya seringkali dalam format JSON.
Di bawah ini adalah contoh respons JSON dari permintaan HTTP. Respons ini menampilkan
nama tiga item menu di menu munculan dan metode yang dipicu bila item menu diklik:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
Untuk menemukan nilai item dalam respons, gunakan metode dari kelas JSONObject dan
JSONArray. Misalnya, inilah cara untuk menemukan nilai "onclick" dari item ketiga di larik
"menuitem" :
Kadang-kadang juga penting bagi aplikasi untuk mengetahui jenis konektivitas yang dimiliki
perangkat: Jaringan Wi-Fi biasanya lebih cepat daripada jaringan data, dan jaringan data
biasanya seringkali berkuota dan mahal. Untuk mengontrol kapan tugas tertentu dijalankan,
pantau keadaan jaringan dan tanggapi sebagaimana mestinya. Misalnya, Anda mungkin ingin
menunggu hingga perangkat terhubung ke Wi-Fi untuk melakukan pengunduhan file besar.
Cuplikan kode berikut menguji apakah Wi-Fi dan seluler terhubung. Dalam kode:
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Menghubungkan ke Jaringan
Mengelola Penggunaan Jaringan
Referensi HttpURLConnection
Referensi ConnectivityManager
Referensi InputStream
Pengantar
Maksud siaran
Penerima siaran
Panduan keamanan
LocalBroadcastManager
Praktik terkait
Ketahui selengkapnya
Maksud eksplisit digunakan untuk memulai aktivitas tertentu yang benar-benar memenuhi syarat,
serta untuk meneruskan informasi di antara aktivitas di aplikasi Anda. Maksud implisit
digunakan untuk memulai aktivitas berdasarkan komponen terdaftar yang diketahui sistem,
misalnya fungsionalitas umum.
Dalam pelajaran ini Anda akan mempelajari tentang maksud siaran, yang tidak memulai
aktivitas namun dikirimkan ke penerima siaran.
Maksud siaran
Maksud yang telah Anda lihat sejauh ini selalu menghasilkan aktivitas yang akan diluncurkan,
baik aktivitas tertentu dari aplikasi Anda maupun aktivitas dari aplikasi lain yang bisa memenuhi
aksi yang diminta. Namun kadang-kadang maksud tidak memiliki penerima tertentu, dan
kadang-kadang Anda tidak ingin aktivitas diluncurkan sebagai respons terhadap maksud.
Misalnya, bila aplikasi Anda menerima maksud sistem yang menunjukkan bahwa keadaan
jaringan di perangkat sudah berubah, Anda mungkin tidak ingin meluncurkan aktivitas,
melainkan mungkin ingin menonaktifkan beberapa fungsionalitas aplikasi.
Karena alasan ini, ada tipe maksud ketiga yang bisa dikirimkan ke aplikasi yang tertarik: maksud
siaran. Meskipun maksud siaran didefinisikan dengan cara yang sama seperti maksud implisit,
setiap tipe maksud memiliki karakteristik pembeda yang penting:
Maksud siaran dikirim menggunakan sendBroadcast() atau metode terkait, sementara tipe
maksud lainnya menggunakan startActivity() untuk memulai aktivitas. Bila menyiarkan
maksud, Anda tidak akan pernah menemukan atau memulai aktivitas. Demikian juga, tidak ada
cara bagi penerima siaran untuk melihat atau menangkap maksud yang digunakan bersama
startActivity().
Maksud siaran adalah operasi latar belakang yang biasanya tidak diketahui pengguna. Memulai
aktivitas bersama maksud, di sisi lain, adalah operasi latar depan yang memodifikasi apa yang
sedang berinteraksi dengan pengguna.
Ada dua tipe maksud siaran, yang dikirimkan oleh sistem (maksud siaran sistem), dan yang
dikirimkan oleh aplikasi Anda (maksud siaran khusus).
Maksud siaran sistem
Sistem mengirimkan maksud siaran sistem bila ada kejadian sistem yang mungkin menarik
aplikasi. Misalnya:
Bila perangkat sedang booting, sistem akan mengirim sebuah maksud siaran sistem
ACTION_BOOT_COMPLETED . Maksud ini berisi nilai konstanta
"android.intent.action.BOOT_COMPLETED".
Bila perangkat terhubung ke daya eksternal, sistem akan mengirim
ACTION_POWER_CONNECTED, yang berisi nilai konstanta
"android.intent.action.ACTION_POWER_CONNECTED". Bila perangkat terlepas dari daya
eksternal, sistem akan mengirim ACTION_POWER_DISCONNECTED.
Untuk informasi selengkapnya tentang siaran sistem umum, kunjungi referensi Intent .
Untuk menerima maksud siaran sistem, Anda perlu membuat penerima siaran.
Maksud siaran khusus adalah maksud siaran yang dikirim aplikasi Anda. Gunakan maksud
siaran khusus bila Anda ingin agar aplikasi mengambil suatu aksi tanpa meluncurkan aktivitas,
misalnya bila Anda ingin membiarkan aplikasi lainnya mengetahui bahwa data telah diunduh ke
perangkat dan tersedia untuk digunakan.
Untuk membuat maksud siaran khusus, buat aksi maksud khusus. Untuk mengirim siaran khusus
ke aplikasi lainnya, teruskan maksud ke sendBroadcast(), sendOrderedBroadcast(), atau
sendStickyBroadcast(). (Untuk detail tentang metode ini, lihat dokumentasi referensi
Context .)
Misalnya, metode berikut membuat sebuah maksud dan menyiarkannya ke semua [penerima
siaran] yang tertarik(#broadcast_receivers):
Penerima siaran
Maksud siaran tidak ditargetkan pada penerima tertentu. Sebagai gantinya, aplikasi yang tertarik
mendaftarkan komponen untuk "mendengarkan" jenis maksud ini. Komponen pendengar ini
disebut penerima siaran.
Gunakan penerima siaran untuk merespons pesan yang disiarkan dari aplikasi lain atau dari
sistem. Untuk membuat penerima siaran:
Sebagai bagian dari langkah ini, gunakan filter maksud untuk menetapkan jenis maksud
siaran yang ingin Anda terima.
Dalam contoh ini, subkelas AlarmReceiver dari BroadcastReceiver menampilkan pesan Toast
jika maksud siaran yang masuk memiliki aksi ACTION_SHOW_TOAST:
Jika Anda memerlukan operasi yang berjalan lama yang tidak memerlukan UI, gunakan Service
yang diluncurkan dari penerima siaran. Khususnya:
Anda tidak bisa menampilkan dialog dari dalam BroadcastReceiver. Sebagai gantinya,
gunakan NotificationManager API.
Anda tidak bisa mengikat ke layanan dari dalam BroadcastReceiver. Sebagai gantinya,
gunakan Context.startService() untuk mengirim perintah ke layanan.
Ada dua cara untuk mendaftarkan penerima siaran: secara statis di manifes, atau secara dinamis
di aktivitas Anda.
Pendaftaran statis
Untuk mendaftarkan penerima siaran secara statis, tambahkan elemen <receiver> ke file
AndroidManifest.xml Anda. Dalam elemen <receiver> :
Untuk menetapkan tipe maksud yang akan didengarkan komponen, gunakan elemen <intent-
filter> yang disarangkan.
Contoh: Pendaftaran statis dan filter maksud untuk maksud siaran khusus
Cuplikan kode berikut adalah contoh pendaftaran statis untuk penerima siaran yang
mendengarkan maksud siaran khusus bersama "ACTION_SHOW_TOAST" dalam nama aksinya:
name penerima adalah nama modul ditambah nama subkelas BroadcastReceiver yang
didefinisikan di atas (AlarmReceiver).
Penerima tidak diekspor, berarti tidak ada aplikasi lain yang bisa mengirim siaran ke aplikasi ini.
Penerima menyertakan filter maksud yang memeriksa apakah maksud yang masuk menyertakan
aksi bernama ACTION_SHOW_TOAST.
<receiver
android:name="com.example.myproject.AlarmReceiver"
android:exported="false">
<intent-filter>
<action
android:name="com.example.myproject.intent.action.ACTION_SHOW_TOAST"/>
</intent-filter>
</receiver>
Filter maksud
Bila sistem menerima maksud implisit untuk memulai aktivitas, sistem akan menelusuri aktivitas
terbaik bagi maksud tersebut dengan membandingkannya dengan filter maksud, berdasarkan tiga
aspek:
Aksi: Apakah aksi yang ditetapkan dalam maksud cocok dengan salah satu nama <action> yang
tercantum dalam filter? Dalam contoh di atas, hanya maksud yang berisi ACTION_SHOW_TOAST
dalam nama aksinya yang akan cocok dengan filter tersebut.
Data: Apakah data dalam maksud cocok dengan salah satu tipe <data> yang tercantum dalam
filter?
Kategori: Apakah setiap kategori dalam maksud cocok dengan <category> yang namanya
disebutkan dalam filter?
Contoh ini menampilkan filter maksud bagi penerima yang mendengarkan perangkat untuk
menyelesaikan booting:
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
Untuk mengetahui selengkapnya tentang menggunakan filter maksud guna memilih maksud,
lihat bagian Resolusi Maksud pada panduan maksud.
Jika tidak ada filter maksud yang ditetapkan, penerima siaran hanya bisa diaktifkan dengan
maksud siaran eksplisit yang memberi nama komponen berdasarkan nama. (Tindakan ini mirip
dengan cara Anda meluncurkan aktivitas melalui nama kelasnya bersama maksud eksplisit.)
Jika Anda menggunakan pendaftaran statis untuk penerima siaran, sistem Android akan membuat
proses baru untuk menjalankan penerima siaran jika tidak ada proses berjalan yang dikaitkan
dengan aplikasi Anda. Ini berarti penerima akan merespons, sekalipun aplikasi Anda tidak
berjalan.
Pendaftaran dan menghapus pendaftaran dinamis
Anda juga bisa mendaftarkan penerima siaran secara dinamis, yang mengikat operasinya ke daur
hidup aktivitas. Untuk mendaftarkan penerima Anda secara dinamis, panggil
registerReceiver() dan teruskan objek BroadcastReceiver dan filter maksud. Misalnya:
unregisterReceiver(mReceiver);
Tempat Anda memanggil metode ini bergantung pada daur hidup yang diinginkan objek
BroadcastReceiver :
Jika penerima hanya diperlukan bila aktivitas terlihat (misalnya, untuk menonaktifkan fungsi
jaringan bila jaringan tidak tersedia), maka daftarkan penerima di onResume(). Hapus
pendaftaran penerima di onPause().
Anda juga bisa menggunakan pasangan metode onStart()/onStop() atau
onCreate()/onDestoy() , jika pasangan tersebut lebih tepat untuk kasus penggunaan Anda.
Panduan keamanan
Bila Anda menggunakan maksud siaran dan penerima siaran, informasi akan dikirim di antara
aplikasi, yang akan menimbulkan risiko keamanan. Untuk menghindari risiko ini, Anda bisa
menggunakan LocalBroadcastManager (dijelaskan di bawah ini), atau Anda bisa mengikuti
panduan ini:
Pastikan nama tindakan maksud dan string lainnya ada dalam namespace yang Anda miliki, jika
tidak maka Anda akan mengalami konflik dengan aplikasi lain secara tidak sengaja. Namespace
maksud bersifat global.
Bila Anda menggunakan registerReceiver(), aplikasi apa pun bisa mengirim siaran ke
penerima yang didaftarkan itu. Untuk mengontrol siapa yang bisa mengirimkan siaran, gunakan
izin yang dijelaskan di bawah ini.
Bila Anda mendaftarkan penerima siaran secara statis, aplikasi lainnya bisa mengirim siaran ke
penerima tersebut, filter apa pun yang Anda tetapkan. Untuk mencegah aplikasi lain mengirim
ke penerima tersebut, jadikan aplikasi itu tidak tersedia dengan android:exported="false".
Bila Anda menggunakan sendBroadcast() atau metode terkait, aplikasi lain akan bisa
menerima siaran Anda. Untuk mengontrol siapa saja yang bisa menerima siaran tersebut,
gunakan izin yang dijelaskan di bawah ini.
Untuk memberlakukan izin saat mengirim siaran, berikan argumen izin bukan-nol ke
sendBroadcast().
Hanya penerima yang telah diberi izin ini (dengan memintanya melalui tag <uses-
permission> di AndroidManifest.xml) yang akan bisa menerima siaran.
Untuk memberlakukan izin saat menerima siaran, berikan izin bukan-nol saat
mendaftarkan penerima Anda, baik saat memanggil registerReceiver() maupun
dalam tag statis <receiver> di AndroidManifest.xml.
Hanya penyiar yang telah diberi izin ini (dengan memintanya melalui tag <uses-
permission> di AndroidManifest.xml) yang akan bisa mengirimkan maksud ke
penerima. Penerima harus meminta izin di manifes, terlepas apakah pengirim didaftarkan
secara statis atau dinamis.
[LocalBroadcastManager]
Agar tidak perlu menangani aspek keamanan yang dijelaskan dalam Panduan keamanan,
gunakan kelas LocalBroadcastManager . LocalBroadcastManager memungkinkan Anda
mengirim dan menerima siaran dalam satu proses dan satu aplikasi, sehingga Anda tidak perlu
khawatir tentang keamanan lintas aplikasi.
Misalnya:
LocalBroadcastManager.getInstance(this).sendBroadcast(customBroadcastIntent);
Misalnya:
LocalBroadcastManager.getInstance(this).registerReceiver
(mReceiver, new IntentFilter(CustomReceiver.ACTION_CUSTOM_BROADCAST));
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Penerima Siaran
Ketahui selengkapnya
Referensi BroadcastReceiver
Panduan Maksud dan Filter Maksud
Referensi LocalBroadcastManager
7.4: Layanan
Materi:
Pengantar
Apa yang dimaksud dengan layanan?
Mendeklarasikan layanan di manifes
Layanan yang dimulai
Layanan terikat
Daur hidup layanan
Layanan latar depan
Layanan terjadwal
Ketahui Selengkapnya
Dalam bab ini, Anda akan mempelajari tentang berbagai tipe layanan, cara menggunakannya,
dan cara mengelola daur hidup layanan dalam aplikasi.
Layanan yang dimulai adalah layanan yang komponen aplikasinya memulai dengan
memanggil startService().
Gunakan layanan yang dimulai untuk tugas yang berjalan di latar belakang guna
menjalankan operasi yang berjalan lama. Selain itu, gunakan layanan yang dimulai untuk
tugas yang menjalankan pekerjaan untuk proses jarak jauh.
Layanan terikat adalah layanan yang komponen aplikasinya diikat ke dirinya sendiri
dengan memanggil bindService().
Gunakan layanan terikat untuk tugas yang berinteraksi dengan komponen aplikasi lain
guna menjalankan komunikasi interproses (IPC). Misalnya, layanan terikat mungkin
menangani transaksi jaringan, menjalankan I/O file, memutar musik, atau berinteraksi
dengan penyedia materi.
Catatan: Layanan berjalan di thread utama dari proses hosting-nya—layanan tidak membuat
thread sendiri dan tidak berjalan di proses terpisah kecuali jika Anda menetapkannya.
Jika layanan Anda akan melakukan pekerjaan yang banyak membutuhkan CPU atau operasi
pemblokiran (seperti pemutaran MP3 atau jaringan), buat thread baru dalam layanan untuk
melakukan pekerjaan itu. Dengan menggunakan thread terpisah, Anda akan mengurangi risiko
kesalahan Aplikasi Tidak Merespons (Application Not Responding/ANR) dan thread utama
aplikasi bisa terus disediakan untuk interaksi pengguna dengan aktivitas Anda.
Untuk memblokir akses ke layanan dari aplikasi lainnya, deklarasikan layanan sebagai privat.
Caranya, setel atribut android:exported ke false. Ini akan menghentikan aplikasi lain dari
memulai layanan Anda, bahkan bila menggunakan maksud eksplisit.
Setelah dimulai, layanan bisa berjalan di latar belakang tanpa dibatasi waktu, bahkan jika
komponen yang memulainya telah dimusnahkan. Biasanya, layanan yang dimulai menjalankan
operasi tunggal dan tidak mengembalikan hasil ke pemanggil. Misalnya, layanan dapat
mengunduh atau mengunggah file melalui jaringan. Bila operasi selesai, layanan harus berhenti
sendiri dengan memanggil stopSelf(), atau komponen lain bisa menghentikannya dengan
memanggil stopService().
Misalnya, anggaplah aktivitas perlu menyimpan data ke database online. Aktivitas akan memulai
layanan pendamping dengan meneruskan Intent ke startService(). Layanan menerima
maksud di onStartCommand(), menghubungkan ke Internet, dan menjalankan transaksi
database. Bila transaksi selesai, layanan akan menggunakan stopSelf() untuk menghentikan
dirinya sendiri dan dimusnahkan. (Ini adalah contoh layanan yang ingin Anda jalankan di thread
pekerja, sebagai ganti thread utama.)
IntentService
Sebagian besar layanan yang dimulai tidak perlu menangani beberapa permintaan secara
bersamaan, dan jika layanan melakukannya, maka akan mengakibatkan skenario multi-threading
yang berbahaya. Karena itu, sebaiknya Anda mengimplementasikan layanan menggunakan kelas
IntentService .
/**
* The IntentService calls this method from the default worker thread with
* the intent that started the service. When this method returns,
IntentService
* stops the service, as appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Restore interrupt status.
Thread.currentThread().interrupt();
}
}
}
Layanan terikat
Layanan "terikat" bila komponen aplikasi mengikatnya dengan memanggil bindService().
Layanan terikat menawarkan antarmuka klien-server yang memungkinkan komponen
berinteraksi dengan layanan, mengirim permintaan, dan mendapatkan hasil, kadang-kadang
menggunakan komunikasi interproses (IPC) untuk mengirim dan menerima informasi di seluruh
proses. Layanan terikat hanya berjalan selama komponen aplikasi terikat padanya. Beberapa
komponen bisa diikat ke layanan sekaligus, namun bila semuanya telah dilepas, layanan akan
dimusnahkan.
Untuk mengimplementasikan layanan terikat, definisikan antarmuka yang menetapkan cara klien
bisa berkomunikasi dengan layanan. Antarmuka ini, yang dikembalikan layanan Anda dari
metode callback onBind() , harus berupa implementasi IBinder.
Ada sejumlah cara untuk mengimplementasikan layanan terikat, dan implementasi tersebut lebih
rumit daripada layanan yang dimulai. Untuk detail selengkapnya tentang layanan terikat, lihat
Layanan Terikat.
Mengikat ke layanan
Perhatian: Jangan gunakan maksud implisit untuk mengikat ke layanan. Melakukannya adalah
bahaya keamanan, karena Anda tidak bisa memastikan layanan yang akan merespons maksud
tersebut, dan pengguna tidak bisa melihat layanan mana yang dimulai. Mulai dengan Android 5.0
(API level 21), sistem membuat pengecualian jika Anda memanggil bindService() dengan
Intent implisit.
@Override
public void onCreate() {
// The service is being created
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// The service is starting, due to a call to startService()
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
// A client is binding to the service with bindService()
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
// All clients have unbound with unbindService()
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
// A client is binding to the service with bindService(),
// after onUnbind() has already been called
}
@Override
public void onDestroy() {
// The service is no longer used and is being destroyed
}
}
Layanan terikat hanya tersedia untuk menyajikan komponen aplikasi yang terikat padanya,
sehingga bila tidak ada lagi komponen yang diikat ke layanan tersebut, sistem akan
memusnahkannya. Layanan terikat tidak perlu dihentikan secara eksplisit seperti halnya layanan
yang dimulai (menggunakan stopService() atau stopSelf()).
Diagram di bawah ini menampilkan perbandingan antara daur hidup layanan yang dimulai dan
terikat.
Misalnya, pemutar musik yang memutar musik dari layanan harus disetel untuk berjalan di latar
depan, karena pengguna mengetahui operasinya. Notifikasi di bilah status dapat menunjukkan
lagu saat ini dan memungkinkan pengguna meluncurkan aktivitas untuk berinteraksi dengan
pemutar musik.
Untuk meminta agar layanan berjalan di latar depan, panggil startForeground() sebagai ganti
startService(). Metode ini menggunakan dua parameter: integer yang secara unik
mengidentifikasi notifikasi dan Notification untuk bilah status. Notifikasi ini sedang
berlangsung, artinya tidak bisa ditutup. Notifikasi tetap berada di bilah status hingga layanan
dihentikan atau dibuang dari latar depan.
Misalnya:
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!");
startForeground(ONGOING_NOTIFICATION_ID, mBuilder.build());
Catatan: ID integer yang Anda berikan ke startForeground() tidak boleh 0.
Untuk membuang layanan dari latar depan, panggil stopForeground(). Metode ini memerlukan
boolean, yang menunjukkan apakah akan membuang notifikasi bilah status atau tidak. Metode
ini tidak menghentikan layanan. Akan tetapi, jika Anda menghentikan layanan sewaktu masih
berjalan di latar depan, maka notifikasi juga akan dibuang.
Layanan terjadwal
Untuk API level 21 dan yang lebih tinggi, Anda bisa meluncurkan layanan menggunakan
JobScheduler API. Untuk menggunakan JobScheduler, Anda perlu mendaftarkan tugas dan
menetapkan persyaratannya untuk jaringan dan pengaturan waktu. Sistem menjadwalkan tugas
untuk dieksekusi di waktu yang tepat.
Ketahui selengkapnya
Panduan layanan
Menjalankan Layanan Latar Belakang
8.1: Notifikasi
Materi:
Pengantar
Apa yang dimaksud dengan notifikasi?
Membuat notifikasi
Mengirim notifikasi
Mengosongkan notifikasi
Kompatibilitas notifikasi
Panduan desain notifikasi
Praktik terkait
Ketahui selengkapnya
Dalam bab ini, Anda akan mempelajari cara membuat, mengirim, dan menggunakan kembali
notifikasi, serta cara membuatnya kompatibel dengan versi Android yang berbeda.
Untuk melihat detail notifikasi, pengguna membuka panel samping notifikasi, atau menampilkan
notifikasi pada layar kunci jika perangkat terkunci. Area notifikasi, layar kunci, dan panel
samping notifikasi merupakan area yang dikontrol sistem yang bisa ditampilkan pengguna kapan
saja.
Tangkapan layar menampilkan panel samping notifikasi yang "terbuka". Bilah status tidak
terlihat, karena panel samping notifikasi terbuka.
Membuat notifikasi
Anda membuat notifikasi menggunakan kelas NotificationCompat.Builder . (Gunakan
NotificationCompat untuk kompatibilitas mundur terbaik. Untuk informasi selengkapnya, lihat
Kompatibilitas notifikasi.) Kelas pembangun menyederhanakan pembuatan objek yang
kompleks.
Saat menggunakan NotificationCompat.Builder, Anda harus menetapkan ikon kecil, teks untuk
judul, dan pesan notifikasi. Anda harus mempertahankan pesan notifikasi kurang dari 40 karakter
dan tidak mengulangi apa yang ada di judul. Misalnya:
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Dinner is ready!")
.setContentText("Lentil soup, rice pilaf, and cake for dessert.");
Anda juga perlu menyetel Intent yang menentukan apa yang terjadi bila pengguna mengeklik
notifikasi. Biasanya Intent ini mengakibatkan aplikasi meluncurkan Aktivitas.
Untuk memastikan sistem mengirimkan Intent bahkan bila aplikasi sedang tidak dijalankan bila
pengguna mengeklik notifikasi, bungkus Intent dalam objek PendingIntent , yang
memungkinkan sistem mengirimkan Intent apa pun keadaan aplikasi.
Untuk membuat instance PendingIntent, gunakan salah satu metode berikut, bergantung pada
bagaimana Anda ingin Intent yang dimuat akan dikirim:
Konteks aplikasi.
Kode permintaan, yang merupakan ID integer konstanta untuk PendingIntent.
Misalnya:
Komponen opsional
Tindakan notifikasi
Prioritas
Untuk opsi lainnya yang bisa Anda gunakan bersama notifikasi, lihat referensi
NotificationCompat.Builder .
Tindakan notifikasi
Aksi notifikasi adalah aksi yang bisa diambil pengguna pada notifikasi. Aksi tersedia melalui
tombol aksi di notifikasi. Seperti Intent yang menentukan apa yang terjadi bila pengguna
mengeklik notifikasi, aksi notifikasi menggunakan PendingIntent untuk melakukan aksi.
Sistem Android biasanya menampilkan aksi notifikasi berupa tombol yang berdekatan dengan isi
notifikasi. Mulai dengan Android 4.1 (API level 16), notifikasi mendukung ikon yang
disematkan di bawah teks isi, seperti yang ditampilkan dalam tangkapan layar di bawah ini.
1. Notifikasi ini memiliki dua tindakan yang bisa diambil pengguna, "Reply" atau "Archive". Masing-
masing memiliki ikon.
Untuk memastikan fungsionalitas tombol aksi selalu tersedia, ikuti petunjuk di bagian
Kompatibilitas notifikasi, di bawah ini.
Prioritas notifikasi
Untuk semua notifikasi yang tidak termasuk dalam salah satu prioritas
PRIORITY_DEFAULT
lain yang dijelaskan di sini.
mBuilder.setPriority(Notification.PRIORITY_HIGH);
Notifikasi bisa jadi mengganggu. Menggunakan prioritas notifikasi dengan benar adalah langkah
pertama untuk memastikan pengguna tidak mencopot pemasangan aplikasi Anda karena terlalu
mengganggu.
Mengintip
Notifikasi dengan prioritas HIGH atau MAX bisa mengintip, yang artinya bergeser sedikit ke dalam
tampilan di layar pengguna saat ini, aplikasi apa pun yang digunakan pengguna. Perhatikan, di
perangkat yang menjalankan Android 6.0 dan yang lebih tinggi, pengguna bisa memblokir
pengintipan dengan mengubah setelan "App notification" perangkat. Artinya Anda tidak bisa
mengandalkan pengintipan notifikasi, sekalipun Anda telah mempersiapkannya sedemikian rupa.
3. NotificationCompat.Builder mBuilder =
4. new NotificationCompat.Builder(this)
5. .setSmallIcon(R.drawable.notification_icon)
6. .setContentTitle("My notification")
7. .setContentText("Hello World!")
8. .setPriority(PRIORITY_HIGH)
9. .setDefaults(DEFAULTS_ALL);
Notifikasi di panel samping notifikasi muncul dalam dua layout utama, tampilan normal (yang
merupakan default) dan tampilan yang diluaskan. Notifikasi tampilan yang diluaskan
diperkenalkan dalam Android 4.1. Gunakan dengan hemat, karena tampilan tersebut
menggunakan lebih banyak ruang dan perhatian daripada layout tampilan normal.
Untuk membuat notifikasi muncul di layout yang diluaskan, gunakan salah satu kelas helper ini:
Notifikasi yang berlangsung adalah notifikasi yang tidak bisa ditutup oleh pengguna. Aplikasi
harus membatalkan notifikasi tersebut secara eksplisit dengan memanggil cancel() atau
cancelAll(). Membuat beberapa notifikasi yang berlangsung akan mengganggu pengguna
karena mereka tidak bisa membatalkan notifikasi tersebut. Gunakan notifikasi yang berlangsung
dengan hemat.
Untuk membuat notifikasi yang berlangsung, setel setOngoing() ke true. Gunakan notifikasi
yang berlangsung untuk menunjukkan tugas latar belakang yang aktif berinteraksi dengan
pengguna (seperti memainkan musik) atau tugas yang sedang berlangsung di perangkat
(misalnya pengunduhan file, operasi sinkronisasi, dan koneksi jaringan aktif).
Mengirim notifikasi
Gunakan kelas NotificationManager untuk mengirim notifikasi:
mNotifyManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
Penting: Jika notifikasi sebelumnya masih terlihat, sistem akan memperbaruinya dari isi objek
Notification. Jika notifikasi sebelumnya sudah ditutup, notifikasi baru akan dibuat.
Mengosongkan notifikasi
Notifikasi tetap terlihat hingga salah satu hal berikut terjadi:
Jika bisa dikosongkan, notifikasi akan menghilang bila pengguna menutupnya atau dengan
menggunakan "Clear All".
Jika Anda memanggil setAutoCancel() saat membuat notifikasi, notifikasi akan menghilang
bila pengguna mengekliknya.
Jika Anda memanggil cancel() untuk ID notifikasi tertentu, notifikasi akan menghilang.
Jika Anda memanggil cancelAll(), semua notifikasi yang telah dikeluarkan akan menghilang.
Karena notifikasi yang berlangsung tidak bisa ditutup oleh pengguna, aplikasi harus
membatalkannya dengan memanggil cancel() atau cancelAll().
Kompatibilitas notifikasi
Untuk memastikan kompatibilitas terbaik, buat notifikasi dengan NotificationCompat dan
subkelasnya, terutama NotificationCompat.Builder.
Ingatlah bahwa tidak semua fitur notifikasi tersedia untuk setiap versi Android, meskipun metode
untuk menyetelnya ada di kelas pustaka dukungan NotificationCompat.Builder. Misalnya,
layout tampilan yang diluaskan untuk notifikasi hanya tersedia di Android 4.1 dan yang lebih
tinggi, namun tombol aksi bergantung pada layout tampilan yang diluaskan. Artinya jika Anda
menggunakan tombol aksi notifikasi, tombol itu tidak akan ditampilkan di perangkat yang
menjalankan apa saja sebelum Android 4.1.
Untuk mengatasinya:
Jangan mengandalkan tombol aksi notifikasi untuk melakukan aksi notifikasi; sebagai
gantinya buatlah aksi yang tersedia di Aktivitas. Anda mungin perlu menambahkan
Aktivitas baru untuk melakukannya.
Misalnya, jika Anda menyetel aksi notifikasi yang menyediakan kontrol untuk
menghentikan dan memulai pemutaran media, pertama-tama implementasikan kontrol ini
dalam Aktivitas di aplikasi Anda.
Penggunaan addAction() untuk menambahkan fitur ke notifikasi jika perlu. Ingatlah bahwa
fungsionalitas apa pun yang ditambahkan juga harus tersedia di Aktivitas yang dimulai bila
pengguna mengeklik notifikasi.
Relevan: Tanyakan pada diri sendiri apakah informasi ini sangat penting untuk pengguna. Apa
yang terjadi jika mereka tidak mendapatkan notifikasi? Misalnya, acara kalender yang
dijadwalkan kemungkinan adalah relevan.
Tepat Waktu: Notifikasi perlu muncul ketika berguna. Misalnya, memberi tahu pengguna bila
tiba waktu untuk berangkat ke janji temu adalah hal yang berguna.
Singkat: Gunakan kata sesedikit mungkin. Sekarang, tantanglah diri sendiri untuk
mengatakannya dengan lebih sedikit.
Sediakan setelan di aplikasi Anda yang memungkinkan pengguna memilih jenis notifikasi yang
ingin diterima dan cara menerimanya.
Untuk mengetahui cara mendesain notifikasi dan interaksinya, lihat dokumentasi pola notifikasi
Desain Material.
Untuk mempelajari cara mendesain notifikasi dan interaksinya bagi versi Android yang lebih
lama, lihat Notifikasi, Android 4.4 dan yang lebih rendah.
Untuk detail penting tentang perubahan Desain Material yang diperkenalkan di Android 5.0 API
(level 21), lihat pelatihan Desain Material.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Notifikasi
Ketahui selengkapnya
Panduan
Notifikasi
Panduan desain notifikasi
Referensi
Referensi NotificationCompat.Builder
Referensi NotificationCompat.Style
Pengantar
Tipe alarm
Menjadwalkan alarm
Membatalkan alarm
Praktik terkait
Ketahui selengkapnya
Anda sudah mengetahui cara menggunakan penerima siaran untuk membuat aplikasi merespons
kejadian sistem bahkan bila aplikasi sedang tidak dijalankan. Dalam bab ini, Anda akan
mempelajari cara menggunakan alarm untuk menjadwalkan tugas selama waktu tertentu, baik
aplikasi dijalankan pada saat alarm disetel untuk aktif maupun tidak. Alarm bisa untuk sekali
penggunaan atau berulang. Misalnya, Anda bisa menggunakan alarm berulang untuk
menjadwalkan pengunduhan setiap hari pada waktu yang sama.
Untuk membuat alarm, gunakan kelas AlarmManager . Alarm di Android memiliki karakteristik
berikut:
Alarm memungkinkan Anda mengirim maksud pada waktu atau interval yang disetel. Anda bisa
menggunakan alarm bersama penerima siaran untuk memulai layanan dan menjalankan operasi
lainnya.
Alarm beroperasi di luar aplikasi, sehingga Anda bisa menggunakannya untuk memicu kejadian
atau tindakan bahkan saat aplikasi sedang tidak dijalankan, dan bahkan jika perangkat nonaktif.
Bila digunakan dengan benar, alarm bisa membantu Anda meminimalkan kebutuhan sumber
daya aplikasi. Misalnya, Anda bisa menjadwalkan operasi tanpa mengandalkan timer atau terus
menjalankan layanan latar belakang.
Untuk kejadian pengaturan waktu seperti tick dan waktu tunggu, dan untuk operasi berwaktu
yang dipastikan terjadi selama masa aplikasi Anda, gunakan kelas Handler bersama Timer dan
Thread. Pendekatan ini memberi Android kontrol yang lebih baik atas sumber daya sistem
daripada jika Anda menggunakan alarm.
Untuk operasi sinkronisasi server, gunakan SyncAdapter bersama Google Cloud Messaging
Service.
Untuk tugas yang bisa menunggu hingga kondisi memungkinkan, seperti bila perangkat
terhubung ke WiFi dan sedang mengisi daya (misalnya, memperbarui informasi cuaca atau kabar
berita), Anda mungkin tidak ingin menggunakan alarm. Untuk tugas ini di perangkat API 21+,
pertimbangkan penggunaan JobScheduler, yang akan Anda pelajari di pelajaran mendatang.
Tipe alarm
Ada dua tipe alarm umum di Android: alarm waktu tempuh riil serta alarm jam real-time (RTC),
dan keduanya menggunakan objek PendingIntent .
Alarm waktu tempuh riil menggunakan waktu, dalam milidetik, sejak perangkat melakukan
booting. Alarm waktu tempuh riil tidak terpengaruh oleh zona waktu, sehingga bekerja dengan
baik untuk alarm berdasarkan waktu yang telah ditempuh. Misalnya, gunakan alarm waktu
tempuh riil untuk alarm yang aktif setiap setengah jam.
Alarm jam real-time (RTC) adalah alarm berbasis jam yang menggunakan Coordinated Universal
Time (UTC). Hanya pilih alarm RTC dalam tipe situasi ini:
Anda perlu alarm yang dipicu pada waktu tertentu dalam sehari.
Waktu alarm bergantung pada lokal saat ini.
Aplikasi dengan alarm berbasis jam mungkin tidak berfungsi dengan baik di seluruh lokal,
karena mungkin akan terpicu pada waktu yang salah. Dan jika pengguna mengubah setelan
waktu perangkat, maka hal itu bisa menyebabkan perilaku yang tidak diharapkan di aplikasi
Anda.
RTC: Akan memicu maksud yang menunggu pada waktu yang ditetapkan, namun tidak
membangunkan perangkat. Semua alarm berulang akan terpicu bila perangkat bangun pada
waktu berikutnya.
RTC_WAKEUP: Akan memicu maksud yang menunggu pada waktu yang ditetapkan, yang
membangunkan CPU perangkat jika layar mati.
Untuk menghindari masalah ini dan masalah lainya, ikuti praktik terbaik ini:
Tambahkan keacakan (jitter) ke permintaan jaringan yang terpicu akibat alarm berulang. Inilah
satu cara untuk melakukannya:
o Jadwalkan alarm pasti yang menjalankan suatu pekerjaan lokal. "Pekerjaan lokal" berarti
sesuatu yang tidak menghubungi server melalui jaringan atau memerlukan data dari
server.
o Jadwalkan alarm terpisah yang berisi permintaan jaringan, dan setel alarm ini agar
terpicu setelah periode waktu acak. Biasanya alarm kedua ini disetel oleh komponen apa
pun yang menerima PendingIntent dari alarm pertama. (Anda juga bisa menyetel
alarm ini pada waktu yang sama seperti alarm pertama.)
Gunakan pengaturan waktu yang paling tidak akurat untuk memungkinkan AlarmManager
menjadi yang paling efisien. Misalnya, bila Anda menjadwalkan alarm berulang, gunakan
setInexactRepeating() sebagai ganti setRepeating(). Untuk detailnya, lihat
Menjadwalkan alarm berulang, di bawah ini.
Hindari mendasarkan alarm pada waktu jam dan gunakan ELAPSED_REALTIME untuk alarm
berulang bila memungkinkan. Alarm berulang yang berdasarkan pada waktu pemicu akurat tidak
akan menskalakan dengan baik.
Menjadwalkan alarm
Kelas AlarmManager memberi Anda akses ke layanan alarm sistem Android. AlarmManager
memungkinkan Anda menyiarkan Intent pada waktu yang dijadwalkan, atau setelah interval
tertentu.
o RTC atau RTC_WAKEUP, yang dijelaskan di Alarm jam real-time (RTC) di atas.
Objek PendingIntent , yakni cara Anda menetapkan tugas yang akan dijalankan pada waktu
yang diberikan.
Untuk menjadwalkan satu alarm, gunakan salah satu metode berikut ini di instance
AlarmManager :
set(): Untuk perangkat yang menjalankan API 19+, metode ini menjadwalkan satu alarm
berwaktu tidak pasti, maksudnya, sistem akan menggeser alarm untuk meminimalkan
membangunkan dan penggunaan baterai. Untuk perangkat yang menjalankan versi API lebih
rendah, metode ini menjadwalkan alarm yang berwaktu pasti.
setWindow(): Untuk perangkat yang menjalankan API 19+, gunakan metode ini untuk menyetel
jangka waktu untuk memicu alarm.
setExact(): Untuk perangkat yang menjalankan API 19+, metode ini memicu alarm pada
waktu yang pasti. Gunakan metode ini hanya untuk alarm yang harus dipicu pada waktu yang
pasti, misalnya jam alarm yang berdering pada waktu yang diminta. Alarm pasti akan
mengurangi kemampuan OS untuk meminimalkan penggunaan baterai, jadi jangan
menggunakannya jika tidak diperlukan.
Inilah contoh penggunaan set() untuk menjadwalkan alarm sekali-pakai:
alarmMgr.set(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000*300,
alarmIntent);
Kelas type adalah ELAPSED_REALTIME, yang berarti bahwa ini adalah alarm waktu tempuh riil.
Jika perangkat sedang tidak digunakan saat alarm dikirim, alarm tidak akan membangunkan
perangkat.
Alarm dikirim 5 menit (300.000 milidetik) setelah metode dikembalikan.
alarmIntent adalah siaran PendingIntent berisi aksi yang akan dijalankan ketika alarm
dikirim.
Catatan: Untuk operasi pengaturan waktu seperti tick dan waktu tunggu, serta kejadian yang
lebih dari sekali dalam satu menit, akan lebih mudah dan efisien menggunakan Penangan
daripada alarm.
Perangkat API 23+ kadang-kadang masuk ke mode Istirahatkan atau Aplikasi Siaga untuk
menghemat daya:
Mode Istirahatkan dipicu bila pengguna meninggalkan perangkat yang stekernya tidak
terhubung dan tidak bergerak selama periode waktu tertentu, dengan layar dimatikan. Selama
"masa pemeliharaan" singkat, sistem akan keluar dari Istirahatkan untuk memungkinkan aplikasi
menyelesaikan aktivitas yang ditangguhkan, termasuk memicu alarm standar, kemudian kembali
ke Istirahatkan. Mode Istirahatkan berakhir bila pengguna kembali ke perangkat mereka.
Mode Aplikasi Siaga dipicu pada aplikasi diam yang tidak digunakan baru-baru ini. Mode Aplikasi
Siaga berakhir bila pengguna kembali ke aplikasi atau menghubungkan steker di perangkat.
Jika Anda memerlukan alarm yang terpicu saat perangkat berada dalam mode Istrahatkan atau
Aplikasi Siaga tanpa menunggu masa pemeliharaan, gunakan setAndAllowWhileIdle()
untuk alarm tidak pasti dan setExactAndAllowWhileIdle() untuk alarm pasti, atau setel
alarm yang terlihat pengguna (API 21+).
Beberapa alarm bisa menunggu masa pemeliharaan, atau hingga perangkat keluar dari mode
Istirahatkan atau Aplikasi Siaga. Untuk alarm ini, gunakan metode set() dan setExact()
standar untuk mengoptimalkan daya tahan baterai.
Anda juga bisa menggunakan AlarmManager untuk menjadwalkan alarm berulang, dengan
menggunakan salah satu metode berikut:
setRepeating(): Sebelum Android 4.4 (API Level 19), metode ini akan membuat alarm
berulang dengan waktu yang pasti. Pada perangkat yang menjalankan API 19 dan yang lebih
tinggi, perilaku setRepeating() benar-benar seperti setInexactRepeating().
setInexactRepeating(): Metode ini membuat alarm tidak pasti berulang yang
memungkinkan batch. Bila Anda menggunakan setInexactRepeating(), Android akan
menyinkronkan alarm berulang untuk beberapa aplikasi dan memicunya pada waktu yang sama.
Hal ini mengurangi jumlah total waktu yang digunakan sistem untuk membangunkan perangkat,
sehingga mengurangi konsumsi daya baterai. Seperti pada API 19, semua alarm berulang adalah
alarm tidak pasti.
Jika Anda benar-benar memerlukan alarm pasti yang berulang pada API 19+, setel alarm sekali-
pakai dengan setExact() dan setel alarm berikutnya setelah alarm itu dipicu. Alarm kedua ini
disetel oleh komponen apa pun yang menerima PendingIntent—biasanya layanan atau
penerima siaran.
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
AlarmManager.INTERVAL_FIFTEEN_MINUTES,
alarmIntent);
Dalam hal ini, type adalah RTC_WAKEUP, berarti alarm ini adalah alarm berbasis jam yang
membangunkan perangkat bila alarm telah dikirim.
Kekerapan alarm pertama dikirim segera, karena calendar.getTimeInMillis()
mengembalikan waktu saat ini sebagai UTC milidetik.
alarmIntent adalah PendingIntent yang berisi aksi untuk dijalankan bila alarm telah
dikirim. Maksud ini biasanya berasal dari IntentSender.getBroadcast().
1. Buat PendingIntent yang berisi Intent serupa yang digunakan untuk menyetel alarm,
namun kali ini menggunakan flag FLAG_NO_CREATE .
Dengan FLAG_NO_CREATE, PendingIntent hanya dibuat jika sudah ada yang berisi
Intent yang sama. Jika tidak maka permintaan akan mengembalikan nol.
o Jika bukan null, maka PendingIntent sudah ada, berarti alarm telah disetel.
Misalnya, kode berikut akan mengembalikan true jika alarm yang dimuat dalam alarmIntent
sudah ada:
boolean alarmExists =
(PendingIntent.getBroadcast(this, 0,
alarmIntent,
PendingIntent.FLAG_NO_CREATE) != null);
Membatalkan alarm
Untuk membatalkan alarm, gunakan cancel() dan teruskan di PendingIntent. Misalnya:
alarmManager.cancel(alarmIntent);
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Alarm Manager
Ketahui selengkapnya
Panduan Menjadwalkan Alarm Berulang
Referensi AlarmManager
Pemuatan dini
JobScheduler
Praktik terkait
Ketahui selengkapnya
Mentransfer data merupakan bagian penting dari sebagian besar aplikasi Android, namun hal ini
bisa berpengaruh negatif pada daya tahan baterai dan meningkatkan biaya penggunaan data.
Penggunaan radio nirkabel untuk mentransfer data berpotensi menjadi salah satu sumber paling
signifikan penguras baterai aplikasi Anda.
Pengguna peduli terhadap konsumsi daya baterai karena lebih suka menggunakan perangkat
seluler tanpa menghubungkannya ke pengisi daya. Pengguna juga peduli terhadap penggunaan
data, karena setiap bit data yang ditransfer bisa menghabiskan biaya.
Dalam bab ini, Anda mempelajari cara aktivitas jaringan di aplikasi memengaruhi perangkat
keras radio di perangkat sehingga Anda bisa meminimalkan konsumsi daya baterai yang terkait
dengan aktivitas jaringan. Anda juga akan mempelajari cara menunggu kondisi yang tepat untuk
menyelesaikan tugas yang banyak menggunakan sumber daya.
1. Daya penuh: Digunakan bila koneksi aktif. Memungkinkan perangkat mentransfer data dengan
kecepatan tertinggi.
2. Daya rendah: Status menengah yang menggunakan baterai kurang dari 50%.
3. Siaga: Keadaan energi minimum, selama tidak ada koneksi jaringan yang aktif atau dibutuhkan.
Walaupun keadaan rendah dan siaga menggunakan baterai lebih sedikit, keadaan tersebut juga
menimbulkan latensi pada permintaan jaringan. Kembali ke daya penuh dari keadaan rendah
memerlukan waktu sekitar 1,5 detik, sedangkan beralih dari siaga ke penuh bisa memerlukan
waktu lebih dari 2 detik.
Android menggunakan mesin keadaan untuk menentukan cara transisi antar keadaan. Untuk
meminimalkan latensi, mesin keadaan akan menunggu sebentar sebelum transisi ke keadaan
energi yang lebih rendah.
Mesin keadaan radio pada setiap perangkat, khususnya penundaan transisi terkait ("waktu ekor")
dan latensi startup, bervariasi berdasarkan teknologi radio nirkabel yang digunakan (2G, 3G,
LTE, dll.) dan didefinisikan serta dikonfigurasi oleh jaringan operator yang digunakan perangkat
untuk beroperasi.
Bab ini menjelaskan mesin keadaan representatif untuk radio nirkabel 3G pada umumnya,
berdasarkan data yang disediakan oleh AT&T. Akan tetapi, prinsip umum dan praktik terbaik
yang dihasilkan berlaku untuk semua implementasi radio nirkabel.
Seperti halnya praktik terbaik, ada konsekuensi yang perlu dipertimbangkan untuk development
aplikasi Anda sendiri.
Aplikasi yang mentransfer data yang tidak dibundel selama 1 detik setiap 18 detik akan membuat
radio nirkabel selalu aktif.
Sebagai perbandingan, aplikasi serupa yang membundel transfer selama 3 detik setiap menit
akan membuat radio dalam keadaan daya tinggi hanya selama 8 detik, dan dalam keadaan daya
rendah selama 12 detik lagi.
Contoh kedua memungkinkan radio dalam keadaan diam selama 40 detik setiap menitnya, yang
menghasilkan pengurangan besar dalam konsumsi daya baterai.
Membundel dan mengantre transfer data Anda adalah hal penting. Anda bisa membundel transfer
yang dijadwalkan terjadi dalam suatu jangka waktu dan membuat semuanya terjadi secara
bersamaan, sehingga memastikan radio mengonsumsi daya dalam waktu sesedikit mungkin.
Pemuatan dini
Pemuatan dini untuk data berarti aplikasi Anda akan memperkirakan isi atau data berikutnya
yang diinginkan pengguna, dan memuatnya lebih dini. Misalnya, bila pengguna memperhatikan
bagian pertama artikel, perkiraan yang baik adalah memuat dini bagian berikutnya. Atau, jika
pengguna sedang menonton video, memuat dini menit video berikutnya juga merupakan
perkiraan yang baik.
Pemuatan dini atas data adalah cara efektif untuk mengurangi jumlah sesi transfer data
independen. Pemuatan dini memungkinkan Anda mengunduh semua data yang mungkin
diperlukan untuk jangka waktu tertentu dalam rentetan tunggal, melalui koneksi tunggal, pada
kapasitas penuh. Hal ini mengurangi jumlah aktivasi radio yang diperlukan untuk mengunduh
data. Akibatnya, Anda tidak hanya menghemat daya tahan baterai, melainkan juga meningkatkan
latensi bagi pengguna, mengurangi bandwidth yang diperlukan, dan mengurangi waktu
pengunduhan.
Pemuatan dini memiliki konsekuensi. Jika mengunduh terlalu banyak atau data yang salah, Anda
bisa menambah konsumsi daya baterai. Dan jika mengunduh pada waktu yang salah, bisa
membuat pengguna menunggu. Mengoptimalkan data pemuatan dini merupakan topik tingkat
lanjutan yang tidak dibahas dalam kursus ini, namun panduan berikut akan membahas situasi
umum.
Seberapa agresif pemuatan dini akan bergantung pada ukuran data yang diunduh dan
kemungkinan akan digunakannya. Sebagai panduan kasar, berdasarkan pada mesin keadaan yang
dijelaskan di atas, untuk data yang memiliki peluang akan digunakan sebesar 50% dalam sesi
pengguna saat ini, Anda biasanya bisa memuat dini selama sekitar 6 detik (sekitar 1-2 Mb)
sebelum potensi biaya mengunduh data yang tidak digunakan cocok dengan potensi
penghematan dari tidak memulai pengunduhan data itu.
Secara umum, inilah praktik yang baik untuk memuat dini data sehingga Anda hanya perlu
memulai pengunduhan lain setiap 2 hingga 5 menit, dan secara berurutan 1 hingga 5 megabyte.
Dengan mengikuti prinsip ini, pengunduhan besar—seperti file video—harus diunduh berupa
potongan kecil dengan interval teratur (setiap 2 hingga 5 menit), sehingga pemuatan dini secara
efektif hanya untuk data video yang mungkin akan ditampilkan dalam beberapa menit
berikutnya.
Banyak aplikasi berita yang berupaya mengurangi bandwidth dengan mengunduh berita utama
hanya setelah kategori dipilih, artikel lengkap hanya bila pengguna ingin membacanya, dan
gambar kecil sama seperti mereka menggulir ke tampilan.
Dengan menggunakan pendekatan ini, radio dipaksa untuk tetap aktif bagi sebagian besar sesi
pembacaan berita saat pengguna menggulir berita utama, mengubah kategori, dan membaca
artikel. Tidak hanya itu, namun peralihan terus-menerus di antara keadaan energi mengakibatkan
latensi yang signifikan saat beralih kategori atau membaca artikel.
Inilah pendekatan yang lebih baik:
1. Memuat dini sejumlah data yang wajar pada startup, dimulai dengan serangkaian pertama judul
berita dan gambar kecil. Proses ini memastikan waktu startup yang cepat.
2. Lanjutkan dengan judul berita selebihnya, gambar kecil selebihnya, dan teks artikel untuk setiap
artikel dari rangkaian judul berita pertama.
Radio nirkabel menggunakan beragam jumlah daya baterai yang bergantung pada teknologi, dan
semakin besar bandwidth semakin banyak konsumsi energi. Bandwidth lebih tinggi berarti Anda
bisa memuat dini secara lebih agresif, sehingga mengunduh data lebih banyak dalam waktu yang
sama. Akan tetapi, mungkin kurang intuitif, karena biaya baterai waktu ekor relatif lebih tinggi,
juga lebih efisien untuk membuat radio tetap aktif dalam jangka waktu yang lebih lama untuk
setiap sesi transfer guna mengurangi frekuensi pembaruan.
Radio WiFi menggunakan daya baterai jauh lebih sedikit daripada nirkabel dan menawarkan
bandwidth yang lebih besar.
Anda bisa menggunakan ConnectivityManager untuk menentukan radio nirkabel yang aktif
dan memodifikasi rutinitas pemuatan dini dengan bergantung pada tipe jaringan:
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
TelephonyManager tm =
(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
switch (activeNetwork.getType()) {
case (ConnectivityManager.TYPE_WIFI):
PrefetchCacheSize = MAX_PREFETCH_CACHE; break;
case (ConnectivityManager.TYPE_MOBILE): {
switch (tm.getNetworkType()) {
case (TelephonyManager.NETWORK_TYPE_LTE |
TelephonyManager.NETWORK_TYPE_HSPAP):
PrefetchCacheSize *= 4;
break;
case (TelephonyManager.NETWORK_TYPE_EDGE |
TelephonyManager.NETWORK_TYPE_GPRS):
PrefetchCacheSize /= 2;
break;
default: break;
}
break;
}
default: break;
}
Sistem akan mengirimkan maksud siaran bila keadaan konektivitas berubah, sehingga Anda bisa
mendengarkan perubahan ini dengan menggunakan BroadcastReceiver.
Dalam hal ini, BatteryManager akan menyiarkan semua detail baterai dan pengisian daya dalam
Intent siaran yang menyertakan status pengisian daya.
Jika Anda ingin bereaksi terhadap perubahan keadaan pengisian baterai, gunakan
BroadcastReceiver yang didaftarkan untuk tindakan status baterai:
<receiver android:name=".PowerConnectionReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
Maksud siaran juga dikirim bila level baterai berubah dengan cara signifikan:
"android.intent.action.BATTERY_LOW"
"android.intent.action.BATTERY_OKAY"
JobScheduler
Terus-menerus memantau konektivitas dan status baterai perangkat bisa menjadi suatu tantangan,
dan itu mengharuskan penggunaan komponen seperti penerima siaran, yang bisa mengonsumsi
sumber daya sistem bahkan bila aplikasi sedang tidak dijalankan. Karena mentransfer data secara
efisien merupakan tugas umum, Android SDK menyediakan kelas yang memudahkannya:
JobScheduler.
Diperkenalkan dalam API level 21, JobScheduler memungkinkan Anda menjadwalkan tugas
dengan ketentuan tertentu (bukan waktu tertentu seperti pada AlarmManager).
Catatan: JobScheduler hanya tersedia mulai API 21+. Tidak ada versi kompabilitas mundur
untuk sebelum API rilis. Jika aplikasi menargetkan perangkat dengan API level sebelumnya, Anda
mungkin akan merasakan manfaat FirebaseJobDispatcher alternatif.
1. JobInfo
Setel ketentuan tugas dengan membuat objek JobInfo menggunakan kelas JobInfo.Builder .
Kelas JobInfo.Builder adalah instance yang dibuat dari konstruktor yang membutuhkan dua
argumen: ID tugas (yang bisa digunakan untuk membatalkan tugas), dan ComponentName
JobService yang berisi tugas. JobInfo.Builder harus menyetel setidaknya satu, ketentuan
non-default untuk tugas. Misalnya:
Kelas JobInfo.Builder memiliki banyak metode set() yang memungkinkan Anda untuk
menentukan ketentuan tugas. Di bawah ini adalah daftar batasan yang tersedia bersama masing-
masing metode set() dan kontanta kelasnya:
Kebijakan Backoff/Coba Ulang: Menentukan waktu dan cara menjadwalkan ulang tugas jika
gagal. Setel ketentuan ini menggunakan metode setBackoffCriteria() , yang menggunakan
dua argumen: waktu awal untuk menunggu setelah tugas gagal, dan strategi backoff. Argumen
strategi backoff bisa berupa satu dari dua konstanta: BACKOFF_POLICY_LINEAR atau
BACKOFF_POLICY_EXPONENTIAL. Default-nya adalah {30 seconds, Exponential}.
Latensi Minimum: Jumlah waktu tunggu minimum sebelum menyelesaikan tugas. Setel
ketentuan ini menggunakan metode setMinimumLatency() yang memerlukan argumen
tunggal: jumlah waktu tunggu dalam milidetik.
Ganti Batas Waktu: Waktu tunggu maksimum sebelum menjalankan tugas, bahkan jika
ketentuan lain tidak terpenuhi. Setel ketentuan ini menggunakan metode
setOverrideDeadline() yang merupakan waktu tunggu maksimum dalam milidetik.
Periodik: Mengulangi tugas setelah jumlah waktu tertentu. Setel ketentuan ini menggunakan
metode setPeriodic() dengan meneruskan interval pengulangan. Ketentuan ini saling
eksklusif dengan latensi minimum dan menggantikan ketentuan batas waktu: menyetel
setPeriodic() dengan salah satu ketentuan ini akan mengakibatkan kesalahan.
Bertahan: Menyetel apakah tugas dipertahankan saat boot ulang sistem. Agar ketentuan ini
bekerja, aplikasi Anda harus memiliki izin RECEIVE_BOOT_COMPLETED . Setel ketentuan ini
menggunakan metode setPersisted() dengan meneruskan boolean yang menunjukkan
apakah akan mempertahankan tugas atau tidak.
Tipe Jaringan yang Diperlukan: Tipe jaringan yang diperlukan tugas Anda. Jika jaringan tidak
diperlukan, Anda tidak perlu memanggil fungsi ini, karena default-nya adalah
NETWORK_TYPE_NONE. Setel ketentuan ini menggunakan metode
setRequiredNetworkType() dengan meneruskan salah satu konstanta berikut:
NETWORK_TYPE_NONE, NETWORK_TYPE_ANY, NETWORK_TYPE_NOT_ROAMING,
NETWORK_TYPE_UNMETERED.
Keadaan Pengisian Daya yang Diperlukan: Apakah steker perangkat perlu dihubungkan atau
tidak untuk menjalankan tugas ini. Setel ketentuan ini menggunakan metode
setRequiresCharging() dengan meneruskan boolean. Default-nya adalah false.
Mengharuskan Perangkat Diam: Apakah perangkat harus dalam mode diam untuk menjalankan
tugas ini. "Mode diam" berarti perangkat tidak digunakan dan belum digunakan selama
beberapa waktu, seperti yang didefinisikan secara bebas oleh sistem. Bila perangkat dalam mode
diam, inilah waktu yang tepat untuk menjalankan tugas yang banyak menggunakan sumber
daya. Setel ketentuan ini menggunakan metode setRequiresDeviceIdle() dengan
meneruskan boolean. Default-nya adalah false.
2. JobService
Setelah ketentuan tugas terpenuhi, kerangka kerja akan meluncurkan subkelas JobService, yang
merupakan tempat Anda mengimplementasikan tugas itu sendiri. JobService berjalan pada
thread UI, sehingga Anda perlu memindahkan operasi pemblokiran ke thread pekerja.
<service android:name="MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
onStartJob()
Sistem akan memanggil onStartJob() dan secara otomatis meneruskan sebuah objek
JobParameters , yang dibuat sistem dengan informasi tentang tugas Anda. Jika tugas Anda
berisi operasi yang berjalan lama, pindahkan pekerjaan ke thread terpisah. Metode
onStartJob() mengembalikan boolean: true jika tugas sudah dipindahkan ke thread terpisah
(artinya mungkin belum selesai) dan false jika tidak ada tugas lain yang harus diselesaikan.
Gunakan metode jobFinished() dari thread apa pun untuk memberi tahu sistem bahwa tugas
Anda selesai. Metode ini memerlukan dua parameter: objek JobParameters yang berisi
informasi tentang tugas, dan boolean yang menunjukkan apakah tugas perlu dijadwal ulang,
sesuai dengan kebijakan backoff yang didefinisikan.
onStopJob()
Sistem akan memanggil onStopJob() jika ini menentukan bahwa Anda harus menghentikan
eksekusi tugas bahkan sebelum Anda memanggil jobFinished(). Ini terjadi jika persyaratan
yang Anda tetapkan saat menjadwalkan tugas tidak lagi dipenuhi.
Contoh:
Anda bertanggung jawab atas perilaku aplikasi saat menerima onStopJob(), jadi jangan
abaikan. Metode ini mengembalikan boolean, yang menunjukkan apakah Anda ingin menjadwal
ulang tugas berdasarkan kebijakan backoff yang didefinisikan, atau melepaskan tugas.
3. JobScheduler
Bagian akhir penjadwalan tugas adalah menggunakan kelas JobScheduler untuk menjadwalkan
tugas. Untuk mendapatkan instance kelas ini, panggil
getSystemService(JOB_SCHEDULER_SERVICE). Kemudian jadwalkan tugas menggunakan
metode schedule() , dengan meneruskan objek JobInfo yang Anda buat dengan
JobInfo.Builder. Misalnya:
mScheduler.schedule(myJobInfo);
Kerangka kerja tahu tentang kapan Anda menerima callback, dan mencoba untuk menggabung
dan menangguhkannya sebanyak mungkin. Biasanya, jika Anda tidak menetapkan batas waktu
tugas, sistem bisa menjalankannya kapan saja, bergantung pada keadaan saat ini dari antrean
internal objek JobScheduler ; akan tetapi, mungkin akan ditangguhkan hingga saat berikutnya
perangkat dihubungkan ke sumber daya.
Untuk membatalkan tugas, panggil cancel(), dengan meneruskan ID tugas dari objek
JobInfo.Builder , atau panggil cancelAll(). Misalnya:
mScheduler.cancelAll();
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
JobScheduler
Ketahui selengkapnya
Panduan Mentransfer Data Tanpa Menguras Baterai
Panduan Mengoptimalkan Pengunduhan Agar Akses Jaringan Efisien
Referensi JobScheduler
Referensi JobService
Referensi JobInfo
Referensi JobInfo.Builder
Referensi JobParameters
Preferensi bersama
File
Database SQLite
Opsi storage lain
Koneksi jaringan
Mencadangkan data aplikasi
Firebase
Ketahui selengkapnya
Android menyediakan sejumlah opsi bagi Anda untuk menyimpan data aplikasi yang persisten.
Solusi yang dipilih bergantung pada kebutuhan khusus Anda, misalnya apakah data harus bersifat
privat untuk aplikasi Anda atau bisa diakses oleh aplikasi lainnya (dan pengguna) serta berapa
banyak ruang yang diperlukan data.
Preferensi bersama
Menggunakan preferensi bersama adalah cara untuk membaca dan menulis pasangan nilai-kunci
informasi secara persisten ke dan dari suatu file.
Catatan:Secara default, pasangan nilai-kunci ini tidak digunakan bersama, bukan pula
preferensi, jadi jangan mencampuradukkannya dengan Preference API.
File
Android menggunakan sistem file yang serupa dengan sistem file berbasis disk pada platform
lainnya seperti Linux. Operasi berbasis disk tentunya familier bagi setiap orang yang telah
menggunakan I/O file Linux atau paket java.io.
Semua perangkat Android memiliki dua area file-storage: storage “internal” dan “eksternal”.
Nama-nama ini berasal dari masa awal Android, saat kebanyakan perangkat menawarkan
memori bawaan non-volatil (penyimpanan internal), plus media storage lepas-pasang seperti
kartu micro-SD (penyimpanan eksternal).
Saat ini, beberapa perangkat membagi ruang storage permanen menjadi partisi "internal" dan
"eksternal", sehingga walaupun tanpa media storage lepas-pasang, selalu ada dua ruang storage dan
perilaku API sama, ada atau tidak ada penyimpanan eksternal. Daftar berikut merangkum fakta tentang
setiap ruang storage.
Penyimpanan internal
Anda tidak memerlukan izin apa pun untuk menyimpan file pada penyimpanan internal. Aplikasi
Anda selalu memiliki izin untuk membaca dan menulis file dalam direktori penyimpanan
internalnya.
Untuk membuat file baru di salah satu direktori ini, Anda bisa menggunakan konstruktor File(),
meneruskan File yang disediakan oleh salah satu metode di atas yang menetapkan direktori
penyimpanan internal Anda. Misalnya:
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Atau, jika Anda perlu menyimpan beberapa file ke cache, lebih baik gunakan createTempFile().
Misalnya, metode berikut akan mengekstrak nama file dari URL dan membuat file dengan nama
itu dalam direktori cache internal aplikasi Anda:
Penyimpanan eksternal
Gunakan penyimpanan eksternal untuk file yang harus disimpan secara permanen, bahkan jika
aplikasi Anda dicopot pemasangannya, dan tersedia bebas untuk pengguna dan aplikasi lainnya,
seperti foto, gambar, atau dokumen yang dibuat oleh aplikasi.
Beberapa file privat yang tidak memiliki nilai bagi aplikasi lain juga bisa disimpan pada
penyimpanan eksternal. File semacam itu bisa berupa sumber daya aplikasi tambahan yang telah
diunduh, atau file media sementara. Pastikan menghapusnya bila aplikasi Anda telah dicopot
pemasangannya.
<manifest ...>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
Jika aplikasi Anda perlu membaca penyimpanan eksternal (namun bukan menulisnya), maka
Anda perlu mendeklarasikan izin READ_EXTERNAL_STORAGE.
<manifest ...>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
</manifest>
Karena penyimpanan eksternal mungkin tidak tersedia—seperti saat pengguna telah memasang
storage ke PC atau telah melepas kartu SD yang menyediakan penyimpanan eksternal—Anda
harus selalu memverifikasi apakah volume tersedia sebelum mengaksesnya. Anda bisa membuat
kueri status penyimpanan eksternal dengan memanggil getExternalStorageState(). Jika keadaan
yang dikembalikan sama dengan MEDIA_MOUNTED, maka Anda bisa membaca dan menulis
file. Misalnya, metode berikut ini berguna untuk menentukan ketersediaan storage:
Penyimpanan eksternal berstruktur sangat spesifik dan digunakan oleh sistem Android. Ada
beberapa direktori publik dan direktori privat yang khusus untuk aplikasi Anda. Setiap pohon file
ini memiliki tiga direktori yang diidentifikasi melalui konstanta sistem.
Misalnya, setiap file yang Anda simpan ke dalam direktori nada dering publik
DIRECTORY_RINGTONES akan tersedia untuk semua aplikasi nada dering lainnya.
Sebaliknya, setiap file yang Anda simpan dalam direktori nada dering privat
DIRECTORY_RINGTONES, secara default, hanya bisa dilihat oleh aplikasi Anda dan akan
dihapus bersama aplikasi.
Untuk mengakses direktori penyimpanan eksternal publik, dapatkan sebuah jalur dan buat file
yang memanggil getExternalStoragePublicDirectory().
Untuk mengakses direktori penyimpanan eksternal pribadi, dapatkan sebuah jalur dan file yang
memanggil getExternalFilesDir().
Jika sudah mengetahui jumlah data yang disimpan, Anda bisa mengetahui apakah tersedia ruang
yang cukup tanpa menyebabkan IOException dengan memanggil getFreeSpace() atau
getTotalSpace(). Setiap metode ini memberitahukan ruang yang tersedia saat ini dan total ruang
di volume storage.
Anda tidak harus memeriksa jumlah ruang yang tersedia sebelum menyimpan file. Sebagai
gantinya, Anda bisa langsung mencoba menulis file, kemudian menangkap IOException jika
terjadi. Anda mungkin perlu melakukannya jika tidak mengetahui secara persis jumlah ruang
yang diperlukan.
Menghapus file
Anda harus selalu menghapus file yang tidak lagi diperlukan. Cara paling langsung untuk
menghapus file adalah membuat referensi file yang telah dibuka memanggil delete()pada dirinya
sendiri.
myFile.delete();
Jika file disimpan pada penyimpanan internal, Anda juga bisa meminta Context untuk
menemukan dan menghapus file dengan memanggil deleteFile():
myContext.deleteFile(fileName);
Sebagai warga yang baik, Anda juga seharusnya secara teratur menghapus file cache yang dibuat
dengan getCacheDir().
Berinteraksi dengan rangkuman file
Setelah Anda memiliki deskriptor file, gunakan operator atau aliran file java.io standar untuk
berinteraksi dengan file. Hal ini tidak khusus untuk Android dan tidak dibahas di sini.
Database SQLite
Menyimpan data ke database cocok untuk data terstruktur atau berulang, misalnya informasi
kontak. Android menyediakan database seperti-SQL untuk keperluan ini.
Bab dan praktik berikut akan mengajarkan secara mendalam cara menggunakan database SQLite
bersama aplikasi Android Anda:
SQLite Primer
Pengantar Database SQLite
Praktik Storage Data SQLite
Menelusuri Praktik Database SQLite
Koneksi jaringan
Anda bisa menggunakan jaringan (bila tersedia) untuk menyimpan dan mengambil data pada
layanan berbasis web sendiri. Untuk melakukan operasi jaringan, gunakan kelas-kelas dalam
paket berikut:
java.net.*
android.net.*
Auto Backup untuk Android 6.0 (API level 23) dan yang lebih tinggi
Untuk aplikasi dengan versi SDK target berupa Android 6.0 (API level 23) dan yang lebih tinggi,
perangkat yang menjalankan Android 6.0 dan yang lebih tinggi secara otomatis membuat
cadangan data aplikasi ke awan. Sistem melakukan pencadangan otomatis ini bagi hampir semua
data aplikasi secara default, dan melakukannya tanpa harus menulis kode aplikasi tambahan.
Bila pengguna memasang aplikasi pada perangkat baru, atau memasang ulang aplikasi di satu
perangkat (misalnya setelah dikembalikan ke setelan pabrik), sistem secara otomatis memulihkan
data aplikasi dari awan. Fitur pencadangan otomatis mempertahankan data aplikasi yang dibuat
pada perangkat pengguna dengan mengunggahnya ke akun Google Drive pengguna dan
mengenkripsinya. Anda atau pengguna tidak akan dikenakan biaya storage data, dan data yang
disimpan tidak dihitung terhadap kuota Google Drive pribadi pengguna. Setiap aplikasi bisa
menyimpan hingga 25 MB. Setelah data yang dicadangkan mencapai 25 MB, aplikasi tidak akan
lagi mengirim data ke awan. Jika melakukan pemulihan data, sistem akan menggunakan cuplikan
data terakhir yang dikirim aplikasi ke awan.
Anda bisa menyesuaikan dan mengonfigurasi pencadangan otomatis untuk aplikasi. Lihat
Mengonfigurasi Auto Backup for Apps.
Pencadangan untuk Android 5.1 (API level 22) dan yang lebih rendah
Untuk pengguna Android versi sebelumnya, Anda perlu menggunakan Backup API untuk
mengimplementasikan pencadangan data. Singkatnya, hal ini mengharuskan Anda:
Firebase
Firebase adalah platform seluler yang membantu Anda mengembangkan aplikasi, menumbuhkan
basis pengguna, dan menghasilkan uang lebih banyak. Firebase terdiri dari beberapa fitur
pelengkap yang bisa dipadupadankan sesuai dengan kebutuhan Anda.
Beberapa fitur tersebut adalah Analytics, Perpesanan Awan, Notifikasi, dan Test Lab.
Ketahui selengkapnya
File
Menyimpan File
Dokumentasi dan contoh kode getExternalFilesDir()
Dokumentasi dan contoh kode getExternalStoragePublicDirectory()
Kelas java.io.File
Tutorial I/O Oracle Java
Pencadangan
Preferensi Bersama
Firebase
Beranda Firebase
Firebase Realtime Database
Tambahkan Firebase ke Proyek Android Anda
Preferensi bersama memungkinkan Anda membaca dan menulis data primitif dalam jumlah kecil
sebagai pasangan kunci/nilai ke file pada storage perangkat. Kelas SharedPreference
menyediakan API untuk mendapatkan handle ke file preferensi serta untuk membaca, menulis,
dan mengelola data ini. File preferensi bersama ini sendiri dikelola oleh kerangka kerja dan bisa
diakses (digunakan bersama) oleh semua komponen aplikasi Anda. Data tersebut tidak
digunakan bersama atau bisa diakses oleh aplikasi lainnya.
Untuk mengelola data dalam jumlah besar, gunakan database SQLite atau opsi storage lainnya
yang cocok, yang akan dibahas dalam bab berikutnya.
Anda membuat file preferensi bersama dalam metode onCreate() aktivitas utama dan
menyimpannya dalam sebuah variabel anggota.
Diperlukan argumen mode, karena Android versi lama memiliki mode lain yang memungkinkan
Anda membuat file preferensi bersama yang bisa dibaca dan ditulis oleh umum. Mode ini tidak
digunakan lagi di API 17, dan sekarang sangat tidak dianjurkan karena alasan keamanan. Jika
Anda perlu berbagi data dengan aplikasi lainnya, gunakan layanan atau penyedia materi.
@Override
protected void onPause() {
super.onPause();
SharedPreferences.Editor preferencesEditor = mPreferences.edit();
preferencesEditor.putInt("count", mCount);
preferencesEditor.putInt("color", mCurrentColor);
preferencesEditor.apply();
}
Anda bisa mengombinasikan panggilan untuk put dan clear. Akan tetapi, saat menerapkan
preferensi, clear selalu dilakukan terlebih dahulu, tanpa menghiraukan apakah Anda memanggil
metode clear sebelum atau setelah metode put pada editor ini.
Dalam contoh ini, metode akan memeriksa apakah setelan yang diubah adalah untuk kunci
preferensi yang diketahui. Ini akan memanggil findPreference() untuk mendapatkan objek
Preference yang diubah agar bisa memodifikasi rangkuman item menjadi keterangan pilihan
pengguna.
Untuk pengelolaan daur hidup yang tepat dalam aktivitas, daftarkan dan cabut pendaftaran
SharedPreferences.OnSharedPreferenceChangeListener Anda, masing-masing selama callback
onResume() dan onPause():
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Preferensi Bersama
Ketahui selengkapnya
Menyimpan Data
Opsi Storage
Menyimpan Rangkaian Nilai-Kunci
SharedPreferences
SharedPreferences.Editor
Stackoverflow
Bab ini menjelaskan setelan aplikasi yang memungkinkan pengguna untuk menunjukkan
preferensi mereka tentang bagaimana seharusnya aplikasi atau layanan berperilaku.
Kontrol yang ada dalam setelan aplikasi seharusnya menangkap preferensi pengguna yang
memengaruhi sebagian besar pengguna atau menyediakan dukungan penting bagi sebagian kecil
pengguna. Misalnya, setelan notifikasi memengaruhi semua pengguna, sementara setelan mata
uang untuk pasar asing menyediakan dukungan penting bagi pengguna dalam pasar itu.
Setelan biasanya tidak sering diakses, karena setelah pengguna mengubah setelan, mereka jarang
kembali dan mengubahnya lagi. Jika kontrol atau preferensi yang Anda sediakan untuk pengguna
adalah sesuatu yang perlu sering diakses, pertimbangkan untuk memindahkannya ke menu opsi
bilah aplikasi, atau ke menu navigasi samping seperti panel samping navigasi.
Setel default untuk kontrol setelan Anda yang familier bagi pengguna dan perbaiki pengalaman
aplikasi. Nilai default awal untuk setelan harus:
Menyatakan nilai yang akan dipilih kebanyakan pengguna, seperti Semua kontak untuk
"Kontak yang akan ditampilkan" dalam aplikasi Kontak.
Menggunakan daya baterai lebih sedikit. Misalnya, dalam aplikasi Android Settings,
Bluetooth dinonaktifkan hingga pengguna mengaktifkannya.
Menimbulkan risiko terkecil untuk keamanan dan kehilangan data. Misalnya, setelan
default untuk aksi default aplikasi Gmail adalah mengarsipkan, bukan menghapus.
Melakukan interupsi bila penting saja. Misalnya, setelan default bila panggilan dan
notifikasi masuk adalah hanya menyela bila penting.
Tip: Jika setelan berisi informasi tentang aplikasi, seperti nomor versi atau informasi lisensi,
pindahkan setelan ini ke layar Bantuan yang diakses terpisah.
Jika aplikasi Anda menawarkan navigasi samping seperti panel samping navigasi,
sertakan Settings di bawah semua item lainnya (kecuali Help dan Send).
Jika aplikasi Anda tidak menawarkan navigasi samping, tempatkan Settings dalam menu
opsi bilah aplikasi di bawah semua item lainnya (kecuali Help dan Send feedback).
Catatan: Gunakan kata Settings dalam navigasi aplikasi untuk mengakses setelan.
Jangan gunakan sinonim seperti "Options" atau "Preferences".
Tip: Android Studio menyediakan pintasan untuk mempersiapkan menu opsi bersama Settings.
Jika Anda memulai proyek Android Studio untuk ponsel cerdas atau tablet dengan menggunakan
template Basic Activity, aplikasi baru akan menyertakan Settings seperti yang ditampilkan di
bawah ini:
UI Setelan
Setelan seharusnya tesusun rapi, bisa diprediksi, dan berisi jumlah pilihan yang bisa dikelola.
Pengguna harus bisa memahami dengan cepat semua setelan yang tersedia dan nilainya saat ini.
Ikuti panduan desain ini:
7 setelan atau kurang: Susun setelan sesuai dengan prioritas, yang paling penting berada
di bagian atas.
7-15 setelan: Kelompokkan setelan terkait di bawah pembatas bagian. Misalnya, dalam
gambar di bawah, "Priority interruptions" dan "Downtime (priority interruptions only)"
adalah pembatas bagian.
16 setelan atau lebih: Kelompokkan setelan terkait ke dalam sub-layar tersendiri.
Gunakan judul, seperti Tampilan pada layar Setelan utama (seperti yang ditampilkan
pada sisi kiri gambar di bawah) untuk memungkinkan pengguna mengarahkan ke setelan
tampilan (ditampilkan pada sisi kanan gambar di bawah):
Membangun setelan
Bangun sebuah setelan aplikasi menggunakan beragam subkelas dari kelas Preference daripada
menggunakan objek View. Kelas ini menyediakan Tampilan yang ditampilkan untuk setiap
setelan, dan mengaitkannya dengan antarmuka SharedPreferences untuk menyimpan/mengambil
data preferensi.
Setiap Preference muncul sebagai suatu item dalam daftar. Subkelas langsung menyediakan
kontainer untuk layout yang melibatkan beberapa setelan. Misalnya:
Misalnya, untuk menyediakan pembatas dengan judul di antara grup setelan (seperti yang
ditampilkan dalam gambar sebelumnya untuk 7-15 setelan), tempatkan masing-masing grup
objek Preference di dalam PreferenceCategory. Untuk menggunakan layar tersendiri bagi grup,
tempatkan setiap grup Preference di dalam PreferenceScreen.
Subkelas Preference untuk setelan lainnya menyediakan UI yang sesuai bagi pengguna untuk
mengubah setelan. Misalnya:
Definisikan daftar setelan Anda dalam XML, dengan menyediakan struktur yang mudah dibaca
dan mudah diperbarui. Setiap subkelas Preference bisa dideklarasikan bersama elemen XML
yang cocok dengan nama kelas, misalnya <CheckBoxPreference>.
Contoh berikut dari template Settings Activity mendefinisikan sebuah layar dengan tiga setelan
seperti yang ditampilkan dalam gambar di bawah ini: tombol beralih (di bagian atas layar pada
sisi kiri), bidang entri teks (tengah), dan daftar tombol radio (kanan):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
. . .
</PreferenceScreen>
mengaktifkan opsi.
o Teks untuk tombol radio (Always, When possible, dan Never) didefinisikan dalam
larik pref_example_list_titles dan ditetapkan oleh atribut android:entries
.
o Nilai untuk pilihan tombol radio didefinisikan dalam larik
pref_example_list_values dan ditetapkan oleh atribut
android:entryValues .
o Tombol radio ditampilkan dalam dialog, yang biasanya memiliki tombol positif
(OK atau Accept) dan negatif (Cancel). Akan tetapi, dialog setelan tidak
memerlukan tombol ini, karena pengguna bisa menyentuh bagian luar dialog
untuk menghilangkannya. Untuk menyembunyikan tombol ini, setel atribut
android:positiveButtonText dan android:negativeButtonText ke
"@null".
o <ListPreference
o android:defaultValue="-1"
o android:entries="@array/pref_example_list_titles"
o android:entryValues="@array/pref_example_list_values"
o android:key="example_list"
o android:negativeButtonText="@null"
o android:positiveButtonText="@null"
o android:title="@string/pref_title_add_friends_to_messages" />
Simpan file XML dalam direktori res/xml/. Walaupun bisa memberi nama file sesuka Anda,
biasanya diberi nama preferences.xml.
Jika Anda menggunakan pustaka v7 appcompat dukungan dan memperluas Settings Activity
dengan AppCompatActivity dan fragmen dengan PreferenceFragmentCompat, seperti yang
ditampilkan di bagian berikutnya, ubah atribut XML setelan untuk menggunakan versi pustaka
appcompat v7 dukungan. Misalnya, untuk setelan SwitchPreference, ubah <SwitchPreference
dalam kode menjadi:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.SwitchPreferenceCompat
... />
</PreferenceScreen>
Menampilkan setelan
Gunakan subkelas Activity atau Fragment yang khusus untuk menampilkan daftar setelan.
Untuk aplikasi yang mendukung Android 3.0 dan versi yang lebih baru, praktik terbaik
untuk setelan adalah menggunakan Settings Activity dan fragmen untuk setiap file XML
preferensi:
o Tambahkan kelas Settings Activity yang memperluas Activity dan menjadi host
fragmen yang memperluas PreferenceFragment.
o Agar tetap kompatibel dengan pustaka appcompat v7, perluas Settings Activity
dengan AppCompatActivity, perluas fragmen dengan
PreferenceFragmentCompat.
Jika aplikasi Anda mendukung versi Android yang lebih lama dari 3.0 (API level 10 dan
yang lebih rendah), bangun aktivitas setelan khusus sebagai ekstensi kelas
PreferenceActivity.
Fragmen seperti PreferenceFragment menyediakan arsitektur yang lebih fleksibel untuk aplikasi
Anda, dibandingkan menggunakan aktivitas saja. Fragmen mirip dengan bagian modular sebuah
aktivitas—fragmen memiliki daur hidup sendiri dan menerima kejadian masukan sendiri, dan
Anda bisa menambahkan atau membuang fragmen saat aktivitas sedang berjalan. Gunakan
PreferenceFragment untuk mengontrol tampilan setelan Anda sebagai ganti PreferenceActivity
bila memungkinkan.
Akan tetapi, untuk membuat layout dua-panel bagi layar besar bila Anda memiliki beberapa grup
setelan, Anda bisa menggunakan aktivitas yang memperluas PreferenceActivity dan juga
PreferenceFragment untuk menampilkan setiap daftar setelan. Anda akan melihat pola ini dengan
template Settings Activity seperti yang nanti dijelaskan dalam bab ini di "Menggunakan template
Settings Activity".
Contoh berikut menampilkan bagaimana agar tetap kompatibel dengan pustaka appcompat v7
dengan memperluas Settings Activity menggunakan AppCompatActivity, dan memperluas
fragmen dengan PreferenceFragmentCompat. Untuk menggunakan pustaka ini dan versi
PreferenceFragmentCompat dari PreferenceFragment, Anda juga harus menambahkan pustaka
android.support:preference-v7 ke bagian dependencies file build.gradle (Module: app):
dependencies {
...
compile 'com.android.support:preference-v7:25.0.1'
}
Anda juga perlu menambahkan deklarasi preferenceTheme berikut ke AppTheme dalam file
styles.xml:
Menggunakan PreferenceFragment
Seperti yang ditampilkan dalam kode di atas, Anda mengaitkan layout XML setelan dengan
fragmen selama callback onCreatePreferences() dengan memanggil
setPreferencesFromResource() dengan dua argumen:
Anda kemudian bisa membuat Activity untuk setelan (bernama SettingsActivity) yang
memperluas AppCompatActivity, dan menambahkan fragmen setelan:
Kode di atas adalah pola umum yang digunakan untuk menambahkan fragmen ke sebuah
aktivitas sehingga fragmen muncul sebagai materi utama aktivitas. Anda menggunakan:
Untuk mempersiapkan navigasi bagi aktivitas setelan, pastikan mendeklarasikan induk Settings
Activity menjadi MainActivity dalam file AndroidManifest.xml.
Jika Anda mengimplementasikan menu opsi dengan item Settings, gunakan maksud berikut
untuk memanggil Settings Activity dengan metode onOptionsItemSelected() bila pengguna
mengetuk Settings (menggunakan action_settings untuk ID sumber daya menu Settings):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
// ... Handle other options menu items
if (id == R.id.action_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
Jika Anda mengimplementasikan panel samping navigasi dengan item Settings, gunakan maksud
berikut memanggil Settings Activity dengan metode onNavigationItemSelected() bila
pengguna mengetuk Settings (menggunakan action_settings untuk ID sumber daya menu
Settings):
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
} else if ...
// ... Handle other navigation drawer items
return true;
}
Aplikasi harus melakukan inisialisasi file SharedPreferences dengan nilai default untuk masing-
masing setelan saat pengguna membuka aplikasi untuk pertama kali. Ikuti langkah-langkah ini:
1. Pastikan untuk menetapkan nilai default untuk setiap setelan dalam file XML dengan
menggunakan atribut android:defaultValue :
2. ...
3. <SwitchPreference
4. android:defaultValue="true"
5. ... />
6. ...
7. Dari metode onCreate() di aktivitas utama aplikasi—dan di aktivitas lainnya yang
digunakan pengguna untuk memasuki aplikasi Anda untuk pertama kali—panggil
setDefaultValues():
8. ...
9. PreferenceManager.setDefaultValues(this,
10. R.xml.preferences, false);
11. ...
Langkah 2 memastikan bahwa aplikasi diinisialisasi dengan benar menggunakan setelan default.
Metode setDefaultValues() menggunakan tiga argumen:
Semua preferensi aplikasi disimpan secara default ke file yang bisa diakses dari mana saja dalam
aplikasi dengan memanggil metode statis PreferenceManager.getDefaultSharedPreferences().
Metode ini membutuhkan konteks dan mengembalikan objek SharedPreferences berisi semua
pasangan nilai-kunci yang dikaitkan dengan objek Preference.
Misalnya, cuplikan kode berikut menampilkan membaca salah satu nilai preferensi dari metode
onCreate() aktivitas utama:
...
SharedPreferences sharedPref =
PreferenceManager.getDefaultSharedPreferences(this);
Boolean switchPref = sharedPref
.getBoolean("example_switch", false);
...
Jika perubahan nilai setelan juga memerlukan perubahan rangkuman setelan, Anda bisa
mendengarkan perubahan, kemudian mengubah rangkuman dengan nilai setelan yang
baru.
Jika setelan memerlukan sejumlah opsi lagi, Anda bisa mendengarkan perubahan dan
langsung merespons dengan menampilkan opsi.
Jika setelan membuat setelan lain tidak terpakai atau tidak layak, Anda bisa
mendengarkan perubahan dan langsung merespons dengan menonaktifkan setelan
lainnya.
Dalam contoh berikut, listener mengambil nilai baru setelah setelan diubah, dan mengubah
rangkuman setelan (yang muncul pada setelan di UI) untuk menampilkan nilai baru. Ikuti
langkah-langkah ini:
1. Gunakan file preferensi bersama, seperti yang dijelaskan dalam bab sebelumnya, untuk
menyimpan nilai preferensi (setelan). Deklarasikan variabel-variabel berikut dalam
definisi kelas SettingsFragment:
2. public class SettingsFragment extends PreferenceFragment {
3. private SharedPreferences mPreferences;
4. private String sharedPrefFile = "com.example.android.settingstest";
5. ...
6. }
7. Tambahkan yang berikut ini ke metode onCreate() pada SettingsFragment untuk
mendapatkan preferensi yang didefinisikan oleh kunci example_switch, dan untuk
menyetel teks awal (sumber daya string option_on) untuk ringkasan:
8. @Override
9. public void onCreate(Bundle savedInstanceState) {
10. ...
11. mPreferences =
12. this.getActivity()
13. .getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
14. Preference preference = this.findPreference("example_switch");
15. preference.setSummary(mPreferences.getString("summary",
16. getString(R.string.option_on)));
17. ...
18. }
19. Tambahkan kode berikut ke onCreate() setelah kode di langkah sebelumnya:
20. ...
21. preference.setOnPreferenceChangeListener(new
22. Preference.OnPreferenceChangeListener() {
23. @Override
24. public boolean onPreferenceChange(Preference preference,
25. Object newValue) {
26. if ((Boolean) newValue == true) {
27. preference.setSummary(R.string.option_on);
28. SharedPreferences.Editor preferencesEditor =
29. mPreferences.edit();
30. preferencesEditor.putString("summary",
31. getString(R.string.option_on)).apply();
32. } else {
33. preference.setSummary(R.string.option_off);
34. SharedPreferences.Editor preferencesEditor =
35. mPreferences.edit();
36. preferencesEditor.putString("summary",
37. getString(R.string.option_off)).apply();
38. }
39. return true;
40. }
41. });
42. ...
Template Settings Activity telah terisi dengan setelan yang bisa Anda sesuaikan untuk aplikasi,
dan menyediakan layout yang berbeda untuk ponsel cerdas dan tablet:
Ponsel cerdas: Layar Settings utama dengan tautan header untuk setiap grup setelan,
misalnya General untuk setelan umum, seperti yang ditampilkan di bawah ini.
Tablet: Layout layar detail/master dengan tautan header untuk setiap grup di sebelah kiri
(master), dan grup setelan di sebelah kanan (detail), seperti yang ditampilkan dalam
gambar di bawah ini.
Template Settings Activity juga menyediakan fungsi untuk mendengarkan perubahan setelan dan
mengubah rangkuman untuk merefleksikan perubahan setelan. Misalnya, jika Anda mengubah
setelan "Add friends to messages" (opsinya adalah Always, When possible, atau Never), opsi
yang dipilih akan muncul di rangkuman di bawah setelan:
Secara umum, Anda tidak perlu mengubah kode template Settings Activity untuk menyesuaikan
aktivitas bagi setelan yang diinginkan di aplikasi. Anda bisa menyesuaikan judul, rangkuman,
nilai yang memungkinkan, nilai default setelan tanpa mengubah kode template, dan bahkan
menambahkan setelan lain ke grup yang disediakan. Untuk menyesuaikan setelan, edit sumber
daya larik string dan string di file strings.xml dan atribut layout untuk setiap setelan dalam file di
direktori xml.
Anda menggunakan kode template Settings Activity apa adanya. Agar berfungsi untuk aplikasi
Anda, tambahkan kode ke Main Activity untuk menyetel nilai-nilai setelan default, dan untuk
membaca serta menggunakan nilai setelan tersebut, seperti yang ditampilkan dalam bab ini nanti.
Untuk menyertakan template Settings Activity dalam proyek aplikasi Anda di Android Studio,
ikuti langkah-langkah ini:
Template Settings Activity membuat file XML dalam direktori res > xml, tempat Anda bisa
menambahkan atau menyesuaikan setelan yang diinginkan:
Layout XML di atas menggunakan beragam subkelas dari kelas Preference, bukan objek
View, dan subkelas langsung menyediakan kontainer untuk layout yang melibatkan
beberapa setelan. Misalnya PreferenceScreen menyatakan Preference tingkat atas, yaitu
akar hierarki Preference. File di atas menggunakan PreferenceScreen di bagian atas setiap
layar setelan. Subkelas Preference untuk setelan lainnya menyediakan UI yang sesuai
bagi pengguna untuk mengubah setelan. Misalnya:
Sumber daya string di file strings.xml di direktori res > values yang bisa Anda sesuaikan
untuk setelan yang diinginkan.
Semua yang digunakan di Settings Activity, seperti judul untuk setelan, larik string untuk
daftar, dan keterangan untuk setelan, didefinisikan sebagai sumber daya string di akhir
file ini. String ini ditandai dengan komentar seperti <!-- Strings related to
Settings --> dan <!-- Example General settings -->.
Tip: Anda bisa mengedit string ini untuk menyesuaikan setelan yang diperlukan untuk
aplikasi.
Aktivitas ini adalah kelas helper yang digunakan oleh SettingsActivity untuk
mempertahankan kompatibilitas mundur dengan Android versi sebelumnya.
Template Settings Activity menampilkan header preferensi pada layar utama yang memisahkan
setelan ke dalam beberapa kategori (General, Notifications, dan Data & sync). Pengguna
mengetuk heading untuk mengakses setelan yang ada pada heading itu. Pada tampilan tablet
yang lebih besar (lihat gambar sebelumnya), header muncul di panel kiri dan setelan untuk setiap
header muncul di panel kanan.
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment=
"com.example.android.droidcafe.SettingsActivity$GeneralPreferenceFragment"
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" />
<header
android:fragment=
"com.example.android.droidcafe.SettingsActivity$NotificationPreferenceFragment
"
android:icon="@drawable/ic_notifications_black_24dp"
android:title="@string/pref_header_notifications" />
<header
android:fragment=
"com.example.android.droidcafe.SettingsActivity$DataSyncPreferenceFragment"
android:icon="@drawable/ic_sync_black_24dp"
android:title="@string/pref_header_data_sync" />
</preference-headers>
File header XML mendaftarkan setiap kategori preferensi dan mendeklarasikan fragmen yang
berisi preferensi terkait.
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
...
}
public static class NotificationPreferenceFragment extends
PreferenceFragment {
...
}
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
o Kelas Preference
o PreferenceFragment
o Fragment
o SharedPreferences
Database SQL
SQLite
Tabel contoh
Transaksi
Bahasa kueri
Kueri untuk Android SQLite
Kursor
Ketahui selengkapnya
Kursus ini beranggapan bahwa Anda sudah familier dengan database secara umum, terutama
database SQL, dan bahasa SQL yang digunakan untuk berinteraksi dengannya. Bab ini sebagai
penyegar dan referensi singkat saja.
Database SQL
Simpan data dalam baris dan kolom tabel.
Perpotongan suatu baris dan kolom disebut bidang.
Bidang berisi data, referensi ke bidang lain, atau referensi ke tabel lain.
Baris diidentifikasi melalui ID unik.
Kolom diidentifikasi melalui nama yang unik per tabel.
Anggaplah ini seperti spreadsheet dengan baris, kolom, dan sel, dalam hal ini sel bisa berisi data,
referensi ke sel lain, dan tautan ke sheet lain.
SQLite
SQLite pustaka perangkat lunak yang mengimplementasikan mesin database SQL yang:
SQLite adalah mesin database yang paling banyak diterapkan di seluruh dunia. Kode sumber
untuk SQLite berada dalam domain publik.
Tabel contoh
SQLite menyimpan data dalam tabel.
Database DATABASE_NAME
Tabel WORD_LIST_TABLE
Kolom untuk _id, kata, dan keterangan
Setelah menyisipkan kata "alpha" dan "beta", dalam hal ini alpha memiliki dua definisi, tabelnya
akan terlihat seperti ini:
DATABASE_NAME
WORD_LIST_TABLE
_id word definition
1 "alpha" "first letter"
2 "beta" "second letter"
3 "alpha" "particle"
Anda bisa menemukan apa yang ada dalam baris tertentu menggunakan _id, atau bisa mengambil
baris dengan merumuskan kueri yang memilih baris dari tabel yang menetapkan pembatas.
Gunakan bahasa kueri SQL yang dibahas di bawah ini untuk membuat kueri.
Transaksi
Transaksi adalah urutan operasi yang dijalankan sebagai satu unit kerja logis. Unit kerja logis
harus menunjukkan empat properti, yaitu properti atomisitas, konsistensi, isolasi, dan ketahanan
(ACID), untuk memenuhi syarat sebagai transaksi.
Semua perubahan dalam satu transaksi di SQLite diterapkan pada semua bagian atau tidak
diterapkan sama sekali), bahkan jika tindakan menulis perubahan ke disk terputus karena
program mogok,
sistem operasi mogok, atau
listrik mati.
Contoh transaksi:
ACID
Atomisitas. Semua modifikasi data dijalankan, atau tidak ada yang dijalankan.
Konsistensi. Bila selesai, suatu transaksi harus meninggalkan semua data dalam keadaan
konsisten.
Isolasi. Modifikasi yang dibuat oleh transaksi yang terjadi bersamaan harus diisolasi dari
modifikasi yang dibuat oleh transaksi bersamaan lainnya. Suatu transaksi mengenali data
baik dalam keadaan sebelum transaksi bersamaan lainnya memodifikasinya, maupun
mengenali data setelah transaksi kedua selesai, namun tidak mengenali keadaan di antara
keduanya.
Ketahanan. Setelah transaksi selesai, efeknya diterapkan permanen dalam sistem.
Modifikasi tetap ada bahkan seandainya listrik mati.
menyisipkan baris
menghapus baris
memperbarui nilai dalam baris
mengambil baris yang memenuhi kriteria tertentu
Di Android, objek database menyediakan metode praktis untuk menyisipkan, menghapus, dan
memperbarui database. Anda hanya perlu memahami SQL untuk mengambil data.
Struktur kueri
Bagian:
Kueri contoh
SELECT * FROM
1 Mendapatkan seluruh tabel.
WORD_LIST_TABLE
SELECT word, definition FROM Mengembalikan
2
WORD_LIST_TABLE WHERE _id > 2 [["alpha", "particle"]]
SELECT _id FROM Mengembalikan id kata alpha dengan substring "art"
WORD_LIST_TABLE WHERE dalam definisi.
3
word="alpha" AND definition LIKE
"%art%" [["3"]]
Mengurutkan secara terbalik dan mengambil item
SELECT * FROM pertama. Hal ini akan memberi Anda item terakhir
4 WORD_LIST_TABLE ORDER BY untuk setiap urutan penyortiran. Pengurutan
word DESC LIMIT 1 berdasarkan kolom pertama, dalam hal ini, _id.
[["3", "alpha", "particle"]]
Anda bisa berlatih dengan membuat dan menjalankan kueri database pada situs web Fiddle dan
HeadFirst Labs.
Tabel berikut menampilkan bagaimana dua kueri pertama dari hal di atas akan terlihat sebagai
kueri mentah.
rawQuery(query, selectionArgs) ;
query(String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit) menjalankan kueri untuk tabel
tertentu, yang mengembalikan Cursor melalui rangkaian hasil.
Mengembalikan:
[["alpha", "particle"]]
String table = "WORD_LIST_TABLE"
String[] columns = new String[]{"*"};
String selection = "word = ?"
String[] selectionArgs = new String[]{"alpha"};
String groupBy = null;
String having = null;
String orderBy = "word ASC"
String limit = "2,1"
Perhatikan, dalam kode sebenarnya, Anda tidak akan membuat variabel untuk nilai nol. Lihat
dokumentasi SQLiteDatabase untuk versi metode ini dengan parameter berbeda.
Kursor
Kueri selalu mengembalikan objek Cursor. Cursor adalah antarmuka objek yang menyediakan
akses baca-tulis acak ke rangkaian hasil yang dikembalikan oleh kueri database. Kursor
menunjuk elemen pertama dalam hasil kueri.
Kursor adalah pointer ke dalam baris data terstruktur. Anda bisa menganggapnya sebagai pointer
ke baris tabel.
Kelas Cursor menyediakan metode untuk menggerakkan kursor melalui struktur itu, dan metode
untuk mendapatkan data dari kolom setiap baris.
Bila metode mengembalikan objek Cursor, Ulangi hasil, ekstrak data, lakukan sesuatu dengan
data, dan terakhir tutuplah kursor untuk membebaskan memori.
Ketahui selengkapnya
Situs web SQLite
Keterangan lengkap bahasa kueri
Kelas SQLiteDatabase
Kelas Cursor
10.2: Database SQLite
Materi:
Bab ini membahas SQLiteDatabase kerangka kerja Android dan kelas SQLiteOpenHelper. Bab
ini bukanlah pengantar SQLite atau database SQL. Bab ini beranggapan bahwa Anda sudah
familier dengan database SQL secara umum, dan pembangunan kueri SQL dasar. Periksa bab
SQL Primer jika Anda memerlukan penyegaran.
Dari banyak opsi storage yang telah dibahas, menggunakan database SQLite adalah salah satu
yang paling serbaguna dan praktis untuk diimplementasikan.
Database SQLite adalah solusi storage yang baik jika Anda memiliki data terstruktur
yang perlu diakses dan disimpan secara persisten serta sering ditelusuri dan diubah.
Anda bisa menggunakan database sebagai storage utama untuk data aplikasi atau
pengguna, atau Anda bisa menggunakannya untuk meng-cache serta menyediakan data
yang diambil dari awan.
Jika Anda bisa menyatakan data berupa baris dan kolom, pertimbangkan database
SQLite.
Penyedia materi, yang akan diperkenalkan dalam bab berikutnya, bekerja dengan bagus
pada database SQLite.
Jika Anda menggunakan database SQLite, yang dinyatakan sebagai objek SQLiteDatabase,
semua interaksi dengan database adalah melalui instance kelas SQLiteOpenHelper yang akan
mengeksekusi permintaan dan mengelola database untuk Anda. Aplikasi Anda hanya boleh
berinteraksi dengan SQLiteOpenHelper, yang akan dijelaskan di bawah ini.
Ada dua tipe data yang dikaitkan secara khusus dengan penggunaan database SQLite, Cursor dan
ContentValues.
Cursor
SQLiteDatabase selalu menyajikan hasil berupa Cursor dalam format tabel yang menyerupai
database SQL.
Anda bisa menganggap data sebagai larik baris. Kursor adalah pointer ke dalam satu baris data
terstruktur. Kelas Cursor menyediakan metode untuk menggerakkan kursor melalui struktur data,
dan metode untuk mendapatkan data dari bidang-bidang di setiap baris.
Kelas Cursor memiliki sejumlah subkelas yang mengimplementasikan kursor untuk tipe data
tertentu.
Memproses kursor
Jika panggilan metode mengembalikan ulangi pada hasil, ekstrak data, lakukan sesuatu dengan
data, dan terakhir, harus menutup kursor untuk membebaskan memori. Jika tidak dilakukan,
aplikasi Anda bisa mogok saat kehabisan memori.
Kursor dimulai sebelum baris hasil pertama, sehingga pada pengulangan pertama gerakkan
kursor ke hasil pertama jika ada. Jika kursor kosong, atau baris terakhir sudah diproses, maka
akan keluar dari loop. Jangan lupa menutup kursor bila Anda selesai menggunakannya. (Ini tidak
boleh diulang terlalu sering.)
ContentValues
Serupa dengan cara ekstra menyimpan data, instance ContentValues menyimpan data sebagai
pasangan nilai-kunci, dalam ini kuncinya adalah nama kolom dan nilainya adalah nilai untuk sel.
Satu instance ContentValues menyatakan satu baris tabel.
Metode insert() untuk database memerlukan nilai untuk mengisi baris yang diteruskan sebagai
instance ContentValues.
Keberatan:
Model data
Praktik yang baik adalah dengan membuat kelas yang menyatakan data Anda dengan getter dan
setter.
Untuk database SQLite, instance kelas ini dapat menyatakan satu catatan, dan untuk database
sederhana, satu baris dalam tabel.
Open helper apa pun yang Anda buat harus memperluas SQLiteOpenHelper.
// Column names...
public static final String KEY_ID = "_id";
public static final String KEY_WORD = "word";
Anda memerlukan kueri yang membuat tabel untuk membuat database. Ini biasanya juga
didefinisikan sebagai konstanta string. Contoh dasar ini membuat satu tabel dengan satu kolom
untuk ID bertambah-otomatis dan kolom untuk menampung kata.
Metode onCreate hanya dipanggil jika tidak ada database. Buat tabel Anda dalam metode, dan
boleh menambahkan data awal.
@Override
public void onCreate(SQLiteDatabase db) { // Creates new database
db.execSQL(WORD_LIST_TABLE_CREATE); // Create the tables
fillDatabaseWithData(db); // Add initial data
// Cannot initialize mWritableDB and mReadableDB here, because
// this creates an infinite loop of on Create()
// being repeatedly called.
}
Implementasikan onUpgrade()
Jika database hanya berfungsi sebagai cache untuk data yang juga disimpan online, Anda bisa
menghapus tabel dan membuat ulang setelah peningkatan versi selesai.
Catatan: Jika database adalah storage utama, Anda harus mengamankan data pengguna
sebelum melakukannya karena operasi ini akan memusnahkan semua data. Lihat bab mengenai
Menyimpan Data.
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// SAVE USER DATA FIRST!!!
Log.w(WordListOpenHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + WORD_LIST_TABLE);
onCreate(db);
}
Metode opsional
Kelas open helper menyediakan metode tambahan yang bisa Anda ganti bila diperlukan.
Operasi database
Walaupun bisa memanggil metode dalam open helper yang diinginkan dan mengembalikan yang
Anda pilih ke aktivitas pemanggil, lebih baik lanjutkan dengan metode query(), insert(), delete(),
update(), count() standar yang sesuai dengan API database dan penyedia materi. Menggunakan
format ini akan mempermudah penambahan penyedia materi atau pemuat di masa mendatang,
dan memudahkan orang lain dalam memahami kode Anda.
Diagram berikut menampilkan cara mendesain API yang berbeda agar konsisten dan jelas.
query()
Metode kueri yang diimplementasikan dalam kelas open helper Anda bisa mengambil dan
mengembalikan tipe data apa pun yang diperlukan antarmuka pengguna.
Karena open helper menyediakan metode praktir untuk menyisipkan, menghapus, dan
memperbarui baris, metode kueri Anda tidak perlu generik dan mendukung operasi ini.
Secara umum, metode kueri Anda hanya boleh mengizinkan kueri yang diperlukan oleh aplikasi
dan bukan untuk keperluan umum.
SQLiteDatabase.rawQuery().rawQuery()
Metode kueri open helper bisa membentuk kueri SQL dan mengirimkannya sebagai rawQuery ke
database yang mengembalikan kursor. Jika data disediakan oleh aplikasi dan dikontrol penuh,
Anda bisa menggunakan rawQuery().
SQLiteDatabase.query()
Jika Anda memproses data yang disediakan pengguna, bahkan setelah validasi, lebih aman
membentuk kueri dan menggunakan versi metode SQLiteDatabase.query() untuk database.
Argumen adalah apa yang Anda harapkan dalam SQL dan didokumentasikan dalam dokumentasi
SQLiteDatabase.
try {
if (mReadableDB == null) {mReadableDB = getReadableDatabase();}
cursor = mReadableDB.rawQuery(query, null);
cursor.moveToFirst();
entry.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
entry.setWord(cursor.getString(cursor.getColumnIndex(KEY_WORD)));
} catch (Exception e) {
Log.d(TAG, "EXCEPTION! " + e);
} finally {
// Must close cursor and db now that we are done with it.
cursor.close();
return entry;
}
}
insert()
Format
Contoh
delete()
Metode delete dari open helper memanggil metode delete() database, yang praktis digunakan
sehingga Anda tidak perlu menulis kueri SQL seluruhnya.
Format
Anda bisa menghapus menggunakan kriteria apa pun, dan metode akan mengembalikan jumlah
item yang sebenarnya dihapus, yang juga harus dikembalikan oleh open helper.
Contoh
deleted = mWritableDB.delete(WORD_LIST_TABLE,
KEY_ID + " =? ", new String[]{String.valueOf(id)});
update()
Metode update dari open helper memanggil metode update() database, yang praktis digunakan
sehingga Anda tidak perlu menulis kueri SQL seluruhnya. Argumen tersebut sudah familier dari
metode sebelumnya, dan onUpdate mengembalikan jumlah baris yang diperbarui.
Format
Contoh
count()
Di adapter
@Override
public int getItemCount() {
return (int) mDB.count();
}
Di open helper
Misalnya:
Menekan FAB bisa memulai aktivitas yang akan mendapatkan masukan dari pengguna
dan menyimpannya ke dalam database sebagai item baru atau diperbarui.
Menggesek suatu item bisa menghapusnya setelah pengguna mengonfirmasi
penghapusan.
Transaksi
Gunakan transaksi
saat melakukan beberapa operasi yang semuanya harus diselesaikan agar database
konsisten, misalnya, memperbarui penetapan harga item terkait untuk kejadian penjualan.
untuk batch beberapa operasi independen guna meningkatkan kinerja, seperti penyisipan
massal.
Transaksi bisa disarangkan, dan kelas SQLiteDatabase menyediakan metode tambahan untuk
mengelola transaksi tersarang. Lihat dokumentasi referensi SQLiteDatabase.
Idiom transaksi
db.beginTransaction();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
Mencadangkan database
Ada baiknya Anda mencadangkan database aplikasi.
Anda bisa melakukannya menggunakan opsi Cloud Backup yang dibahas dalam bab Opsi
Storage.
Sertakan perintah SQL bersama aplikasi dan perintahkan untuk membuat database dan
menyisipkan data pada penggunaan pertama. Inilah yang pada dasarnya akan Anda
lakukan dalam praktik storage data. Jika jumlah data yang ingin dimasukkan dalam
database kecil, hanya satu contoh agar pengguna bisa melihat sesuatu, Anda bisa
menggunakan metode ini.
Kirimkan data bersama APK sebagai sumber daya, dan bangun database saat pengguna
membuka aplikasi untuk pertama kali. Metode ini sama dengan metode pertama, namun
sebagai ganti mendefinisikan data dalam kode, Anda memasukkannya dalam sumber
daya, misalnya, dalam format CSV. Selanjutnya Anda bisa membaca data dengan aliran
masukan dan menambahkannya ke database.
Bangun dan isi dahulu database SQLite lalu sertakan dalam APK. Dengan metode ini,
tulis aplikasi yang akan membuat dan mengisi database. Anda bisa melakukan ini pada
emulator. Selanjutnya Anda bisa menyalin file tersebut di tempat penyimpanan database
sebenarnya (direktori "/data/data/YOUR_PACKAGE/databases/") dan menyertakannya
sebagai aset bersama aplikasi. Saat aplikasi dimulai untuk pertama kali, salin kembali file
database ke dalam direktori "/data/data/YOUR_PACKAGE/databases/".
Kelas SQLiteAssetHelper, yang bisa Anda unduh dari Github, memperluas SQLiteOpenHelper
untuk membantu Anda melakukannya. Dan entri blog Stackoverflow akan membahas topik ini
lebih detail.
Perhatikan, untuk database yang lebih besar, mengisi database harus dilakukan di latar belakang,
dan aplikasi Anda tidak akan mogok jika belum ada database, atau database masih kosong.
Praktik terkait
Dokumentasi praktik terkait ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Opsi Storage
Menyimpan Data di Database SQL
Kelas SQLiteDatabase
Kelas ContentValues
Kelas SQLiteOpenHelper
Kelas Cursor
Kelas SQLiteAssetHelper dari Github
Penyedia materi:
Objek ContentResolver menyediakan metode query(), insert(), update(), dan delete() untuk
mengakses data dari penyedia materi.
Masing-masing permintaan terdiri dari URI dan kueri mirip-SQL, dan responsnya adalah objek
Cursor.
Catatan: Anda telah mempelajari tentang kursor dalam bab Storage Data, dan nanti akan ada
rangkuman dalam bab ini.
Diagram berikut menampilkan alur kueri dari aktivitas dengan menggunakan resolver materi, ke
penyedia materi, ke data dalam database SQL, dan kembali lagi. Perhatikan, penyimpanan data
umumnya dalam database SQLite, namun tidak wajib.
Dengan penyedia materi, Anda bisa memungkinkan beberapa aplikasi lainnya untuk
mengakses, menggunakan, dan memodifikasi sumber data tunggal yang disediakan oleh
aplikasi Anda. Contoh: Persediaan di gudang untuk toko retail, skor game, atau kumpulan
masalah fisika untuk universitas.
Untuk kontrol akses, Anda bisa menetapkan tingkatan izin penyedia materi, yang
menetapkan cara aplikasi lain bisa mengakses data. Misalnya, toko mungkin tidak boleh
mengubah data persediaan di gudang.
Anda bisa menyimpan data secara independen dari aplikasi, karena penyedia materi
berada di antara antarmuka pengguna dan data yang disimpan. Anda bisa mengubah cara
data disimpan tanpa perlu mengubah kode yang berinteraksi dengan pengguna. Misalnya,
Anda bisa membangun prototipe aplikasi belanja menggunakan data persediaan tiruan,
kemudian menggantinya nanti dengan database SQL untuk data sungguhan. Anda bahkan
bisa menyimpan sebagian data di sistem awan serta sebagian lagi secara lokal, dan semua
itu sama saja bagi pengguna.
Manfaat lain memisahkan data dari antarmuka pengguna dengan penyedia materi adalah
karena tim development bisa bekerja secara independen pada antarmuka pengguna dan
repositori data aplikasi Anda. Untuk aplikasi yang lebih besar dan kompleks, umumnya
antarmuka pengguna dan backend data dikembangkan oleh tim yang berbeda, bahkan
bisa berupa aplikasi terpisah; yakni, aplikasi dengan penyedia materi tidak harus
memiliki antarmuka pengguna. Misalnya, aplikasi persediaan bisa terdiri dari data dan
penyedia materi saja.
Ada kelas lain yang diharapkan berinteraksi dengan penyedia materi. Misalnya, Anda
harus memiliki penyedia materi untuk menggunakan loader, seperti CursorLoader, untuk
memuat data di latar belakang. Anda akan mempelajari tentang loader di bab berikutnya.
Catatan: Jika hanya aplikasi tersebut yang menggunakan data, dan Anda mengembangkannya
sendiri, Anda mungkin tidak memerlukan penyedia materi.
Untuk memberi Anda gambaran arsitektur penyedia materi secara menyeluruh, bagian ini
menampilkan dan merangkum semua bagian arsitektur penyedia materi yang diimplementasikan,
seperti yang ditampilkan dalam diagram berikut. Setiap bagian nanti akan dibahas secara detail.
Data dan Open Helper: Repositori data. Data bisa berada dalam database, file, internet,
dihasilkan secara dinamis, atau bahkan campuran semua ini. Misalnya, jika Anda memiliki
aplikasi kamus, kamus dasar bisa disimpan dalam database SQLite pada perangkat pengguna.
Jika tidak ada dalam database, definisi bisa diambil dari internet, dan jika gagal, aplikasi bisa
meminta pengguna untuk menyediakan definisi atau memeriksa ejaannya.
Data yang digunakan bersama penyedia materi umumnya disimpan dalam database SQLite, dan
API penyedia materi akan mencerminkan asumsi ini.
Kontrak: Kontrak adalah kelas publik yang mengekspos informasi penting tentang penyedia
materi ke aplikasi lainnya. Kontrak biasanya menyertakan skema URI, konstanta penting, dan
struktur data yang akan dikembalikan. Misalnya, untuk aplikasi persediaan topi, kontrak bisa
mengekspos nama kolom yang berisi harga serta nama produk, dan URL untuk mendapatkan
item persediaan berdasarkan nomor komponen.
Penyedia Materi: Penyedia materi memperluas kelas ContentProvider dan menyediakan metode
query(), insert(), update(), serta delete() untuk mengakses data. Selain itu, penyedia materi
menyediakan antarmuka publik yang aman ke data, sehingga aplikasi lainnya bisa mengakses
data dengan izin yang sesuai. Misalnya, untuk mendapatkan informasi dari database aplikasi
Anda, aplikasi topi retail akan menghubungkan dengan penyedia materi, bukan dengan database
secara langsung, karena ini tidak diizinkan.
Aplikasi yang memiliki data akan menetapkan izin apa yang diperlukan aplikasi lainnya untuk
bekerja dengan penyedia materi. Misalnya, jika memiliki aplikasi yang menyediakan persediaan
untuk toko retail, aplikasi Anda memiliki data dan menentukan izin akses aplikasi lainnya ke
data. Izin ditetapkan dalam Manifes Android.
Resolver Materi: Penyedia materi selalu diakses melalui resolver materi. Anggaplah resolver
materi sebagai kelas helper yang mengelola semua detail hubungan dengan penyedia materi
untuk Anda. Pencerminan API penyedia materi, objek ContentResolver memberi Anda metode
query(), insert(), update(), dan delete() untuk mengakses data penyedia materi. Misalnya, untuk
mendapatkan semua item persediaan berupa topi merah, aplikasi toko merah akan membangun
kueri untuk topi merah, dan menggunakan resolver materi untuk mengirim kueri itu ke penyedia
materi.
Data
Data sering kali disimpan dalam database SQLite, namun ini tidak wajib. Data bisa disimpan
dalam file atau sistem file, di internet, atau dibuat secara dinamis. Atau bahkan campuran
berbagai opsi ini. Bagi aplikasi, resolver materi, data yang diambil selalu berupa objek Cursor,
seolah-olah berasal dari sumber yang sama dan dalam format yang sama.
Penyedia materi bisa mengakses data secara langsung jika berupa file, atau melakukannya
melalui kelas helper. Misalnya, umumnya aplikasi menggunakan open helper untuk berinteraksi
dengan database SQLite, dan penyedia materi berinteraksi dengan open helper untuk
mendapatkan data.
Umumnya, data disajikan kepada penyedia materi oleh penyimpan data berupa tabel, mirip
seperti tabel database, dengan masing-masing baris menyatakan satu entri dan setiap kolom
menyatakan atribut untuk entri itu. Misalnya, setiap baris berisi satu kontak, dan mungkin
memiliki kolom untuk alamat email dan nomor telepon. Struktur tabel akan diekspos dalam
kontrak.
Catatan: Jika hanya bekerja dengan file, Anda bisa menggunakan kelas FileProvider yang telah
didefinisikan sebelumnya.
Kontrak
Kontrak adalah kelas publik yang mengekspos informasi penting tentang penyedia materi
aplikasi sehingga aplikasi lain tahu cara mengakses dan menggunakan penyedia materi.
Menggunakan kontrak akan memisahkan informasi aplikasi yang bersifat publik dari privat,
desain dari implementasi, dan memberi aplikasi lain satu tempat untuk mendapatkan semua
informasi yang mereka perlukan untuk bekerja dengan penyedia materi. Walaupun aplikasi yang
mendasarinya mungkin berubah, kontrak mendefinisikan API yang idealnya tidak berubah
setelah aplikasi dipublikasikan.
URI materi dan skema URI. Skema URI menampilkan cara membangun URI untuk
mengakses data penyedia materi. Ini adalah API untuk data.
Konstanta tabel. Menyediakan tabel dan nama kolom sebagai konstanta, karena
keduanya dibutuhkan untuk mengekstrak data dari objek kursor yang dikembalikan.
Tipe MIME, yang memiliki informasi mengenai format data, sehingga aplikasi bisa
memproses data yang dikembalikan dengan semestinya. Misalnya, data bisa dienkode
dalam JSON atau HTML, atau menggunakan format khusus.
Konstanta bersama lainnya yang membuat aplikasi lebih praktis menggunakan penyedia
materi.
Catatan: Kontrak tidak terbatas untuk penyedia materi. Anda bisa menggunakan kontrak kapan
saja diinginkan untuk berbagi konstanta dengan kelas-kelas aplikasi atau menyediakan informasi
tentang aplikasi Anda kepada aplikasi lainnya.
scheme://authority/path/ID
scheme selalu content:// untuk URI materi.
authority menyatakan domain, dan untuk penyedia materi biasanya berakhiran
.provider
path adalah jalur menuju data.
ID secara unik mengidentifikasi rangkaian data yang akan ditelusuri.
Misalnya, URI berikut bisa digunakan untuk meminta semua entri di tabel "words":
content://com.android.example.wordcontentprovider.provider/words
Skema URI untuk mengakses penyedia materi didefinisikan dalam Contract sehingga hanya
tersedia bagi aplikasi yang ingin melakukan kueri ke penyedia materi ini. Biasanya, ini dilakukan
dengan mendefinisikan konstanta untuk AUTHORITY, CONTENT_PATH, dan
CONTENT_URI.
AUTHORITY. Menyatakan domain. Untuk penyedia materi, ini menyertakan nama paket
yang unik dan berakhiran .provider
CONTENT_PATH. Jalur materi adalah identifier semantik abstrak dari data yang
diminati. Jalur data tidak memprediksi atau menganggap dalam bentuk apa data disimpan
atau diatur di latar belakang. Dengan demikian, jalur bisa diurai ke dalam nama tabel,
nama file, atau nama daftar.
CONTENT_URI. Ini adalah URI bergaya content:// ke satu rangkaian data. Jika memiliki
beberapa "kontainer data" di backend, Anda harus membuat satu URI materi untuk
masing-masing kontainer. Misalnya, Anda ingin membuat URI materi ke masing-masing
tabel yang bisa dikueri. Gunakan kelas helper URI untuk membangun dan memanipulasi
URI.
Cara umum untuk mengatur suatu kelas kontrak adalah menempatkan definisi yang bersifat
global terhadap database Anda ke dalam level kelas akar. Biasanya, ini adalah nama database.
Buat kelas dalam abstrak statis untuk setiap tabel dengan nama kolom. Kelas dalam ini biasanya
mengimplementasikan antarmuka BaseColumns. Dengan mengimplementasikan antarmuka
BaseColumns, kelas Anda bisa mewarisi bidang kunci utama bernama _ID yang diharapkan ada
oleh beberapa kelas Android, seperti adapter kursor. Hal ini tidak diharuskan, namun bisa
membantu database Anda untuk bekerja harmonis dengan kerangka kerja Android.
Tipe MIME
Tipe MIME memberi tahu aplikasi, tentang tipe dan format data yang diterima, sehingga bisa
memproses data dengan semestinya. Tipe MIME yang umum antara lain text/html untuk laman
web, dan application/json. Jika penyedia materi mengembalikan data dalam salah satu dari
kedua format standar itu, Anda harus menggunakan tipe MIME standar. Daftar lengkap tipe
standar ini tersedia di situs web IANA MIME Media Types.
Akan tetapi, penyedia materi mungkin akan mengembalikan data khusus untuk aplikasi Anda.
Dalam hal itu, Anda akan perlu menetapkan tipe MIME khusus.
Untuk URI materi yang menunjuk ke sebuah baris atau beberapa baris data tabel, dan yang
bersifat unik untuk aplikasi Anda, tipe MIME harus dalam format MIME khusus vendor
Android. Format umum adalah:
type.subtype/provider-specific-part
Dengan bagian-bagiannya:
o Jika pola URI adalah untuk lebih dari satu baris: android.cursor.dir/
vnd.android.cursor.dir/vnd.com.example.provider.words
Untuk baris tunggal "words", tipe MIME adalah:
vnd.android.cursor.item/vnd.com.example.provider.words
Suatu aplikasi bisa memanggil metode getType() dari penyedia materi untuk mengetahui tipe
data yang diharapkan. Metode getType() akan terlihat seperti ini:
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case URI_ALL_ITEMS_CODE:
return MULTIPLE_RECORDS_MIME_TYPE;
case URI_ONE_ITEM_CODE:
return SINGLE_RECORD_MIME_TYPE;
default:
return null;
}
}
Baca selengkapnya tentang tipe MIME untuk penyedia materi dalam dokumentasi developer
Android.
Catatan: Tipe MIME tidak memberi tahu klien cara memproses data. Dengan demikian, tipe
MIME khusus hanya menyediakan petunjuk, dan kontrak harus menyediakan informasi
tambahan kepada klien mengenai format data yang diharapkan.
Dengan demikian, praktik yang baik adalah mempertahankan nama, argumen metode, dan nilai
kembalian yang konsisten di antara semua komponen. Hal ini membuat implementasi dan
pemeliharaan menjadi jauh lebih mudah.
Diagram berikut menampilkan API di antara blok pembangunan konseptual aplikasi yang
menggunakan penyedia materi untuk mengakses data. Terutama perhatikan:
Metode tersebut diberi nama yang sama dan mengembalikan tipe data yang sama di
seluruh tumpukan (kecuali untuk insert()).
Karena biasanya penyedia materi menghubungkan ke database, metode kueri akan
mengembalikan kursor. Jika backend Anda bukan database, penyedia materi harus
melakukan pekerjaan mengonversi data yang dikembalikan ke dalam format kursor.
Diagram ini tidak menampilkan kelas helper tambahan, seperti open helper untuk
database, yang mungkin juga menggunakan konvensi API yang sama.
Bila Anda membuat penyedia materi dengan memperluas kelas ContentProvider, Anda perlu
mengimplementasikan metode insert, delete, update, dan query. Jika Anda mengikuti prinsip
pembuatan tanda tangan metode sama di seluruh komponen, maka penerusan data bolak-balik
tidak memerlukan banyak kode.
Inilah metode contoh dalam penyedia materi. Perhatikan, penyedia materi menerima nilai untuk
disisipkan dalam tipe yang tepat, seperti ContentValues, memanggil database, dan membangun
serta mengembalikan URI yang diperlukan untuk resolver materi.
Metode insert
/**
* Inserts one row.
*
* @param uri Uri for insertion.
* @param values Container for Column/Row key/value pairs.
* @return URI for the newly created entry.
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = mDB.insert(values);
return Uri.parse(CONTENT_URI + "/" + id);
}
Metode delete
/**
* Deletes records(s) specified by selectionArgs.
*
* @param uri URI for deletion.
* @param selection Where clause.
* @param selectionArgs Where clause arguments.
* @return Number of records affected.
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return mDB.delete(parseInt(selectionArgs[0]));
}
Metode update
/**
* Updates records(s) specified by selection/selectionArgs combo.
*
* @param uri URI for update.
* @param values Container for Column/Row key/value pairs.
* @param selection Where clause.
* @param selectionArgs Where clause arguments.
* @return Number of records affected.
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[]
selectionArgs) {
return mDB.update(parseInt(selectionArgs[0]), values.getAsString("word"));
}
Metode query()
Metode query dalam penyedia materi memiliki tanda tangan berikut:
Argumen menyatakan bagian-bagian kueri SQL dan akan dibahas di bawah ini. Metode kueri
penyedia materi harus mem-parse argumen URI dan menentukan aksi yang sesuai.
Pencocokan URI
Praktik yang baik adalah menggunakan instance kelas UriMatcher untuk mencocokkan URI.
UriMatcher adalah kelas helper untuk mencocokkan URI bagi penyedia materi.
/**
* Defines the accepted Uri schemes for this content provider.
* Calls addURI() for all of the content URI patterns that the provider should
recognize.
*/
private void initializeUriMatching() {
// Matches a URI that references one word in the list by its index.
sUriMatcher.addURI(AUTHORITY, CONTENT_PATH + "/#", URI_ONE_ITEM_CODE);
Metode query mengaktifkan URI pencocokan untuk melakukan kueri database bagi semua item,
satu item, atau satu hitungan item, seperti yang ditampilkan dalam kode contoh ini.
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[]
selectionArgs,
String sortOrder) {
// Determine integer code from the URI matcher and switch on it.
switch (sUriMatcher.match(uri)) {
case URI_ALL_ITEMS_CODE:
cursor = mDB.query(ALL_ITEMS);
Log.d(TAG, "case all items " + cursor);
break;
case URI_ONE_ITEM_CODE:
cursor = mDB.query(parseInt(uri.getLastPathSegment()));
Log.d(TAG, "case one item " + cursor);
break;
case URI_COUNT_CODE:
cursor = mDB.count();
Log.d(TAG, "case count " + cursor);
break;
case UriMatcher.NO_MATCH:
// You should do some error handling here.
Log.d(TAG, "NO MATCH FOR THIS URI IN SCHEME: " + uri);
break;
default:
// You should do some error handling here.
Log.d(TAG, "INVALID URI - URI NOT RECOGNIZED: " + uri);
}
return cursor;
}
Menggunakan Resolver Materi
Objek ContentResolver menyediakan metode untuk data query(), insert(), delete(), dan update().
Karena itu, resolver materi mencerminkan API penyedia materi dan mengelola semua interaksi
dengan penyedia materi untuk Anda. Dalam kebanyakan situasi, Anda bisa menggunakan
penyedia materi default yang disediakan oleh sistem Android.
Kursor
Penyedia materi selalu menyajikan hasil kueri sebagai Cursor dalam format tabel yang
menyerupai database SQL. Hal ini tidak dipengaruhi oleh cara penyimpanan data sebenarnya.
Kursor adalah pointer ke dalam baris data terstruktur. Anda bisa menganggapnya sebagai daftar
baris yang ditautkan. Kelas Cursor menyediakan metode untuk menggerakkan kursor melalui
struktur itu, dan metode untuk mendapatkan data dari kolom setiap baris.
Bila suatu metode mengembalikan Cursor, ulangi hasilnya, ekstrak data, lakukan sesuatu dengan
data, dan terakhir tutup kursor untuk membebaskan memori.
Jika Anda menggunakan database SQL, seperti yang ditampilkan di atas, Anda bisa
mengimplementasikan open helper untuk mengembalikan kursor, kemudian sekali lagi, penyedia
materi mengembalikan kursor melalui resolver materi. Jika storage data mengembalikan data
dalam format berbeda, Anda nanti harus mengonversinya menjadi kursor, biasanya
MatrixCursor.
Metode query()
Argumen untuk metode ini menyatakan bagian-bagian kueri SQL. Sekalipun menggunakan
backend jenis lain, Anda tetap harus menerima kueri dalam gaya ini dan menangani argumen
dengan semestinya.
URI materi lengkap yang dikueri. Tidak boleh nol. Dapatkan informasi untuk URI
uri
yang benar dari kontrak. Misalnya:
String queryUri = Contract.CONTENT_URI.toString();
Sebuah larik string dengan nama-nama kolom yang akan dikembalikan untuk
projection setiap baris. Menyetelnya ke nol akan mengembalikan semua kolom. Misalnya:
String[] projection = new String[] {Contract.CONTENT_PATH};
Menunjukkan baris/catatan objek mana yang ingin Anda akses. Ini adalah klausa
selection WHERE yang mengecualikan where yang sebenarnya. Misalnya:
String where = KEY_WORD + " LIKE ?";
Nilai-nilai argumen untuk kriteria selection. Jika Anda menyertakan ?s dalam
selection, maka itu akan digantikan oleh nilai-nilai dari selectionArgs, sesuai
selectionArgs urutan munculnya. PENTING: Praktik keamanan terbaik adalah selalu
memisahkan selection dan selectionArgs. Misalnya:
String[]whereArgs = new String[]{searchString};
Urutan mengurutkan hasil. Diformat berupa klausa SQL ORDER BY (dengan
sortOrder mengecualikan kata kunci ORDER BY). Biasanya ASC atau DESC; null akan
meminta susunan urutan default, yang boleh jadi tidak berurutan.
Agar penyedia materi terlihat dan tersedia untuk aplikasi lain, Anda perlu mendeklarasikan
dalam AndroidManifest penyedia.
<provider android:name=".WordListContentProvider"
android:authorities="com.android.example.wordlistsqlwithcontentprovider.provid
er" android:exported="true"/>
android:readPermission="com.android.example.wordlistsqlwithcontentpfonrovider.
PERMISSION"
android:writePermission="com.android.example.wordlistsqlwithcontentprovider.PE
RMISSION"
String izin harus unik untuk penyedia materi Anda, sehingga hanya memberi privilese
untuk penyedia materi.
Walaupun string bisa berupa apa saja, penggunaan nama paket akan menjamin
keunikannya.
Untuk mengakses penyedia materi, aplikasi klien perlu mendeklarasikan izin dalam Manifes
Android untuk penyedia materi itu.
<uses-permission android:name =
"com.android.example.wordlistsqlwithcontentprovider.PERMISSION"/>
Anda bisa mengetahui selengkapnya dalam Mendeklarasikan Izin, Izin Sistem, dan
Mengimplementasikan Izin Penyedia Materi.
Praktik terkait
Dokumentasi praktik terkait ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
Dokumentasi Developer:
Video:
12.1: Loader
Materi:
Arsitektur loader
Mengimplementasikan CursorLoader
Praktik terkait
Ketahui selengkapnya
Salah satu alasan utama pengguna meninggalkan aplikasi adalah waktu startup. Penelitian
menunjukkan bahwa jika sebuah aplikasi atau laman membutuhkan waktu lebih dari 3 detik
untuk memuat, 40% pengguna akan meninggalkannya. Bagaimanapun juga, angka ini bervariasi
bergantung pada penelitian, namun fakta yang tersebar luas adalah bahwa retensi pengguna
berkaitan erat dengan kecepatan pemuatan aplikasi.
Waktu pemuatan aplikasi berkaitan langsung dengan apa saja yang terjadi pada thread UI.
Semakin sedikit pekerjaan yang harus dilakukan thread UI Anda, semakin cepat pengguna
melihat laman. Banyak faktor yang memengaruhi waktu startup aplikasi, dan Anda mengetahui
selengkapnya tentang kinerja aplikasi dalam bab berikutnya. Salah satu tindakan besar dan nyata
yang memengaruhi kinerja adalah berapa lama waktu yang diperlukan aplikasi Anda untuk
memuat data.
Jika tahu persis asal data, Anda mungkin bisa mengoptimalkan dengan memuatnya sendiri. Jika
data disediakan oleh penyedia materi, Anda mungkin tidak tahu backend-nya, dan mungkin tidak
tahu apakah untuk pengguna tertentu akan ada data dalam jumlah kecil atau besar.
Solusinya adalah memuat sebagian besar atau semua data Anda di latar belakang, selagi
menampilkan informasi yang relevan, yang disimpan secara lokal, kepada pengguna. Misalnya,
Anda bisa menampilkan pada mereka informasi cuaca terbaru dalam cache, hingga mendapatkan
informasi baru yang menampilkan cuaca saat ini untuk lokasi saat ini.
Loader adalah kelas keperluan khusus yang mengelola pemuatan dan pemuatan ulang asinkron di
latar belakang dengan menggunakan AsyncTask.
Loader yang diperkenalkan di Android 3.0 memiliki karakteristik ini:
Dalam bab sebelumnya Anda telah mempelajari tentang AsyncTask sebagai kelas serba guna
untuk melakukan pekerjaan di latar belakang, dan menggunakan AsyncTaskLoader untuk
menjaga data tetap tersedia bagi pengguna melalui perubahan konfigurasi.
Walaupun Anda bisa membuat loader khusus dengan menjadikan kelas Loader sebagai subkelas,
kerangka kerja Android menyediakan CursorLoader yang langsung bisa digunakan dan berlaku
untuk banyak kasus penggunaan. CursorLoader memperluas AsyncTaskLoader agar secara
khusus bekerja dengan penyedia materi, sehingga banyak menghemat pekerjaan Anda.
Perhatikan, loader khusus bisa dibangun. Namun, karena sistem Android menyediakan solusi
elegan yang banyak menghemat pekerjaan, pertimbangkan cara Anda menggunakannya seperti
yang sudah ditentukan sebelum mengimplementasikan solusi sendiri dari awal. Sebelum menulis
loader sendiri, selalu pertimbangkan apakah Anda bisa memperbaiki desain aplikasi untuk
bekerja dengan CursorLoader.
Arsitektur loader
Seperti yang ditampilkan dalam diagram di bawah ini, loader akan mengganti panggilan kueri
resolver materi ke penyedia materi. Diagram menampilkan versi sederhana dari arsitektur
aplikasi bersama sebuah loader. Loader melakukan kueri untuk item dalam latar belakang.
Loader mengamati data untuk Anda, dan jika data berubah, loader secara otomatis mendapatkan
rangkaian data baru dan menyerahkannya ke adapter.
Mengimplementasikan CursorLoader
Aplikasi yang menggunakan loader biasanya menyertakan yang berikut ini:
LoaderManager
LoaderManager adalah kelas praktis yang mengelola semua loader Anda. Anda hanya perlu satu
pengelola loader per aktivitas dan secara umum mendapatkannya pada onCreate() aktivitas,
tempat mendaftarkan loader yang akan Anda gunakan.
Pengelola loader menangani pendaftaran sebuah observer pada penyedia materi, yang akan
menerima callback bila data di penyedia materi berubah.
Satu-satunya panggilan untuk pengelola loader yang perlu Anda buat adalah untuk mendaftarkan
loader, dan memulainya lagi saat Anda harus membuang semua data yang dimuat. Parameter
pertama adalah ID loader, yang kedua adalah argumen opsional, dan yang ketiga adalah konteks
tempat callback didefinisikan.
LoaderManager.LoaderCallbacks
onCreateLoader()
Callback ini membuat instance dan mengembalikan instance loader baru dengan tipe yang
diinginkan. Karena pengelola loader bisa mengelola beberapa loader sekaligus, argumen ID akan
mengidentifikasi loader yang akan dibuat instance-nya. Setelah dibuat, loader akan mulai
memuat data, dan akan mengamati tanggal perubahan Anda, serta memuat ulang jika diperlukan.
uri—URI untuk materi yang diambil dari penyedia materi. URI mengidentifikasi
penyedia materi dan data yang akan diamati loader.
projection — Daftar kolom yang akan dikembalikan. Meneruskan nol akan
mengembalikan semua kolom, jadi tidak efisien.
selection — Filter yang mendeklarasikan baris yang akan dikembalikan, diformat sebagai
klausa WHERE dari SQL (tidak termasuk WHERE itu sendiri). Meneruskan nol akan
mengembalikan semua baris untuk URI yang diberikan.
selectionArgs — Anda dapat menyertakan ?s dalam selection, yang akan digantikan
dengan nilai dari selectionArgs, agar muncul dalam selection. Nilai-nilai akan diikat
sebagai String.
sortOrder — Cara menyusun baris, diformat sebagai klausa ORDER BY dari SQL (tidak
termasuk ORDER BY itu sendiri). Meneruskan nol akan menggunakan urutan sortir
default, yang mungkin tidak berurutan.
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String queryUri = CONTENT_URI.toString();
String[] projection = new String[] {CONTENT_PATH};
return new CursorLoader(this, Uri.parse(queryUri),
projection, null, null, null);
}
onLoadFinished()
Menetapkan apa yang terjadi dengan data setelah loader mendapatkannya. Dalam fungsi ini
Anda harus:
Loader kursor memantau data untuk Anda, jadi Anda tidak perlu, dan tidak seharusnya dalam
keadaan apa pun, melakukannya sendiri.
Loader juga membersihkannya sendiri setelah dirinya sendiri, jadi Anda tidak perlu menutup
kursor.
Jika Anda menggunakan RecyclerView untuk menampilkan data, yang perlu Anda lakukan
hanyalah meneruskan data ke adapter bila pemuatan atau pemuatan ulang selesai.
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.setData(cursor);
}
onLoaderReset()
Dipanggil bila loader yang dibuat sebelumnya akan disetel ulang, sehingga datanya tidak
tersedia. Anda harus membersihkan semua referensi ke data di saat ini. Lagi, jika Anda
meneruskan data ke adapter untuk ditampilkan dalam RecyclerView, adapter akan melakukan
pekerjaan sebenarnya, Anda hanya perlu menginstruksikannya.
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.setData(null);
}
Dalam praktiknya, Anda menggunakan RecyclerView yang dikendalikan oleh adapter untuk
menampilkan data yang diambil oleh loader. Setelah menerima data, loader menyerahkannya ke
adapter melalui, misalnya, panggilan setData(). Metode setData() memperbarui variabel instance
dalam adapter yang berisi set data terbaru, dan memberi tahu adapter bahwa ada data baru.
Manfaat kursor
Anda mungkin sudah mengetahui bahwa database menggunakan kursor, penyedia materi
menggunakan kursor, loader juga menggunakan kursor. Dengan menggunakan tipe data yang
sama di seluruh backend, dan hanya mengekstraknya dalam adapter, tempat isi kursor
dipersiapkan untuk ditampilkan, akan membuat backend seragam dengan antarmuka yang bersih.
Hal ini akan memudahkan penulisan kode, memudahkan pengujian, dan memudahkan debug.
Hal ini juga membuat kode lebih sederhana dan lebih pendek.
Lengkapi aplikasi dengan metode
Diagram berikut menampilkan metode dan tipe data yang menghubungkan aneka bagian aplikasi
yang menggunakan:
Kotak warna hijau menampilkan tumpukan panggilan dan perjalanan kursor melalui beberapa
layer aplikasi untuk query(). Perhatikan bagaimana penyisipan, penghapusan, dan pembaruan
tetap ditangani oleh resolver materi. Akan tetapi, loader akan memberitahukan setiap perubahan
yang buat oleh operasi penyisipan, penghapusan, atau pembaruan, dan akan memuat ulang data
bila diperlukan.
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Loader
Menjalankan kueri bersama CursorLoader
Kelas CursorLoader
Izin
Kinerja
Praktik terbaik keamanan
Sekarang Anda telah mempelajari keterampilan inti mendasar yang diperlukan untuk
membangun aplikasi Android. Pelajaran ini membahas praktik terbaik yang berkaitan dengan
izin, kinerja dan keamanan. Pelajaran ini tidak berisi praktik yang bersangkutan.
Izin
Saat melakukan praktik, ada saatnya aplikasi Anda perlu mendapatkan izin untuk melakukan
sesuatu, termasuk saat memerlukannya untuk:
menghubungkan ke Internet.
menggunakan penyedia materi di aplikasi lain.
Bagian ini memberikan ringkasan tentang izin sehingga Anda memahami bagaimana dan kapan
aplikasi perlu meminta izin agar bisa berfungsi dan bertindak.
Aplikasi bebas menggunakan sumber daya atau data yang dibuatnya, namun harus mendapatkan
izin untuk menggunakan sesuatu—data, sumber daya, perangkat keras, perangkat lunak—yang
bukan miliknya. Misalnya, aplikasi Anda harus mendapatkan izin untuk membaca data Kontak
milik pengguna, atau menggunakan kamera perangkat. Wajar jika aplikasi memerlukan izin
untuk membaca Kontak pengguna, namun Anda mungkin bertanya-tanya mengpa perlu izin
untuk menggunakan kamera. Hal ini karena perangkat keras kamera bukan milik aplikasi, dan
aplikasi Anda harus selalu mendapatkan izin untuk menggunakan apa pun yang bukan bagian
dari aplikasi itu sendiri.
Meminta izin
Untuk meminta izin, tambahkan atribut <uses-permission> ke file manifes Android, bersama
nama izin yang diminta. Misalnya, untuk mendapatkan izin menggunakan kamera:
<uses-permission android:name="android.permission.CAMERA"/>
Contoh izin
Kerangka kerja Android menyediakan lebih dari 100 izin yang telah didefinisikan sebelumnya.
Ini termasuk beberapa hal yang sudah jelas, antara lain izin untuk mengakses atau menulis data
pribadi pengguna seperti:
membaca dan menulis daftar Kontak, kalender, atau pesan suara milik pengguna
mengakses lokasi perangkat
mengakses data dari sensor tubuh
Sebagian izin lain yang telah didefinisikan sebelumnya kurang jelas, seperti izin untuk
mengumpulkan statistik baterai, izin untuk menghubungkan ke internet, dan izin untuk
menggunakan perangkat keras seperti perangkat keras sidik jari atau kamera.
Android menyertakan beberapa izin yang telah didefinisikan sebelumnya untuk inisialisasi
panggilan telepon tanpa mengharuskan pengguna mengonfirmasinya, membaca log panggilan,
mengambil keluaran video, mem-boot ulang perangkat, mengubah tanggal dan zona waktu, dan
banyak lagi yang lainnya.
Izin normal adalah untuk tindakan yang tidak memengaruhi privasi pengguna atau data
pengguna, seperti menghubungkan ke Internet.
Izin berbahaya adalah untuk aksi yang memengaruhi privasi pengguna atau data pengguna,
seperti izin untuk menulis ke pesan suara pengguna.
Android secara otomatis memberikan izin normal namun meminta pengguna untuk memberikan
izin berbahaya secara eksplisit.
Catatan: Aplikasi harus mencantumkan semua izin yang digunakan dalam manifes Android,
bahkan izin normal.
Jika aplikasi dibuat untuk versi Android sebelum 6.0 (Marshmallow) atau berjalan pada
perangkat yang menggunakan versi Android sebelum Marshmallow, Google Play akan meminta
pengguna untuk memberikan izin berbahaya yang diperlukan sebelum memasang aplikasi.
Jika pengguna berubah pikiran dan ingin menolak izin ke aplikasi setelah dipasang, satu-satunya
hal yang bisa dilakukan adalah dengan mencopot pemasangan aplikasi.
Jika aplikasi dibuat untuk versi Android dari Android 6.0 (Marshmallow) dan selanjutnya dan
sedang berjalan pada perangkat yang menggunakan versi Android dari Marshmallow dan
selanjutnya, maka Google Play tidak akan meminta pengguna untuk memberikan izin berbahaya
pada aplikasi sebelum memasangnya. Sebagai gantinya, bila pengguna mulai melakukan sesuatu
di aplikasi yang memerlukan level izin tersebut, Android akan menampilkan kotak dialog yang
meminta pengguna untuk memberikan izin.
Pengguna bisa memberikan atau mencabut izin individual kapan saja. Mereka melakukannya
dengan masuk ke Settings App, memilih Apps, dan memilih aplikasi yang relevan. Di bagian
Permissions, mereka bisa mengaktifkan atau menonaktifkan izin yang digunakan aplikasi.
Perbedaan dalam model izin memengaruhi developer
Dalam model izin "lama", Google Play dan Kerangka Kerja Android bekerja sama untuk
mendapatkan izin dari pengguna. Developer tinggal memastikan aplikasi mencantumkan izin
yang diperlukan dalam file manifes Android. Developer bisa beranggapan bahwa jika aplikasi
dijalankan, berarti pengguna telah memberikan izin. Developer tidak perlu menulis kode untuk
memeriksa apakah izin telah diberikan atau tidak.
Dalam model izin "baru", Anda tidak bisa lagi beranggapan bahwa jika aplikasi dijalankan
berarti pengguna telah memberikan izin yang diperlukan. Pengguna bisa memberikan izin saat
pertama menjalankan aplikasi, kemudian, kapan saja, mereka berubah pikiran dan mencabut
salah satu atau semua izin yang diperlukan aplikasi.
Jadi, aplikasi harus memeriksa apakah masih memiliki izin setiap kali melakukan sesuatu yang
memerlukan izin. Android SDK menyertakan API untuk memeriksa jika izin telah diberikan.
Inilah cuplikan kode untuk memeriksa apakah aplikasi memiliki izin untuk menulis ke kalender
pengguna:
Kerangka kerja Android untuk Android 6.0 (API level 23) menyertakan metode untuk memeriksa
dan meminta izin. Pustaka Dukungan juga menyertakan metode untuk memeriksa dan meminta
izin.
Kami menyarankan Anda menggunakan metode pustaka dukungan untuk menangani izin, karena
metode izin di pustaka dukungan menangani pemeriksaan versi Android yang dijalankan pada
aplikasi Anda, dan mengambil aksi yang tepat. Misalnya, jika perangkat pengguna menjalankan
versi lama, maka metode checkSelfPermission() di pustaka dukungan akan memeriksa
apakah pengguna sudah memberikan izin pada waktu proses, namun jika perangkat menjalankan
Marshmallow atau yang lebih baru, maka metode tersebut akan memeriksa apakah izin masih
diberikan, dan jika tidak, akan menampilkan dialog kepada pengguna untuk meminta izin.
Pelajaran ini tidak membahas secara detail tentang cara menggunakan API untuk menangani izin.
Lihat Meminta Izin pada Waktu Proses untuk detailnya.
Bila aplikasi meminta izin terlalu banyak, pengguna akan curiga. Pastikan aplikasi Anda hanya
meminta izin untuk fitur dan tugas yang benar-benar diperlukannya, dan pastikan pengguna
memahami alasan diperlukannya izin tersebut.
Bila memungkinkan, gunakan Maksud sebagai ganti meminta izin untuk melakukannya sendiri.
Misalnya, jika aplikasi Anda perlu menggunakan kamera, kirim Maksud ke aplikasi kamera, dan
dengan cara itu aplikasi kamera akan melakukan semua pekerjaan untuk Anda dan aplikasi tidak
perlu mendapatkan izin untuk menggunakan kamera (dan itu akan lebih memudahkan Anda
menulis kode daripada jika mengakses API kamera secara langsung).
Kinerja
Anda telah berusaha membuat aplikasi yang paling bermanfaat, menarik, dan indah. Akan tetapi,
untuk membuatnya tampil beda, Anda juga harus menjadikannya sekecil, secepat, dan seefisien
mungkin. Pertimbangkan kemungkinan dampak aplikasi Anda pada baterai, memori, dan ruang
disk perangkat. Dan yang terpenting, pertimbangkan paket data pengguna. Saran berikut ini
hanya bagian kecil dari masalah kinerja, namun ini akan memberi Anda ide untuk memulai.
Kursus ini sudah membahas tentang memindahkan pekerjaan dari thread utama ke latar belakang
untuk membantu menjaga UI tetap lancar dan responsif bagi pengguna. Perangkat keras yang
merender tampilan ke layar biasanya memperbarui layar setiap 16 milidetik, jadi jika thread
utama melakukan pekerjaan yang memerlukan waktu lebih lama dari 16 milidetik, aplikasi
mungkin akan melewatkan bingkai, tersendat, atau mogok, semua itu mungkin akan
mengganggu pengguna Anda.
Anda bisa memeriksa seberapa baik aplikasi Anda di layar rendering dalam batas 16 milidetik
dengan menggunakan alat (bantu) Profile GPU Rendering di perangkat Android Anda.
Catatan: Anda bisa menjalankan alat (bantu) pada emulator, hanya untuk mencobanya, namun
data tersebut tidak menunjukkan cara kerja aplikasi pada perangkat sesungguhnya.
Buka aplikasi Anda, dan amati bilah berwarna.
Satu bilah menyatakan satu layar yang dirender. Jika bilah berada di atas garis hijau, berarti
butuh waktu lebih dari 16 md untuk merender. Warna bilah menyatakan beragam tahapan
merender layar.
Baca tentang cara menafsirkan hasil dan maksud beragam tahapan dalam Menganalisis dengan
Profile GPU Rendering. Jika Anda menghabiskan waktu menggunakan alat (bantu) Profile GPU
rendering di aplikasi, hal itu akan membantu mengidentifikasi bagian interaksi UI mana yang
lebih lambat dari perkiraan, kemudian Anda bisa mengambil aksi untuk meningkatkan kecepatan
UI aplikasi.
Misalnya, jika bagian bilah Input hijau besar, berarti aplikasi menghabiskan banyak waktu untuk
menangani kejadian masukan, yaitu mengeksekusi kode yang dipanggil sebagai hasil callback
kejadian masukan. Untuk memperbaikinya, pertimbangkan waktu dan cara meminta masukan
pengguna, dan apakah Anda bisa menanganinya dengan lebih efisien.
Sederhanakan UI Anda
Kursus ini telah membahas tentang cara membuat aplikasi menjadi menarik dan memikat secara
visual dengan menggunakan pedoman desain material dan mengajari Anda cara menggunakan
Layout Editor untuk membuat layout. Anda telah mengetahui bahwa Anda bisa membuat hierarki
layout tersarang. Anda telah mengetahui cara menggunakan sumber daya dapat digambar sebagai
elemen latar belakang untuk tampilan. Elemen ini memungkinkan Anda membuat layout yang
disarangkan secara kompleks dengan berbagai latar belakang dan tampilan yang tumpang tindih
satu sama lain di seluruh bagian aplikasi.
Akan tetapi, layout Anda akan digambar lebih cepat dan menggunakan daya baterai lebih sedikit
daya jika Anda menghabiskan waktu untuk mendesainnya dengan cara yang paling efisien.
Cobalah hindari:
Layout yang disarangkan terlalu dalam—Jika layout Anda sempit dan dalam, sistem
Android harus melakukan banyak penerusan untuk menata semua tampilan daripada jika
hierarki tampilan Anda lebar dan dangkal. Pertimbangkan cara menggabung, meratakan,
atau bahkan menghilangkan tampilan.
Tampilan tumpang tindih—hal ini mengakibatkan "overdraw", yakni aplikasi
memboroskan waktu untuk menggambar piksel yang sama beberapa kali, dan hanya
tampilan terakhir yang terlihat oleh pengguna. Pertimbangkan cara mengukur dan
mengatur tampilan sehingga setiap piksel hanya digambar sekali atau dua kali.
Sederhanakan layout
Pastikan layout Anda hanya menyertakan tampilan dan fungsi yang diperlukan aplikasi. Bagi
pengguna, layout sederhana umumnya lebih menarik secara visual, dan digambar lebih cepat,
sehingga memberi Anda keuntungan ganda.
Ratakan layout sebisa mungkin, sehingga mengurangi jumlah level yang disarangkan di hierarki
tampilan aplikasi Anda. Misalnya, jika layout berisi LinearLayout di dalam LinearLayout di
dalam LinearLayout, Anda mungkin bisa menyusun semua tampilan di dalam satu
ConstraintLayout.
Bayangkan mengecat pintu rumah Anda dengan warna merah. Kemudian Anda cat lagi dengan
warna hijau. Lalu dicat lagi dengan warna biru. Akhirnya, satu-satunya warna yang terlihat
adalah biru, namun Anda memboroskan banyak energi untuk mengecat pintu beberapa kali.
Setiap layout di aplikasi Anda seperti pintu tersebut. Aplikasi memerlukan waktu setiap kali
"mengecat" (menggambar) piksel. Jika layout memiliki tampilan tumpang tindih, maka aplikasi
Anda menggunakan waktu dan sumber daya untuk terus-menerus menggambar piksel. Coba
kurangi jumlah waktu yang digunakan aplikasi Anda untuk menggambar piksel secara
berlebihan, dengan mengurangi tampilan tumpang tindih. Berhati-hatilah dalam menggunakan
latar belakang yang dapat digambar pada tampilan tumpang tindih dan hanya gunakan bila
terlihat.
Android Studio memiliki alat (bantu) untuk mengukur penggunaan memori, GPU, CPU, dan
kinerja jaringan oleh aplikasi. Aplikasi yang mogok sering kali berkaitan dengan kebocoran
memori, yang terjadi bila aplikasi mengalokasikan memori dan tidak membebaskannya. Jika
aplikasi Anda mengalami kebocoran memori, atau menggunakan memori lebih banyak daripada
yang disediakan perangkat, pada akhirnya aplikasi akan menggunakan semua memori yang
tersedia pada perangkat. Gunakan alat (bantu) Memory Monitor yang disertakan bersama
Android Studio untuk mengamati cara aplikasi menggunakan memori.
1. Di Android Studio, di bagian bawah jendela, klik tab Android Monitor. Secara default
ini akan membuka logcat.
2. Klik tab Monitors di sebelah logcat. Gulir atau perbesar jendela untuk melihat keempat
monitor: Memori, CPU, Jaringan, dan GPU.
3. Jalankan aplikasi Anda dan berinteraksilah dengannya. Monitor akan diperbarui untuk
mencerminkan penggunaan sumber daya oleh aplikasi. Perhatikan, untuk mendapatkan
data yang akurat, Anda harus melakukannya pada perangkat fisik, bukan virtual.
Baca laman Android Monitor untuk mengetahui selengkapnya tentang penggunaan monitor.
Alat:
Akan tetapi, sebagai developer aplikasi, Anda bertanggung jawab memastikan aplikasi
memperlakukan data pengguna secara aman dan berintegritas. Aplikasi Anda juga bertanggung
jawab menjaga keamanan data miliknya.
Pelajaran ini sudah membahas cara Android menggunakan izin untuk memastikan aplikasi tidak
bisa mengakses data pribadi pengguna tanpa seizin mereka. Namun sekalipun pengguna
mengizinkan aplikasi Anda mengakses data pribadi mereka, jangan melakukannya kecuali jika
benar-benar diperlukan. Dan jika Anda melakukannya, perlakukan data dengan integritas dan
rasa hormat. Misalnya, hanya karena pengguna mengizinkan aplikasi untuk memperbarui
kalender, bukan berarti Anda diizinkan menghapus semua entri kalender mereka.
Aplikasi Android beroperasi atas dasar kepercayaan tersirat. Pengguna percaya bahwa aplikasi
akan menggunakan data mereka dengan cara yang wajar dalam konteks aplikasi.
Jika aplikasi Anda berupa aplikasi perpesanan, kemungkinan pengguna akan memberikan izin
untuk membaca kontak mereka. Itu tidak berarti aplikasi Anda diizinkan membaca semua kontak
pengguna dan mengirim pesan spam ke semua orang.
Aplikasi Anda hanya boleh membaca dan menulis data pengguna bila benar-benar diperlukan,
dan hanya dengan cara yang diperkirakan oleh pengguna. Setelah aplikasi membaca data privat,
Anda harus menjaga data tersebut tetap aman dan jangan sampai bocor. Jangan berbagi data
privat dengan aplikasi lainnya.
Bergantung pada cara aplikasi menggunakan data pengguna, Anda juga mungkin perlu
menyediakan pernyataan tertulis mengenai praktik privasi bila mempublikasikan aplikasi di
Google Play store.
Ketahuilah bahwa data yang diperoleh, diunduh, atau dibeli pengguna di aplikasi Anda adalah
milik mereka, dan aplikasi harus menyimpannya dengan cara yang tetap memungkinkan akses
pengguna, bahkan jika pengguna mencopot pemasangannya.
Penting: Log adalah sumber daya bersama di semua aplikasi. Aplikasi yang memiliki izin
READ_LOGS bisa membaca semua log. Jangan menulis data privat pengguna ke log.
Wi-Fi Umum
Banyak orang menggunakan aplikasi seluler melalui Wi-Fi umum. Kapan terakhir kali Anda
mengakses Internet dari ponsel melalui Wi-Fi umum di kedai kopi, bandara, atau stasiun kereta
api?
Desainlah aplikasi Anda untuk melindungi data pengguna bila mereka terhubung ke Wi-Fi
umum. Gunakan https daripada http bila memungkinkan untuk menghubungkan ke situs web.
Enkripsilah data pengguna yang akan ditransmisikan, bahkan data yang mungkin tampak polos
seperti nama mereka.
Jika aplikasi menerima masukan (dan hampir setiap aplikasi melakukannya!), Anda perlu
memastikan bahwa masukan tersebut tidak membawa sesuatu yang berbahaya.
Jika aplikasi menggunakan kode asli, membaca data dari file, menerima data melalui jaringan,
atau menerima data dari sumber eksternal, maka aplikasi Anda berpotensi menimbulkan masalah
keamanan. Masalah paling umum adalah buffer meluap, pointer bergetar, dan off-by-one error
atau OBOE. Android menyediakan sejumlah teknologi yang mengurangi tingkat eksploitasi
kesalahan ini, namun tidak memecahkan masalah pokoknya. Anda bisa menghindari celah
keamanan ini dengan menangani pointer dan mengelola buffer secara hati-hati.
Jika aplikasi mengizinkan pengguna untuk memasukkan kueri yang dikirimkan ke database SQL
atau penyedia materi, Anda harus mewaspadai injeksi SQL. Inilah teknik yang memungkinkan
pengguna jahat bisa menyuntikkan perintah SQL ke dalam pernyataan SQL dengan memasukkan
data dalam bidang. Perintah SQL yang disuntikkan bisa mengubah pernyataan SQL dan
mengganggu keamanan aplikasi serta database.
Bacalah tentang penggunaan kueri berparameter untuk melindungi terhadap injeksi SQL di
bagian penyedia materi pada panduan Tips Keamanan.
Hal lain yang bisa dilakukan untuk membatasi risiko injeksi SQL adalah menggunakan atau
memberikan izin READ_ONLY atau WRITE_ONLY untuk penyedia materi.
WebViews
Salah satu kelas View di Android adalah WebView yang menampilkan laman web.
Kursus ini tidak membahas WebView, namun Anda mungkin telah menemukan dan mencobanya
sendiri. Kami menyebutkannya di sini karena meskipun sangat keren untuk menampilkan laman
web dengan cepat di aplikasi, WebView membawa masalah keamanan.
Karena WebView mengonsumsi materi web yang bisa berisi HTML dan JavaScript, maka bisa
mengakibatkan masalah keamanan web umum seperti penulisan skrip lintas situs (injeksi
JavaScript).
Secara default, WebView tidak menyediakan widget seperti browser, tidak mengaktifkan
JavaScript, dan mengabaikan kesalahan laman web. Jika tujuan Anda hanya untuk menampilkan
beberapa HTML sebagai bagian dari UI, maka hal itu bisa diterima asalkan pengguna tidak perlu
berinteraksi dengan laman web sesudah membacanya, dan laman web tidak perlu berinteraksi
dengan pengguna. Jika Anda ingin web browser berfungsi penuh, panggil aplikasi Browser
dengan Maksud URL, bukan menampilkan laman dengan WebView. Ini juga merupakan opsi
yang lebih aman daripada memperluas kelas WebView dan mengaktifkan fitur seperti JavaScript.
Keamanan, seperti hal kinerja, adalah topik besar yang tidak bisa dibahas dalam beberapa
paragraf. Anda bertanggung jawab memperlakukan data pengguna dengan hati-hati dan menjaga
keamanannya setiap saat. Gunakan sumber daya di bawah ini untuk Anda pelajari sebanyak
mungkin tentang memperlakukan pengguna dan data mereka dengan perhatian tertinggi.
Tips keamanan
Validasi masukan
Tips keamanan untuk penyedia materi
Firebase
o Mulai dengan Firebase
o Firebase Analytics
o Firebase Notifications
o Demo Firebase
AdMob
Firebase, serangkaian alat (bantu) untuk developer aplikasi web dan seluler
Menghasilkan uang dari aplikasi Android Anda
Firebase
Firebase adalah serangkaian alat (bantu) untuk developer aplikasi, namun bukan hanya untuk
developer aplikasi Android. Ini untuk developer aplikasi iOS dan juga developer aplikasi web.
Akan tetapi, karena kursus ini adalah tentang development Android, pelajaran ini hanya
membahas tentang cara menggunakan Firebase dengan aplikasi Android.
Sebagai developer Android, Anda menggunakan Android Studio untuk membangun aplikasi,
namun Anda bisa menggunakan Firebase untuk menambahkan fitur ke aplikasi, mendapatkan
pengguna aplikasi yang lebih luas, menguji aplikasi, menghasilkan pendapatan dari aplikasi, dan
mendapatkan analisis tentang penggunaan aplikasi tersebut.
Bab ini tidak membahas segala sesuatu tentang Firebase, melainkan memperkenalkan Firebase,
membantu Anda memulai penggunaannya, dan menyoroti fitur penting yang mungkin ingin
digunakan.
Untuk menggunakan fitur Firebase bersama aplikasi Android, pertama buat proyek Firebase,
kemudian tambahkan aplikasi Android ke proyek Firebase.
Proyek adalah kontainer untuk aplikasi Anda di semua platform: Android, iOS, dan web. Anda
bisa memberi nama proyek Anda apa pun yang diinginkan; tidak perlu mencocokkan nama
aplikasi.
Langkah berikutnya adalah mengaitkan aplikasi Android dengan proyek Firebase Anda. Pertama,
dapatkan informasi yang Anda perlukan. Untuk menghubungkan Firebase ke aplikasi Android,
Anda perlu mengetahui nama paket yang digunakan di aplikasi. Sebaiknya buka dahulu aplikasi
Anda di Android Studio sebelum memulai proses.
Tools > Android SDK Manager > SDK Tools tab > Google Play services.
8. Salin atau pindahkan file itu ke dalam folder app proyek Anda di Android Studio. Wizard di
Firebase akan menampilkan lokasi untuk memasukkan file di Android Studio.
9. Di konsol Firebase, klik Continue. Layar sekarang akan menampilkan petunjuk untuk
memperbarui file build.gradle.
10. Di Android Studio, perbarui file build.gradle tingkat-proyek (Project: app) dengan versi
terbaru paket google-services (x.x.x adalah nomor versi terbaru. Lihat Panduan persiapan
Android untuk versi terbaru.)
11. buildscript {
12. dependencies {
13. // Add this line
14. classpath 'com.google.gms:google-services:x.x.x'
15. }
}
16. Di Android Studio, di file build.gradle tingkat-aplikasi (Modul: app), di bagian bawah,
terapkan plugin google-services.
Firebase Analytics
Anda bisa mengaktifkan Firebase Analytics di aplikasi untuk melihat data tentang cara dan lokasi
penggunaa aplikasi. Anda bisa melihat data seperti jumlah orang yang menggunakan aplikasi
Anda dari waktu ke waktu dan lokasi mereka menggunakannya di seluruh dunia.
Semua data yang dikirim aplikasi ke Firebase dianonimkan, jadi Anda tidak pernah melihat
identitas sebenarnya dari orang yang menggunakan aplikasi itu.
compile 'com.google.firebase:firebase-core:x.x.x'
Bila seseorang melakukan sesuatu di aplikasi Anda, seperti mengeklik tombol atau membuka
aktivitas lain, aplikasi akan membuat log kejadian Analytics. Ini berarti aplikasi akan
memaketkan data tentang kejadian yang berlangsung, dan memasukkannya dalam antrean untuk
dikirim ke Firebase.
Android mengirim kejadian Analytics dalam beberapa batch untuk meminimalkan penggunaan
jaringan dan baterai, seperti yang dijelaskan dalam entri blog ini. Secara umum, kejadian
Analytics dikirim kurang-lebih setiap jam atau lebih ke server, namun juga memerlukan waktu
tambahan bagi server Analytics untuk memproses data dan membuatnya tersedia untuk
dilaporkan di konsol Firebase.
Sewaktu mengembangkan dan menguji aplikasi, Anda tidak harus menunggu data muncul di
dasbor Analytics untuk memeriksa apakah aplikasi membuat log kejadian Analytics. Saat Anda
menggunakan aplikasi, pastikan logcat menampilkan pesan "Debug". Di log tersebut, carilah
pernyataan seperti ini:
Jenis pesan log ini menunjukkan bahwa kejadian Analytics telah dihasilkan. Dalam contoh ini,
kejadian Analytics dihasilkan saat SecondActivity dimulai.
Untuk melihat laporan Analytics, buka Konsol Firebase dan pilih Analytics. Dasbor akan dibuka
dengan menampilkan laporan untuk aplikasi Anda selama 30 hari terakhir.
Catatan: Tanggal akhir selalu Yesterday secara default. Untuk melihat statistik penggunaan termasuk
Today, ubah rentang tanggal default ke Today. Cari ikon kalender di bagian kanan atas layar dan ubah
rentang tanggal.
Analytics Default
Jumlah pengguna
Perangkat yang digunakan pengguna
Lokasi pengguna
Versi aplikasi
Interaksi pengguna
Dan lainnya
Untuk daftar lengkap laporan yang tersedia, lihat bantuan Firebase untuk Dasbor.
Inilah contoh laporan yang menampilkan jumlah orang yang menggunakan aplikasi dalam 30
hari terakhir:
Inilah contoh laporan yang menampilkan lokasi pengguna:
Untuk melihat data penggunaan aplikasi di luar laporan default, Anda perlu menambahkan kode
ke aplikasi untuk mengirim "kejadian Analytics" pada titik yang sesuai di aplikasi.
FirebaseAnalytics mFirebaseAnalytics;
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
Untuk mengirim data penggunaan di aplikasi, panggil logEvent() di instance
FireBaseAnalytics.
Anda bisa membuat log kejadian Analytics untuk kejadian yang telah didefinisikan sebelumnya
atau untuk kejadian khusus. Kejadian yang telah didefinisikan sebelumnya antara lain:
ADD_PAYMENT_INFO
ADD_TO_CART
LEVEL_UP
LOGIN
SIGN_UP
Misalnya, untuk mengirim kejadian Analytics bila pengguna membuka level berikutnya di
aplikasi, Anda bisa menggunakan kode seperti:
mFirebaseAnalytics.logEvent(LEVEL_UP, null);
Anda bisa mendalami kejadian yang telah didefinisikan sebelumnya dan parameternya dalam
dokumentasi referensi FirebaseAnalytics.Event dan FirebaseAnalytics.Param.
Baca selengkapnya tentang membuat log kejadian Analytics di panduan Pembuatan Log
Kejadian Analytics.
Firebase Notifications
Anda telah mengetahui di pelajaran sebelumnya cara mengaktifkan aplikasi untuk mengirim
notifikasi ke pengguna. Dengan menggunakan Konsol Firebase, Anda bisa mengirim notifikasi
ke semua pengguna, atau ke subset pengguna.
Ketik pesan di bagian Notifications pada konsol, pilih segmen pengguna yang akan dikirimi
pesan, kemudian kirimkan pesan.
Untuk mengirim pesan ke semua pengguna aplikasi, setel User Segment ke App, dan pilih paket
untuk aplikasi Anda.
Di belakang layar, Firebase menggunakan Firebase Cloud Messaging untuk mengirim notifikasi
ke perangkat yang ditargetkan, tempat aplikasi yang dipilih dipasang.
Namun bagaimana Anda berbagi data dengan seluruh klien seperti perangkat dan aplikasi yang
berbeda, termasuk Android, iOS, dan aplikasi web, serta memungkinkan mereka memperbarui
data dan semuanya tetap sinkron dengan data secara realtime? Karena inilah Anda memerlukan
repositori data berbasis awan yang terpusat.
Firebase menawarkan database yang menyediakan storage data berbasis awan, yang
memungkinkan klien untuk tetap sinkron saat data berubah. Jika aplikasi offline, data tetap
tersedia. Bila aplikasi terhubung kembali ke Internet, data akan disinkronkan dengan keadaan
database terbaru.
firebase.google.com/docs/database/
Firebase Realtime Database adalah database NoSQL. Data disimpan sebagai objek JSON. (Anda
telah menggunakan JSON dalam pelajaran tentang menghubungkan ke Internet.)
Anda bisa menganggap database sebagai pohon JSON yang di-host di awan. Tidak seperti
database SQL, tidak ada tabel atau catatan. Bila Anda menambahkan data ke pohon JSON, data
akan menjadi simpul di struktur JSON yang ada bersama kunci terkait.
Inilah contoh pohon JSON data yang menyimpan data tentang buku dan film:
{
"books": {
"book one": {
"title": "How to develop Android apps",
"author": "Jane Developer"
},
"book two": {
"title": "How to use Firebase",
"author": "Adam Writer"
},
"book three": {
"title": "How to search Google",
"author": "Ava Searcher"
}
},
"movies": {
"movie one": {
"title": "Saving the world",
"main role": "Super man"
},
"movie two": {
"title": "Saving the moon",
"main role": "Bat girl"
},
"movie three": {
"title": "Saving Mars",
"main role": "Martian dog"
}
}
}
Inilah contoh bagaimana data ini muncul di konsol Firebase Database:
Bila menulis kode untuk mengakses data di database, Anda mengambil item data berdasarkan
lokasinya. Lokasi data dibuat dengan melintasi pohon.
Anda bisa menggunakan Konsol Firebase untuk menampilkan dan memperbarui data di database.
Aplikasi Anda bisa menggunakan panggilan API untuk mendapatkan dan menyetel data di
database.
Anda juga bisa mengimpor dan mengekspor data di konsol. Untuk mengimpor data, Anda harus
memformat data sebagai JSON dan menyimpannya di file dengan ekstensi .json.
Hati-hati jika Anda mengimpor file JSON, karena akan menggantikan simpul data apa pun yang
didefinisikan di file yang sudah ada di database.
3. Untuk mengakses data dari aplikasi Android, gunakan metode di kelas DatabaseReference.
Cara termudah untuk membuat dan menangani data adalah dengan membuat objek Java yang
menyatakan data itu. Misalnya, Anda bisa membuat kelas Book:
public Book() {
// Default constructor is required
}
Untuk mengakses data dari aplikasi Android, gunakan metode di kelas DatabaseReference
untuk mengakses, membuat, dan memperbarui data. Kelas DatabaseReference menyatakan
referensi ke item data.
Misalnya:
Misalnya, anggaplah Anda ingin menambahkan buku baru ke database bersama detail berikut:
Untuk menambahkan buku baru ini ke serangkaian data contoh yang ditampilkan sebelumnya,
buat instance DatabaseReference, dan lakukan inisialisasi di metode onCreate() aktivitas
utama:
Definisikan metode untuk membuat objek Book baru dan tambahkan ke database pada simpul
"books":
Panggil metode addBook() seperti berikut untuk membuat item data baru di database:
Untuk mengetahui selengkapnya tentang membaca dan menulis data Firebase di aplikasi, lihat:
Kontrol akses
Firebase menyediakan serangkaian aturan untuk menentukan siapa yang diizinkan untuk
menampilkan dan memperbarui data di database Firebase. Pelajari cara membuat aturan di Mulai
dengan aturan Database.
Test Lab membuat pengujian yang disebut pengujian robo untuk Anda, dan Anda juga bisa
membuat dan menjalankan pengujian sendiri. Untuk menjalankan aplikasi Anda di Test Lab:
Di Mac, Anda bisa mengeklik Reveal in Finder untuk melihat lokasi APK.
6. Pilih Start N Tests di bagian kanan bawah matriks perangkat, dengan N adalah kombinasi valid
untuk perangkat dan API level yang dipilih.
7. Tampilkan laporan bila pengujian selesai.
Seperti halnya menjalankan pengujian "robo" yang dibuat secara otomatis, Anda juga bisa
menjalankan pengujian instrumentasi sendiri, yakni pengujian yang Anda tulis secara khusus
untuk menguji aplikasi Anda. Misalnya, Anda bisa menjalankan pengujian Espresso di Test Lab.
Bila Anda menulis pengujian instrumentasi, buat APK kedua untuk mengunggah ke Test Lab
bersama APK aplikasi.
Demo Firebase
Ada proyek demo Firebase umum yang bisa Anda gunakan untuk menjelajahi Konsol Firebase.
Proyek demo Firebase adalah proyek Firebase standar dengan analitik yang berfungsi penuh,
pelaporan kerusakan, lab pengujian, dan banyak lagi. Siapa saja yang memiliki akun Google bisa
mengaksesnya. Inilah cara bagus untuk melihat data aplikasi sebenarnya dan menyusuri
rangkaian fitur Firebase.
Anda tidak bisa mengirim notifikasi dari proyek demo karena tidak memiliki akses pemilik.
Anda juga tidak bisa melihat dan memodifikasi data di database.
Data di proyek demo adalah data sungguhan dari aplikasi yang disebut Flood-It. Anda bisa
mengunduh aplikasi ini dan menggunakannya untuk berkontribusi ke data sendiri. Flood-It
adalah permainan sederhana, di sini akan terlihat seberapa cepat Anda bisa menutupi papan
dengan satu warna. Flood-It dibuat oleh Lab Pixies, yang saat ini merupakan perusahaan milik
Google.
Lanjutkan dan unduh serta mainkan Flood-It jika suka, namun jangan lupa kembali dan terus
belajar! Dapatkan aplikasi Flood-It dari Google Play di sini.
Konsol Firebase
Tambahkan Firebase ke proyek Android Anda
Firebase codelab
Firebase Analytics
Firebase Notifications
Firebase Notifications
Database Firebase
Database Firebase
Persiapkan Firebase Realtime Database untuk Android
Membaca dan Menulis Data di Android
Pertama, Anda perlu membuat aplikasi yang bekerja dengan baik, cukup cepat, tidak mogok, dan
berguna atau menghibur. Aplikasi harus menarik sehingga pengguna tidak hanya ingin
memasang dan menggunakannya, melainkan ingin terus menggunakannya.
Dengan anggapan aplikasi Anda sudah sempurna dan menyediakan fitur berguna, menghibur,
atau menarik, ada beragam cara menghasilkan uang dari aplikasi tersebut.
Model monetisasi:
Aplikasi premium
Pengguna membayar di depan untuk mengunduh aplikasi premium. Untuk aplikasi yang
menyediakan fungsiolitas yang diinginkan kepada sedikit pengguna yang sangat ditargetkan,
menyertakan harga ke aplikasi bisa memberikan sumber pendapatan. Ketahuilah bahwa sebagian
pengguna akan menolak mengunduh aplikasi jika harus membayar, atau jika tidak bisa
mencobanya terlebih dahulu secara gratis. Jika pengguna bisa menemukan aplikasi lainnya yang
serupa dan tersedia gratis atau lebih rendah, mereka mungkin lebih memilih untuk mengunduh
dan mencoba tersebut.
Aplikasi freemium
Aplikasi "freemium" adalah kompromi antara aplikasi yang sepenuhnya gratis dengan aplikasi
yang mengenakan biaya pemasangan. Aplikasi tersebut tersedia untuk pemasangan gratis, baik
dengan fungsionalitas terbatas maupun selama durasi terbatas. Sasaran Anda untuk aplikasi
freemium seharusnya untuk meyakinkan pengguna terhadap nilai aplikasi tersebut, sehingga
setelah menggunakannya untuk sementara waktu, mereka akan bersedia membayar agar tetap
bisa menggunakannya atau untuk meningkatkan versi demi mendapatkan fitur lainnya.
Pernahkah Anda mengunduh aplikasi gratis, kemudian membayar untuk meningkatkan versi
demi fungsionalitas? Apa yang Anda sukai pada aplikasi tersebut sehingga bersedia
membayarnya?
Cara lain untuk menghasilkan uang dari aplikasi freemium adalah menyediakan pembelian
dalam aplikasi. Untuk game, aplikasi Anda mungkin menawarkan level materi baru dalam game,
atau item baru untuk membuatnya jadi lebih menyenangkan. Pikirkan tentang game seluler yang
pernah Anda mainkan. Manakah yang menawarkan pembelian dalam aplikasi dan untuk apa?
Pernahkah Anda membuat pembelian dalam aplikasi di aplikasi seluler?
Berlangganan
Pada model berlangganan, pengguna membayar biaya berkala untuk menggunakan aplikasi. Ini
sangat mirip dengan model premium, hanya saja pengguna membayar pada siklus penagihan
teratur, bukan sekali saja pada waktu pemasangan. Anda bisa mempersiapkan langganan agar
pengguna membayar setiap bulan atau setiap tahun. Jika Anda menyediakan aplikasi secara
berlangganan, pertimbangkan penawaran pembaruan materi teratur atau beberapa layanan
lainnya yang menjamin pembayaran berulang.
Jika Anda memutuskan untuk menawarkan aplikasi dengan model berlangganan, sebaiknya
biarkan pengguna mencobanya secara gratis. Banyak pengguna akan menolak memasang
aplikasi yang membuat mereka harus membayar sebelum mencoba untuk melihat apakah
aplikasi itu sesuai dengan kebutuhan.
Periklanan
Salah satu strategi monetisasi umum adalah menyediakan aplikasi gratis, namun menjalankan
iklan di dalamnya. Pengguna bisa menggunakan aplikasi Anda sebanyak yang mereka suka,
namun sesekali aplikasi akan menampilkan iklan.
Jika aplikasi Anda menampilkan iklan, selalu pertimbangkan pengguna. Jika aplikasi Anda
menampilkan begitu banyak iklan yang mengganggu pengguna, mereka mungkin berhenti
menggunakannya atau mencopot pemasangannya.
Mudah sekali menambahkan iklan ke aplikasi. Cara terbaik untuk memasukkan iklan ke dalam
aplikasi Anda adalah menggunakan AdMob.
AdMob
Google menyediakan alat bagi pengiklan untuk membuat iklan dan mendefinisikan kriteria target
iklan mereka. Untuk contoh kriteria target, iklan dapat ditargetkan untuk ditampilkan kepada
orang-orang di lokasi tertentu. Google memiliki banyak persediaan iklan untuk ditampilkan di
situs web dan aplikasi seluler. Anda bisa menampilkan iklan dari persediaan ini di aplikasi
dengan menggunakan AdMob (singkatan dari Ads on Mobile).
Untuk menampilkan iklan di aplikasi, tambahkan AdView di layout aktivitas dan tulis sedikit
kode boilerplate untuk memuat iklan. Bila pengguna menjalankan aplikasi Anda dan membuka
aktivitas, iklan itu akan muncul di AdView. Anda tidak perlu mempersoalkan pencarian iklan
yang akan ditampilkan karena Google yang akan menanganinya.
Google membayar Anda bila pengguna mengeklik iklan di aplikasi Anda. Jumlah persis yang
dibayarkan kepada Anda bergantung pada iklan yang ditampilkan, dan seberapa banyak
pengiklan bersedia membayar untuk iklan mereka. Jumlah total yang dibayarkan oleh pengiklan
dibagi antara Google dan penerbit situs web atau aplikasi tempat iklan itu muncul.
Google memiliki kebijakan yang mencegah penerbit situs web dan penerbit aplikasi mengeklik
iklan di situs web dan aplikasi mereka sendiri. Pengiklan membayar bila orang mengklik iklan
mereka, sehingga tidak adil bila Anda menampilkan iklan di aplikasi sendiri, kemudian
mengekliknya, dan menyebabkan pengiklan membayar Anda karena mengklik iklan di aplikasi
sendiri.
1. Di Konsol Firebase, pilih AdMob di navigasi kiri, kemudian pilih Sign Up For AdMob.
Untuk menampilkan iklan di aplikasi, Anda memerlukan ID aplikasi AdMob dan ID unit iklan.
Anda bisa mendapatkan keduanya di konsol AdMob.
Selagi mengembangkan dan menguji aplikasi, Anda bisa menampilkan dan menguji iklan untuk
memastikan aplikasi telah dipersiapkan dengan benar untuk menampilkan iklan. Saat menguji
iklan Anda perlu:
ID (EMEI) perangkat Anda untuk menjalankan pengujian iklan. Untuk mendapatkan ID perangkat:
o Buka Settings > About phone > status> IMEI.
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
ads:adUnitId="@string/banner_ad_unit_id">
</com.google.android.gms.ads.AdView>
Anda juga perlu menambahkan namespace ads ke tampilan akar layout:
<RootLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
…>
Kelas MobileAds menyediakan metode untuk melakukan inisialisasi iklan AdMob di aplikasi
Anda. Panggil MobileAds.initialize() di metode onCreate() aktivitas utama, dengan
meneruskan konteks dan ID aplikasi (yang diperoleh dari konsol AdMob).
// Initialize AdMob
MobileAds.initialize(this, "ca-app-pub-1234");
Di metode onCreate() aktivitas yang menampilkan iklan, tulis kode untuk memuat iklan.
Selagi mengembangkan dan menguji aplikasi, Anda bisa menampilkan iklan dalam mode
pengujian dengan menetapkan perangkat pengujian khusus. Untuk menampilkan iklan di
perangkat sendiri, Anda memerlukan ID (IMEI) perangkat, yang bisa diperoleh dari Settings >
About phone > Status> IMEI atau dengan memanggil *#06#.
Bila sudah siap menjalankan iklan sebenarnya, Anda harus membuat beberapa perubahan pada
cara Anda membuat objek AdRequest . Lihat Mulai dengan Android AdMob untuk informasi
selengkapnya mengenai tindakan yang perlu dilakukan.
Mendaftar AdMob
Anda juga bisa mengakses konsol AdMob dari tautan AdMob di Konsol Firebase)
Kebijakan AdMob
Tambahkan ID Aplikasi
Rangkuman akhir
Ketahui selengkapnya
Dalam praktik sebelumnya, Anda telah mempelajari tentang cara membangun dan menguji
aplikasi, dan sekarang saatnya mempelajari cara mempublikasikannya. Jadi, apa yang harus
Anda lakukan untuk mempublikasikan aplikasi? Bab ini membahas langkah-langkah tingkat
tinggi untuk mempublikasikan aplikasi Android ke Google Play Store, serta memperkenalkan
Google Play Developer Console, tempat Anda bisa mengunggah aplikasi ke Google Play. Bab ini
tidak mengajari Anda segala sesuatu yang perlu diketahui tentang Google Play Developer
Console. Namun kami berharap, setelah membaca bab ini, Anda akan tertarik untuk mengunggah
aplikasi dan mendalami semua fitur konsol yang berbeda.
Pikirkan tentang aplikasi favorit Anda. Apa yang Anda sukai pada aplikasi favorit tersebut?
Pikirkan tentang aplikasi yang telah Anda copot pemasangannya atau yang hampir tidak pernah
digunakan. Apa yang tidak Anda sukai pada aplikasi tersebut? Pikirkan tentang aplikasi yang
tertarik ingin sekali Anda dapatkan, namun kemudian kecewa ketika mulai menggunakannya.
Apa penyebab kekecewaan Anda?
Tugas tingkat tinggi untuk mempublikasikan aplikasi Anda ke Google Play Store adalah:
Anda bisa menggunakan Android Studio untuk membuat APK aplikasi. Sebelum membuat APK
untuk aplikasi, Anda perlu melakukan segala sesuatu yang Anda bisa untuk membuat aplikasi
berhasil, termasuk:
Tambahkan ikon.
Pilih ID Aplikasi.
Bila aplikasi benar-benar siap, Anda bisa mengunggah APK bertandatangan ke Google Play
Store.
Bagikan aplikasi Anda pada sesama teman developer. Buat file zip dan kirim ke developer
lainnya. Kemudian mereka bisa memuat aplikasi Anda ke Android Studio dan menjalankannya.
Setelah mengetahui cara kerja aplikasi seharusnya; Anda mendesain dan membangunnya. Anda
mengetahui "cara yang tepat" untuk menggunakan aplikasi tersebut. Akan tetapi, Anda tidak
akan percaya bahwa pengguna memiliki cara yang benar-benar kreatif untuk mencoba
menggunakan aplikasi, jadi pertimbangkanlah. Mereka mungkin mencoba menggunakan aplikasi
atau fiturnya dengan cara yang tidak terpikirkan oleh Anda, atau mungkin mengujinya dengan
cara yang belum pernah Anda gunakan. Dorong penguji untuk menguji aplikasi dengan cara
berbeda, mencoba mencapai sasaran berbeda, dan menggunakan jalur berbeda saat menyusuri
seluruh aktivitas. Hal ini akan membantu menangkap kesalahan, inkonsistensi, atau kegagalan
fungsionalitas yang tidak bisa Anda temukan karena sudah sangat familier dengan cara kerja
aplikasi yang demikian.
Pastikan Anda menjalankan pengujian formal pada aplikasi, termasuk pengujian unit dan
Espresso. Pengujian ini harus mencakup fitur inti aplikasi, dan poin integrasi utama tempat
aplikasi Anda memanggil API lain atau mendapatkan kembali data dari web. Inilah poin penting
untuk aplikasi Anda, dan mungkin poin itulah yang akan dirusak oleh kode.
Gunakan Firebase Test Lab untuk menjalankan aplikasi pada beragam macam perangkat
sungguhan di pusat data Google. Dengan cara ini, Anda bisa memverifikasi fungsionalitas dan
kompatibilitas aplikasi di berbagai jenis dan versi perangkat sebelum merilis aplikasi ke
pengguna yang lebih luas.
Pastikan aplikasi Anda menetapkan persyaratan yang sesuai untuk memastikan bahwa aplikasi
menjangkau pengguna yang tepat. Misalnya, jika aplikasi Anda memerlukan perangkat keras
biometrik untuk membaca sidik jari, maka tambahkan persyaratan tersebut di manifes Android.
<uses-feature android:name="android.hardware.fingerprint"/>
Akan tetapi, menetapkan bahwa aplikasi Anda memerlukan pembaca sidik jari akan membatasi
pengguna aplikasi pada orang-orang yang memiliki perangkat dengan pembaca sidik jari. Anda
harus berpikir dengan hati-hati sebelum menambahkan pembatasan ke manifes karena dapat
membatasi orang yang bisa melihat dan mengunduh aplikasi tersebut.
Jika aplikasi Anda benar-benar mengharuskan adanya atribut tertentu di perangkat pengguna,
maka pastikan menyertakan pembatasan tersebut ke manifes, untuk memastikan bahwa siapa saja
yang bisa menemukan dan mengunduh aplikasi Anda akan benar-benar bisa menjalankannya.
Orang sangat mungkin memberikan ulasan buruk pada aplikasi Anda jika setelah memasangnya
dan ternyata aplikasi tersebut tidak bisa dijalankan di perangkat mereka.
Anda bisa menetapkan apakah aplikasi menggunakan fitur perangkat keras, seperti:
sensor cahaya
<uses-feature android:name="android.hardware.sensor.light" />
gamepad
Anda bisa menetapkan apakah aplikasi mengharuskan perangkat memiliki fitur perangkat lunak
seperti:
<uses-sdk android:minSdkVersion="19">
Negara
Dalam proses mengunggah aplikasi ke Google Play, Anda bisa memilih di negara mana saja
aplikasi itu akan tersedia. Jika Anda menetapkannya, maka hanya pengguna di negara itu yang
bisa menemukan dan mengunduh aplikasi.
Bila pengguna telah memasang aplikasi, ikon peluncur akan muncul pada perangkat di beberapa
tempat, termasuk:
Di layar utama
Di Manage Applications
Di My Downloads
Baca panduan desain Ikon Peluncur untuk saran dalam mendesain aplikasi peluncur yang akan
mendorong pengguna menggunakan aplikasi Anda.
Tambahkan ID Aplikasi
ID Aplikasi secara unik mengidentifikasi aplikasi. Pastikan aplikasi Anda memiliki ID Aplikasi
yang akan selalu berbeda dari semua aplikasi lain yang mungkin telah dipasang pengguna di
perangkat mereka.
Bila Anda membuat proyek untuk aplikasi Android, Android Studio secara otomatis memberikan
ID Aplikasi ke proyek Anda. Nilai ini pada awalnya sama dengan paket untuk aplikasi. ID
Aplikasi didefinisikan dalam file build.gradle. Misalnya:
defaultConfig {
applicationId "com.example.android.materialme"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
Anda bisa mengubah ID Aplikasi untuk aplikasi. ID Aplikasi tidak harus sama dengan nama
paket aplikasi Anda. Pada saat mengerjakan praktik di kursus ini, Anda membuat salinan proyek
Android Studio. Setelah menyalin proyek, Anda mengubah ID Aplikasi untuk memastikannya
bersifat unik bila Anda memasang aplikasi itu di perangkat.
minSdkVersion — versi minimum platform Android yang akan digunakan untuk menjalankan
aplikasi.
targetSdkVersion — API level yang digunakan untuk menjalankan aplikasi yang didesain.
Anda bisa menyetel nilai-nilai ini dalam file manifes Android, juga dalam file build.gradle
tingkat aplikasi.
Catatan: Nilai di build.gradle akan menggantikan nilai di file manifes. Agar tidak membingungkan, kami
menyarankan agar Anda memasukkan nilai-nilai di build.gradle, dan buang nilai tersebut dari file
manifes. Menyetel atribut ini di build.gradle juga memungkinkan Anda menetapkan nilai yang berbeda
untuk versi aplikasi yang berbeda.
Bila aplikasi Anda siap dirilis, tinjaulah nilai API level target dan nomor versi serta pastikan
sudah benar. Orang tidak akan bisa menemukan aplikasi Anda di Google Play Store jika mereka
menggunakan perangkat yang SdkVersion-nya di bawah nilai yang ditetapkan di aplikasi.
Catatan: Nilai minSdkVersion dan targetSdkVersion merupakan API level, bukan nomor versi
OS Android.
Nomor versi
Anda perlu menetapkan nomor versi aplikasi. Saat meningkatkan aplikasi untuk menambahkan
fitur baru, Anda perlu memperbarui nomor versi setiap kali merilis versi baru ke Google Play
Store. Baca selengkapnya di panduan Versi Android.
Ragam Produk
Anda bisa menghasilkan "ragam produk" yang berbeda untuk aplikasi. Ragam produk adalah
versi pembangunan aplikasi yang disesuaikan. Misalnya, Anda bisa memiliki versi demo dan
versi produksi. Inilah contoh cara mendefinisikan ragam produk di build.gradle:
android {
...
productFlavors {
demo {
applicationId "com.example.myapp.demo"
versionName "1.0-demo"
}
full {
applicationId "com.example.myapp.full"
versionName "1.0-full"
}
}
}
Semakin besar ukuran APK aplikasi, semakin besar kemungkinan sebagian pengguna tidak akan
mengunduhnya karena pembatasan ukuran pada perangkat mereka atau pembatasan konektivitas.
Pengguna yang memiliki paket pembayaran berdasarkan kuota akan sangat mengkhawatirkan
durasi pengunduhan aplikasi. Jika aplikasi Anda menggunakan ruang yang terlalu banyak,
pengguna mungkin akan mencopot pemasangannya bila memerlukan ruang untuk aplikasi atau
file lainnya.
Lihat aplikasi di ponsel Android Anda sekarang. Aplikasi manakah yang paling banyak memakan
tempat? Jika kehabisan tempat di ponsel Android, unduhan aplikasi manakah yang akan Anda
copot pemasangannya?
Tidak ada sulap untuk meminimalkan ukuran APK aplikasi, umumnya yang perlu Anda lakukan
adalah berpikir logis. Misalnya:
File APK terdiri dari arsip ZIP yang berisi semua file yang dicakup oleh aplikasi Anda. File ini
meliputi file kelas Java, file sumber daya, dan file berisi sumber daya yang dikompilasi.
src: Folder ini berisi file sumber untuk aplikasi Anda. Buang file Java apa pun yang tidak
digunakan. Pastikan folder tidak berisi file .jar apa pun.
lib: Folder ini berisi file pustaka privat atau pihak ketiga, termasuk pustaka bersama yang telah
dibuat sebelumnya dan pustaka statis (seperti file .so). Pastikan Anda membuang file pustaka
yang tidak digunakan.
jni: Folder ini berisi file sumber asli yang terkait dengan Android Native Developer Kit, seperti file
.c, .cpp, .h, dan .mk.
res: Folder sub res berisi sumber daya seperti layout, warna, string, dan gaya yang digunakan
aplikasi Anda.
Catatan: Sewaktu mengembangkan aplikasi, boleh jadi mudah membuat sumber daya tambahan yang
pada akhirnya tidak digunakan aplikasi, jadi pastikan untuk memeriksa dan membuang sumber daya
yang tidak digunakan.
Selain itu, pastikan bahwa jika aplikasi mengakses server atau layanan jarak jauh, aplikasi akan
menggunakan URL atau jalur produksi untuk server atau layanan dan bukan URL atau jalur
pengujian. Demikian juga, banyak perusahaan dengan API publik yang memiliki izin pengujian
dan izin tingkat produksi. Pastikan juga keamanan atau sandi untuk mengakses server berada
pada tingkat produksi.
Pertama, pastikan aplikasi Anda tidak berisi sumber daya gambar yang tidak digunakan.
Untuk setiap gambar statis yang digunakan aplikasi, Anda perlu membuat versi terpisah dari
gambar itu untuk semua ukuran layar tempat aplikasi mungkin dijalankan. Akan tetapi, dalam
beberapa kasus, Anda bisa menggunakan objek Drawable, VectorDrawables, dan file 9-patch.
Jika aplikasi Anda menggunakan gambar statis, pastikan untuk mengecilkan file PNG, dan
memadatkan file PNG dan JPEG untuk meminimalkan ukurannya. Anda bisa menggunakan
Google untuk menelusuri alat (bantu) pengecilan, pemecahan, dan pemadatan gambar.
Pertimbangkan penggunaan format WebP untuk gambar. Android mendukung WebP dari
Android 4.0+.
Baca selengkapnya tentang cara mengurangi ukuran aplikasi di panduan Kurangi ukuran APK.
Catatan: Objek Drawable didefinisikan di XML. Android akan menggambarnya bila aplikasi perlu
menampilkannya, yang berarti aplikasi Anda tidak perlu menyimpan gambar untuk objek tersebut. Akan
tetapi, karena Android menghasilkannya bila diperlukan, maka perlu waktu lama untuk memunculkan
gambar di layar, jadi sebaiknya gunakan objek Drawable untuk gambar yang lebih kecil seperti ikon dan
logo. Objek Drawable tidak mendukung kompleksitas dan detail yang sama dengan yang bisa Anda
dapatkan pada bitmap.
Di Android 5.0 (API level 21) dan di atasnya, Anda bisa mendefinisikan sumber daya dapat
digambar untuk vektor, yakni gambar yang didefinisikan oleh suatu jalur. Sumber daya dapat
digambar untuk vektor menskalakan tanpa kehilangan definisi. Sebagian besar sumber daya
dapat digambar untuk vektor menggunakan file SVG, yaitu file teks biasa atau file biner
kompresi yang menyertakan koordinat dua dimensi sebagai cara menggambar pada layar. Karena
file SVG berupa teks, file tersebut menggunakan ruang lebih sedikit dibandingkan file gambar
lainnya. Selain itu, Anda hanya memerlukan satu file untuk gambar vektor sebagai ganti satu file
untuk setiap kepadatan layar.
Pertimbangkan kasus penggunaan gambar Anda, dan gunakan objek Drawable serta file 9-patch
bila memungkinkan. Lihat pelajaran Sumber Daya Dapat Digambar, Gaya, dan Tema di kursus
ini untuk informasi selengkapnya.
Bila menandatangani aplikasi, Android Studio akan membuat sertifikat publik dan kunci privat.
Android Studio melampirkan sertifikat publik ke APK. Anda harus menyimpan kunci privat
dalam keystore secara aman
Sertifikat kunci publik berfungsi sebagai "sidik jari" yang secara unik mengaitkan APK dengan
Anda dan kunci privat yang bersangkutan. Hal ini membantu Android memastikan bahwa
pembaruan mendatang untuk APK adalah otentik dan berasal dari Anda, penulis aslinya.
Untuk informasi tentang sertifikat digital, menyimpan kunci privat, dan menghasilkan APK
bertandatangan digital, lihat panduan Tanda Tangani Aplikasi Anda.
Setelah mengunggah aplikasi ke Google Play, Anda bisa menjalankan pengujian alfa dan beta
sebelum merilisnya ke publik. Menjalankan pengujian alfa dan beta memungkinkan Anda
berbagi aplikasi dengan pengguna sungguhan, dan mendapatkan masukan dari mereka. Masukan
ini tidak muncul sebagai ulasan di Google Play.
Jalankan pengujian alfa sewaktu Anda mengembangkan aplikasi. Gunakan pengujian alfa untuk
versi eksperimen awal dari aplikasi yang mungkin berisi fungsionalitas tidak lengkap atau tidak
stabil. Menjalankan pengujian alfa juga merupakan cara yang baik untuk berbagi aplikasi Anda
dengan teman dan keluarga.
Jalankan pengujian beta dengan pengguna sungguhan dalam jumlah terbatas, untuk melakukan
pengujian akhir sebelum aplikasi dipublikasikan.
Setelah aplikasi dipublikasikan, pengguna bisa memberikan ulasan. Jadi, pastikan Anda menguji
aplikasi secara menyeluruh sebelum dimasukkan ke Google Play untuk diunduh siapa saja.
Untuk memulai, dapatkan akun developer Google Play. Anda perlu membayar untuk akun
tersebut. Langkah-langkah tingkat tinggi adalah:
1. Buka play.google.com/apps/publish/
2. Terima perjanjian.
4. Masukkan detail, seperti nama, alamat, situs web, telepon, dan preferensi email Anda.
Bila telah mempersiapkan akun, Anda bisa mengunggah APK. Dalam antarmuka Google Play
Developer Console, pilih:
Production
Beta Testing
Alpha Testing
Kemudian Anda bisa menjelajah ke APK yang akan diunggah, atau menyeret dan melepasnya ke
konsol.
Anda perlu memenuhi persyaratan berikut sebelum bisa mempublikasikan aplikasi ke publik:
memilih kategori
Daftar ini mungkin terlihat panjang, namun Google Play Developer Console membantu Anda
mengetahui apakah aplikasi siap diluncurkan. Klik tautan "Why can't I publish?" untuk
mengetahui apa lagi yang perlu dilakukan agar bisa mempublikasikan aplikasi Anda.
Perayapan akan melakukan tindakan dasar setiap beberapa detik pada aplikasi Anda, seperti
mengetik, mengetuk, dan menggesek. Pengujian pra-peluncuran menggunakan Firebase Cloud
Test Lab.
Untuk informasi selengkapnya tentang dukungan pra-peluncuran, lihat artikel Pusat Bantuan
Google Play Gunakan laporan pra-peluncuran untuk mengidentifikasi masalah.
Materi terlarang
Hak kekayaan intelektual, penipuan, dan spam
Keluarga
Materi terlarang
Google Play tidak mengizinkan aplikasi yang memuat materi seksual eksplisit, kebencian, rasis,
mengatai atau kekerasan, atau memfasilitasi perjudian.
https://play.google.com/about/restricted-content/
Hak kekayaan intelektual, penipuan, dan spam
Google Play tidak mengizinkan aplikasi yang tidak jujur. Dengan kata lain, aplikasi tersebut
berpura-pura menjadi aplikasi lain atau berpura-pura berasal dari perusahaan lain atau meniru
merek lain. Google Play tidak mengizinkan aplikasi yang berupaya menipu pengguna. Google
Play tidak mengizinkan aplikasi yang mengirimkan spam kepada pengguna seperti aplikasi yang
mengirimkan pesan yang tidak diminta kepada pengguna. Google Play tidak mengizinkan
aplikasi yang merupakan duplikasi atau berkualitas rendah.
https://play.google.com/about/ip-deception-spam/
Google Play mewajibkan aplikasi Anda memperlakukan data pengguna dengan aman dan
menjaga kerahasiaan informasi pengguna. Jika aplikasi Anda mengakses atau mengirimkan data
privat, aplikasi harus mempublikasikan pernyataan tentang cara aplikasi menggunakan data
pengguna tersebut.
Google Play tidak mengizinkan aplikasi yang merusak atau secara subversif mengakses
perangkat pengguna, aplikasi lain, server, jaringan, atau apa saja yang dilarang. Pada dasarnya,
aplikasi Anda tidak boleh mengganggu apa pun, atau mengakibatkan kerusakan terhadap apa
pun, atau mencoba mengakses apa pun yang tidak boleh diakses.
Google Play tidak mengizinkan aplikasi yang mencuri data, secara rahasia memantau atau
membahayakan pengguna, atau merusak.
https://play.google.com/about/privacy-security/
Google Play memiliki peraturan yang menyangkut penerimaan pembayaran untuk pembelian
dalam toko dan dalam aplikasi.
Google Play tidak mengizinkan aplikasi yang berisi iklan penipuan atau yang mengganggu.
https://play.google.com/about/monetization-ads/
Penerbit tidak boleh berupaya mempromosikan aplikasinya secara tidak jujur. Misalnya, Anda
tidak boleh meminta 100.000 teman dekat memberikan peringkat bintang 5 untuk aplikasi Anda,
sehingga aplikasi muncul dengan ulasan yang sangat baik. Ikon aplikasi, judul, keterangan, dan
tangkapan layar semuanya harus menyatakan aplikasi Anda secara jujur, dan tidak membuat
klaim yang berlebihan atau menyesatkan.
Dengan kata lain, jangan curang dalam mendapatkan rating atau penempatan Google Play yang
lebih baik.
https://play.google.com/about/storelisting-promotional/
Rangkuman akhir
Anda sudah mencapai bagian akhir kursus ini. Kami berharap Anda menikmati perjalanan dan
siap untuk membangun aplikasi Android sendiri. Kami menantikan aplikasi Anda di Google Play
Store!
Ketahui selengkapnya
Mempersiapkan aplikasi Anda
Mempersiapkan untuk rilis developer.android.com/studio/publish/preparing.html
Daftar periksa peluncuran developer.android.com/distribute/tools/launch-checklist.html