Codelab ini adalah bagian dari kursus Dasar-Dasar Kotlin Android. Anda akan mendapatkan manfaat maksimal dari kursus ini jika Anda mengerjakan codelab secara berurutan. Semua codelab kursus tercantum di halaman landing codelab Dasar-Dasar Android Kotlin.
Pengantar
Dalam codelab ini, Anda meningkatkan aplikasi DiceRoller dari codelab terakhir dan mempelajari cara menambahkan dan menggunakan resource gambar di aplikasi Anda. Anda juga mempelajari kompatibilitas aplikasi dengan berbagai versi Android dan bagaimana Android Jetpack dapat membantu.
Yang harus sudah Anda ketahui
- Cara membuat project aplikasi baru, dan menjalankan aplikasi di emulator atau perangkat fisik.
- Komponen dasar project aplikasi, termasuk direktori resource (
res
) dan file build Gradle. - Cara mengedit file tata letak aplikasi.
- Cara menemukan dan mengubah objek tampilan dalam kode aplikasi Anda.
Yang akan Anda pelajari
- Cara menambahkan file ke resource aplikasi Anda.
- Cara menggunakan gambar di tata letak aplikasi Anda.
- Cara menemukan tampilan secara lebih efisien dalam kode aplikasi Anda.
- Cara menggunakan gambar placeholder dalam desain aplikasi Anda dengan namespace XML.
- Tentang API level Android untuk aplikasi Anda, dan cara memahami API level minimum, yang ditargetkan, dan dikompilasi.
- Cara menggunakan library Jetpack di aplikasi Anda untuk mendukung versi Android yang lebih lama.
Yang akan Anda lakukan
- Mengubah aplikasi DiceRoller dari codelab terakhir guna menyertakan gambar untuk nilai mati, bukan angka.
- Tambahkan file gambar ke resource aplikasi Anda.
- Perbarui tata letak dan kode aplikasi untuk menggunakan gambar untuk nilai mati, bukan angka.
- Perbarui kode Anda untuk menemukan tampilan dengan lebih efisien.
- Perbarui kode Anda untuk menggunakan gambar kosong saat aplikasi dimulai.
- Mengupdate aplikasi Anda agar dapat menggunakan library Android Jetpack untuk kompatibilitas mundur dengan versi Android sebelumnya.
Dalam codelab ini, Anda mem-build aplikasi DiceRoller yang dimulai pada codelab sebelumnya, dan menambahkan gambar dadu yang berubah saat dadu dilempar. Aplikasi DiceRoller akhir akan terlihat seperti ini:
Jika Anda tidak berhasil menyelesaikan codelab terakhir, Anda dapat mendownload aplikasi awal di sini: DiceRoller.
Di akhir codelab terakhir, Anda memiliki aplikasi yang memperbarui tampilan teks dengan angka antara 1 dan 6 setiap kali pengguna mengetuk tombol. Namun, aplikasi ini disebut DiceRoller, bukan Generator Angka 1-6, sehingga akan lebih baik jika dadu tersebut terlihat seperti dadu. Dalam tugas ini, Anda menambahkan beberapa gambar dadu ke aplikasi. Kemudian, daripada memperbarui teks saat tombol ditekan, Anda akan mengganti gambar yang berbeda untuk setiap hasil lemparan.
Langkah 1: Tambahkan gambar
- Buka project aplikasi DiceRoller di Android Studio jika belum terbuka. Jika Anda tidak menyelesaikan codelab terakhir, Anda dapat mendownload aplikasi di sini: DiceRoller.
- Di tampilan Project > Android, luaskan folder res, lalu luaskan drawable.
Aplikasi Anda menggunakan banyak resource yang berbeda termasuk gambar dan ikon, warna, string, serta tata letak XML. Semua resource tersebut disimpan di folderres
. Folderdrawable
adalah tempat Anda harus meletakkan semua resource gambar untuk aplikasi Anda. Sudah ada dalam folderdrawable
Anda dapat menemukan sumber daya untuk ikon peluncur aplikasi. - Klik dua kali ic_launcher_background.xml. Perhatikan bahwa ini adalah file XML yang mendeskripsikan ikon sebagai gambar vektor. Vektor memungkinkan gambar Anda digambar pada berbagai ukuran dan resolusi. Gambar bitmap seperti PNG atau GIF mungkin perlu diskalakan untuk perangkat yang berbeda, yang dapat menyebabkan penurunan kualitas.
- Klik Pratinjau di kolom kanan editor XML untuk melihat vektor drawable dalam bentuk visual.
- Download gambar dadu untuk aplikasi Anda dari DiceImages.zip. Ekstrak arsip. Anda akan memiliki folder file XML yang terlihat seperti ini:
- Di Android Studio, klik menu drop-down di bagian atas tampilan project yang saat ini bertuliskan Android, lalu pilih Project. Screenshot di bawah ini menunjukkan struktur aplikasi Anda dalam sistem file.
- Luaskan DiceRoller > app > src > main > res > drawable.
- Tarik semua file XML individual dari folder
DiceImages
ke Android Studio dan ke folder drawable. Klik OK.
- Alihkan project kembali ke tampilan Android, dan perhatikan bahwa file XML gambar dadu Anda berada di folder drawable.
- Klik dua kali
dice_1.xml
, lalu perhatikan kode XML untuk gambar ini. Klik tombol Pratinjau untuk melihat pratinjau tampilan vektor drawable ini yang sebenarnya.
Langkah 2: Perbarui tata letak untuk menggunakan gambar
Setelah memiliki file gambar dadu di folder res/drawables
, Anda dapat mengakses file tersebut dari tata letak dan kode aplikasi Anda. Pada langkah ini, Anda mengganti TextView
yang menampilkan angka dengan ImageView
untuk menampilkan gambar.
- Buka file tata letak
activity_main.xml
jika belum terbuka. Klik tab Text untuk melihat kode XML tata letak. - Hapus elemen
<TextView>
. - Tambahkan elemen
<ImageView>
dengan atribut ini:
<ImageView
android:id="@+id/dice_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/dice_1" />
Anda menggunakan ImageView
untuk menampilkan gambar di tata letak. Satu-satunya atribut baru untuk elemen ini adalah android:src
, yang menunjukkan resource sumber untuk gambar. Dalam hal ini, sumber gambar @drawable/dice_1
berarti Android harus mencari resource drawable (res/drawable
) untuk gambar bernama dice_1
.
- Klik tombol Pratinjau untuk melihat pratinjau tata letak. Aplikasi akan terlihat seperti ini:
Langkah 3: Perbarui kode
- Buka
MainActivity
. Berikut tampilan fungsirollDice()
sejauh ini:
private fun rollDice() {
val randomInt = Random().nextInt(6) + 1
val resultText: TextView = findViewById(R.id.result_text)
resultText.text = randomInt.toString()
}
Perhatikan bahwa referensi ke R.id.result_text
mungkin disorot dengan warna merah—itu karena Anda menghapus TextView
dari tata letak, dan ID tersebut tidak lagi ada.
- Hapus dua baris di akhir fungsi yang menentukan variabel
resultText
dan setel properti teksnya. Anda tidak lagi menggunakanTextView
dalam tata letak, jadi Anda tidak memerlukan baris mana pun. - Gunakan
findViewByID()
untuk mendapatkan referensi keImageView
baru dalam tata letak menurut ID (R.id.dice_image
), dan tetapkan tampilan tersebut ke variabeldiceImage
baru:
val diceImage: ImageView = findViewById(R.id.dice_image)
- Tambahkan blok
when
untuk memilih gambar dadu tertentu berdasarkan nilairandomInteger
:
val drawableResource = when (randomInt) {
1 -> R.drawable.dice_1
2 -> R.drawable.dice_2
3 -> R.drawable.dice_3
4 -> R.drawable.dice_4
5 -> R.drawable.dice_5
else -> R.drawable.dice_6
}
Seperti halnya ID, Anda dapat mereferensikan gambar dadu di folder drawable dengan nilai di class R
. Di sini, R.drawable
merujuk pada folder drawable aplikasi, dan dice_1
adalah resource die image tertentu dalam folder tersebut.
- Perbarui sumber
ImageView
dengan metodesetImageResource()
dan referensi ke gambar mati yang baru saja Anda temukan.
diceImage.setImageResource(drawableResource)
- Kompilasi dan jalankan aplikasi. Sekarang, saat Anda mengklik tombol Roll, gambar akan diperbarui dengan gambar yang sesuai.
Semua yang ada di aplikasi Anda berfungsi, tetapi ada lebih banyak hal untuk mengembangkan aplikasi daripada sekadar memiliki kode yang berfungsi. Anda juga telah memahami cara menulis aplikasi yang berperforma baik dan berperilaku baik. Artinya, aplikasi Anda akan berjalan dengan baik, meskipun pengguna tidak memiliki perangkat Android yang paling mahal atau konektivitas jaringan terbaik. Aplikasi Anda juga akan terus berjalan lancar saat Anda menambahkan lebih banyak fitur, dan kode Anda harus dapat dibaca dan diatur dengan baik.
Dalam tugas ini, Anda akan mempelajari satu cara untuk membuat aplikasi Anda lebih efisien.
- Buka
MainActivity
, jika belum terbuka. Pada metoderollDice()
, perhatikan deklarasi untuk variabeldiceImage
:
val diceImage : ImageView = findViewById(R.id.dice_image)
Karena rollDice()
adalah pengendali klik untuk tombol Roll, setiap kali pengguna mengetuk tombol tersebut, aplikasi akan memanggil findViewById()
dan mendapatkan referensi lain ke ImageView
ini. Idealnya, Anda harus meminimalkan jumlah panggilan ke findViewById()
, karena sistem Android menelusuri seluruh hierarki tampilan setiap kali, dan hal itu merupakan operasi yang mahal.
Di aplikasi kecil seperti ini, ini bukan masalah besar. Jika Anda menjalankan aplikasi yang lebih rumit di ponsel yang lebih lambat, terus-menerus memanggil findViewById()
dapat menyebabkan aplikasi Anda terlambat. Sebagai praktik terbaik, cukup panggil findViewById()
satu kali dan simpan objek View
di kolom. Menyimpan referensi ke ImageView
dalam kolom memungkinkan sistem mengakses View
secara langsung kapan saja, sehingga akan meningkatkan performa.
- Di bagian atas class, sebelum
onCreate()
, buat kolom untuk menyimpanImageView
.
var diceImage : ImageView? = null
Idealnya Anda akan melakukan inisialisasi variabel ini di sini saat dideklarasikan, atau di konstruktor—tetapi aktivitas Android tidak menggunakan konstruktor. Bahkan, tampilan dalam tata letak sama sekali bukan objek yang dapat diakses di memori sampai setelah di-inflate dalam metode onCreate()
, dengan panggilan ke setContentView()
. Anda tidak dapat menginisialisasi variabel diceImage
sama sekali hingga hal tersebut terjadi.
Salah satu opsinya adalah menentukan variabel diceImage
sebagai nullable, seperti dalam contoh ini. Setel ke null
saat dideklarasikan, lalu tetapkan ke ImageView
sebenarnya dalam onCreate()
dengan findViewById()
. Namun, hal ini akan mempersulit kode karena sekarang Anda harus memeriksa nilai null
setiap kali ingin menggunakan diceImage
. Ada cara yang lebih baik.
- Ubah deklarasi
diceImage
untuk menggunakan kata kuncilateinit
, dan hapus penetapannull
:
lateinit var diceImage : ImageView
Kata kunci lateinit
menjanjikan compiler Kotlin bahwa variabel akan diinisialisasi sebelum kode memanggil operasi apa pun. Oleh karena itu, kita tidak perlu menginisialisasi variabel ke null
di sini dan kita dapat memperlakukannya sebagai variabel non-nullable saat menggunakannya. Praktik terbaiknya adalah menggunakan lateinit
dengan kolom yang menyimpan tampilan dengan cara ini.
- Di
onCreate()
, setelah metodesetContentView()
, gunakanfindViewById()
untuk mendapatkanImageView
.
diceImage = findViewById(R.id.dice_image)
- Hapus baris lama di
rollDice()
yang mendeklarasikan dan mendapatkanImageView
. Anda telah mengganti baris ini dengan deklarasi kolom sebelumnya.
val diceImage : ImageView = findViewById(R.id.dice_image)
- Jalankan lagi aplikasi untuk melihat apakah aplikasi masih berfungsi sesuai harapan.
Saat ini Anda menggunakan dice_1
sebagai gambar awal untuk dadu. Sebagai gantinya, katakanlah Anda tidak ingin menampilkan gambar sama sekali sampai dadu dilempar untuk pertama kalinya. Ada beberapa cara untuk melakukannya.
- Buka
activity_layout.xml
di tab Text. - Dalam elemen
<ImageView>
, tetapkan atributandroid:src
ke"@drawable/empty_dice"
:
android:src="@drawable/empty_dice"
Gambar empty_dice
adalah salah satu gambar yang Anda download dan ditambahkan ke folder drawable
. Ukurannya sama dengan gambar dadu lainnya, hanya kosong. Gambar ini adalah gambar yang akan ditampilkan saat aplikasi pertama kali dimulai.
- Klik tab Design. Gambar mati sekarang kosong, tetapi juga tidak terlihat dalam pratinjau.
Sangat umum bahwa konten desain dapat ditentukan secara dinamis pada waktu proses—misalnya, aplikasi apa pun yang mengambil data dari internet mungkin harus dimulai dengan layar kosong atau kosong. Tetapi akan sangat membantu saat Anda mendesain aplikasi agar memiliki semacam data placeholder dalam tata letak agar Anda tahu apa yang sedang Anda tata letak. - Di
activity_layout.xml
, salin barisandroid:src
, lalu tempel salinan kedua. Ubah kata "android" menjadi "tools", sehingga kedua atribut Anda terlihat seperti ini:
android:src="@drawable/empty_dice"
tools:src="@drawable/empty_dice" />
Di sini Anda telah mengubah namespace XML atribut ini dari namespace android
default menjadi namespace tools
. Namespace tools
digunakan saat Anda ingin menentukan konten placeholder yang hanya digunakan dalam pratinjau atau editor desain di Android Studio. Atribut yang menggunakan namespace tools
akan dihapus saat Anda mengompilasi aplikasi.
Namespace digunakan untuk membantu mengatasi ambiguitas saat merujuk ke atribut yang memiliki nama yang sama. Misalnya, kedua atribut ini dalam tag <ImageView>
memiliki nama yang sama (src
), tetapi namespace-nya berbeda.
- Periksa elemen
<LinearLayout>
di root file tata letak, dan perhatikan dua namespace yang ditentukan di sini.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...
- Ubah atribut
tools:src
dalam tagImageView
menjadidice_1
, bukanempty_dice
:
android:src="@drawable/empty_dice"
tools:src="@drawable/dice_1" />
Perhatikan bahwa gambar dice_1
sekarang ditempatkan sebagai gambar placeholder dalam pratinjau.
- Kompilasi dan jalankan aplikasi. Perhatikan bahwa gambar mati kosong di aplikasi yang sebenarnya sampai Anda mengklik atau mengetuk Lempar.
Salah satu hal hebat tentang mengembangkan Android adalah banyaknya perangkat yang dapat menjalankan kode—dari Nexus One hingga Pixel, untuk membentuk faktor seperti tablet, Pixelbook, hingga jam tangan, TV, dan mobil.
Saat menulis untuk Android, Anda tidak menulis aplikasi yang benar-benar terpisah untuk setiap perangkat yang berbeda ini—bahkan aplikasi yang berjalan pada faktor bentuk yang sangat berbeda seperti smartwatch dan TV dapat berbagi kode. Namun, masih ada batasan dan strategi kompatibilitas yang harus Anda ketahui untuk mendukung semua hal ini.
Dalam tugas ini, Anda akan mempelajari cara menargetkan aplikasi untuk API level Android (versi) tertentu, dan cara menggunakan library Android Jetpack untuk mendukung perangkat yang lebih lama.
Langkah 1: Menjelajahi API level
Dalam codelab sebelumnya, saat membuat project, Anda menunjukkan API level Android tertentu yang harus didukung oleh aplikasi Anda. OS Android memiliki nomor versi berbeda yang diberi nama setelah makanan lezat yang diurutkan berdasarkan abjad. Setiap versi OS dilengkapi dengan fitur dan fungsi baru. Misalnya, Android Oreo dilengkapi dengan dukungan untuk aplikasi Picture-in-picture, sementara Android Pie memperkenalkan Slice. Level API sesuai dengan versi Android. Misalnya, API 19 sesuai dengan Android 4.4 (KitKat).
Karena sejumlah faktor, termasuk yang dapat didukung hardware, apakah pengguna memilih untuk mengupdate perangkat, dan apakah produsen mendukung level OS yang berbeda, pengguna pasti akan menemukan perangkat yang menjalankan versi OS berbeda.
Saat membuat project aplikasi, Anda menentukan API level minimum yang didukung aplikasi Anda. Artinya, Anda menetapkan versi Android terlama yang didukung aplikasi Anda. Aplikasi Anda juga memiliki level yang dikompilasi, dan level yang ditargetkan. Setiap level ini adalah parameter konfigurasi di file build Gradle Anda.
- Luaskan folder Gradle Scripts, lalu buka file build.gradle (Module: app).
File ini menentukan parameter build dan dependensi khusus untuk modul aplikasi. File build.gradle (Project: DiceRoller) menentukan parameter build untuk project secara keseluruhan. Dalam banyak kasus, modul aplikasi Anda adalah satu-satunya modul dalam project Anda, sehingga divisi ini mungkin tampak arbitrer. Namun, jika aplikasi Anda menjadi lebih kompleks dan Anda memecahnya menjadi beberapa bagian, atau jika aplikasi Anda mendukung platform seperti smartwatch Android, Anda mungkin menemukan modul yang berbeda dalam project yang sama. - Periksa bagian
android
di bagian atas filebuild.gradle
. (Contoh di bawah ini bukan merupakan seluruh bagian, tetapi berisi hal yang paling Anda minati untuk codelab ini.)
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.android.diceroller"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
- Periksa parameter
compileSdkVersion
.
compileSdkVersion 28
Parameter ini menetapkan Android API level yang harus digunakan Gradle untuk mengompilasi aplikasi Anda. Ini adalah versi terbaru Android yang dapat didukung aplikasi Anda. Artinya, aplikasi Anda dapat menggunakan fitur API yang disertakan dalam API level ini dan yang lebih rendah. Dalam hal ini aplikasi Anda mendukung API 28, yang sesuai dengan Android 9 (Pie).
- Periksa parameter
targetSdkVersion
yang ada di dalam bagiandefaultConfig
:
targetSdkVersion 28
Nilai ini adalah API terbaru yang digunakan untuk menguji aplikasi Anda. Dalam banyak kasus, nilai ini sama dengan compileSdkVersion
.
- Periksa parameter
minSdkVersion
.
minSdkVersion 19
Parameter ini adalah yang paling penting di antara ketiganya karena akan menentukan versi terlama Android di aplikasi Anda. Perangkat yang menjalankan Android OS lebih lama dari API level ini tidak dapat menjalankan aplikasi Anda sama sekali.
Memilih API level minimum untuk aplikasi Anda bukanlah hal yang mudah. Menyetel API level terlalu rendah, dan Anda melewatkan fitur yang lebih baru dari OS Android. Setel terlalu tinggi, dan aplikasi Anda hanya dapat berjalan di perangkat yang lebih baru.
Saat Anda menyiapkan project dan tiba di tempat Anda menentukan API level minimum untuk aplikasi, klik Help me choose untuk melihat dialog API Version Distribution. Dialog ini memberikan informasi tentang jumlah perangkat yang menggunakan tingkat OS berbeda, dan fitur yang ditambahkan atau diubah di tingkat OS. Anda juga dapat melihat catatan rilis dokumentasi Android dan dasbor, yang memiliki informasi lebih lanjut tentang implikasi dukungan untuk berbagai API level.
Langkah 2: Jelajahi kompatibilitas
Menulis untuk berbagai level Android API merupakan tantangan umum yang dihadapi developer aplikasi, sehingga tim framework Android telah melakukan banyak upaya untuk membantu Anda.
Pada tahun 2011, tim ini merilis support library pertama, yaitu library yang dikembangkan Google dan menawarkan class yang kompatibel dengan versi sebelumnya serta fungsi yang bermanfaat. Pada tahun 2018, Google mengumumkan Android Jetpack, yang merupakan kumpulan library yang mencakup banyak class dan fungsi support library sebelumnya, sekaligus memperluas library dukungan.
- Buka
MainActivity
. - Perhatikan bahwa class
MainActivity
Anda tidak diperluas dariActivity
itu sendiri, tetapi dariAppCompatActivity
.
class MainActivity : AppCompatActivity() {
...
AppCompatActivity
adalah class kompatibilitas yang memastikan aktivitas Anda terlihat sama di berbagai tingkat OS platform.
- Klik simbol + di samping baris yang diawali dengan
import
untuk meluaskan impor untuk class Anda. Perhatikan bahwa classAppCompatActivity
diimpor dari paketandroidx.appcompat.app
. Namespace untuk library Android Jetpack adalahandroidx
. - Buka build.gradle (Module: app) dan scroll ke bawah ke bagian dependensi.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.core:core-ktx:1.0.1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
androidTestImplementation
'androidx.test.espresso:espresso-core:3.1.0-alpha4'
}
Perhatikan dependensi pada library appcompat
, yang merupakan bagian dari androidx
dan berisi class AppCompatActivity
.
Langkah 3: Tambahkan kompatibilitas untuk vektor drawable
Anda akan menggunakan pengetahuan baru tentang namespace, Gradle, dan kompatibilitas untuk membuat satu penyesuaian akhir pada aplikasi, yang akan mengoptimalkan ukuran aplikasi pada platform lama.
- Luaskan folder res, lalu luaskan drawable. Klik dua kali salah satu gambar dadu.
Seperti yang telah dipelajari sebelumnya, semua gambar dadu sebenarnya adalah file XML yang menentukan warna dan bentuk dadu. Jenis file ini disebut vektor drawable. Kelebihan vektor drawable dibandingkan format gambar bitmap seperti PNG adalah bahwa vektor drawable dapat diskalakan tanpa kehilangan kualitas. Selain itu, vektor drawable biasanya berukuran jauh lebih kecil daripada gambar yang sama dalam format bitmap.
Hal penting yang perlu diperhatikan tentang vektor drawable adalah file tersebut didukung di API 21 dan seterusnya. Namun, SDK minimum aplikasi Anda ditetapkan ke API 19. Jika Anda mencoba aplikasi di perangkat atau emulator API 19, Anda akan melihat bahwa aplikasi tampaknya bisa di-build dan berjalan dengan baik. Jadi, bagaimana cara kerjanya?
Saat Anda membuat aplikasi, proses build Gradle akan menghasilkan file PNG dari setiap file vektor, dan file PNG tersebut akan digunakan di perangkat Android apa pun yang kurang dari 21. File PNG ekstra ini meningkatkan ukuran aplikasi Anda. Aplikasi berukuran besar juga bukan hal yang bagus—aplikasi ini membuat download lebih lambat bagi pengguna dan menggunakan lebih banyak perangkat mereka dengan ruang terbatas. Aplikasi yang besar juga berpeluang lebih besar untuk di-uninstal, dan pengguna yang gagal mendownload atau membatalkan download aplikasi tersebut.
Kabar baiknya, ada library kompatibilitas Android X untuk vektor drawable hingga API level 7. - Buka build.gradle (Module: app). Tambahkan baris ini ke bagian
defaultConfig
:
vectorDrawables.useSupportLibrary = true
- Klik tombol Sync Now. Setiap kali file
build.gradle
dimodifikasi, Anda harus menyinkronkan file build dengan project tersebut. - Buka file tata letak
main_activity.xml
. Tambahkan namespace ini ke tag<LinearLayout>
root, di bawah namespacetools
:
xmlns:app="http://schemas.android.com/apk/res-auto"
Namespace app
digunakan untuk atribut yang berasal dari kode kustom atau dari library dan bukan framework Android inti.
- Ubah atribut
android:src
dalam elemen<ImageView>
menjadiapp:srcCompat
.
app:srcCompat="@drawable/empty_dice"
Atribut app:srcCompat
menggunakan library Android X untuk mendukung vektor drawable di versi Android yang lebih lama, kembali ke API level 7.
- Buat dan jalankan aplikasi Anda. Anda tidak akan melihat apa pun yang berbeda di layar, tetapi sekarang aplikasi Anda tidak perlu menggunakan file PNG yang dihasilkan untuk gambar dadu, di mana pun aplikasi dijalankan, yang berarti file aplikasi berukuran lebih kecil.
Project Android Studio: DiceRollerFinal
Tantangan: Ubah aplikasi DiceRoller agar memiliki dua dadu. Saat pengguna mengetuk tombol Lempar, setiap dadu harus memiliki nilai yang terpisah dari yang lain.
Tips: Buat fungsi pribadi baru untuk mendapatkan gambar acak yang dapat digambar, dan tampilkan bilangan bulat untuk resource yang dapat digambar. Gunakan fungsi tersebut untuk setiap gambar yang mati.
private fun getRandomDiceImage() : Int { ... }
Kode solusi tantangan coding
Project Android Studio: DiceRollerFinal-challenge
Resource aplikasi:
- Resource aplikasi Anda dapat mencakup gambar dan ikon, warna standar yang digunakan dalam aplikasi, string, dan tata letak XML. Semua resource tersebut disimpan di folder
res
. - Folder resource
drawable
adalah tempat Anda harus meletakkan semua resource gambar untuk aplikasi Anda.
Menggunakan vektor drawable dalam tampilan gambar:
- Vektor drawable adalah gambar yang dijelaskan dalam format XML. Vektor drawable lebih fleksibel daripada gambar bitmap (seperti file PNG) karena vektor dapat diskalakan ke ukuran atau resolusi apa pun.
- Untuk menambahkan drawable ke tata letak aplikasi Anda, gunakan elemen
<ImageView>
. Sumber gambar ada di atributandroid:src
. Untuk merujuk ke folder resource drawable, gunakan@drawable
, misalnya"@drawable/image_name"
. - Gunakan tampilan
ImageView
dalam kodeMainActivity
untuk gambar. Anda dapat menggunakansetImageResource()
untuk mengubah gambar tampilan ke resource lain. GunakanR.drawable
untuk merujuk ke drawable tertentu, misalnyasetImageResource(R.drawable.image_name)
.
Kata kunci lateinit
:
- Minimalkan panggilan ke
findViewById()
dalam kode Anda dengan mendeklarasikan kolom untuk menampung tampilan tersebut, dan melakukan inisialisasi kolom dionCreate()
. Gunakan kata kuncilateinit
untuk kolom agar tidak perlu mendeklarasikannya nullable.
Namespace tools
untuk atribut waktu desain:
- Gunakan atribut
tools:src
dalam elemen<ImageView>
di tata letak Anda untuk menampilkan gambar hanya di editor desain atau pratinjau Android Studio. Kemudian, Anda dapat menggunakan gambar kosong untukandroid:src
untuk aplikasi final. - Gunakan namespace
tools
dalam file tata letak Android untuk membuat konten placeholder atau petunjuk untuk tata letak di Android Studio. Data yang dideklarasikan oleh atributtools
tidak digunakan dalam aplikasi akhir.
API level:
- Setiap OS Android memiliki nomor versi dan nama resmi (misalnya Android 9.0, "Pie") dan API level (API 28). Gunakan API level di file Gradle aplikasi Anda untuk menunjukkan versi Android yang didukung aplikasi Anda.
- Parameter
compileSdkVersion
di filebuild.gradle
menentukan API level Android yang harus digunakan Gradle untuk mengompilasi aplikasi Anda. - Parameter
targetSdkVersion
menentukan API level terbaru yang digunakan untuk menguji aplikasi Anda. Dalam banyak kasus, parameter ini memiliki nilai yang sama dengancompileSdkVersion
. - Parameter
minSdkVersion
menentukan API level terlama yang dapat dijalankan aplikasi Anda.
Android Jetpack:
- Android Jetpack adalah kumpulan library, yang dikembangkan oleh Google, yang menawarkan class yang kompatibel dengan versi sebelumnya dan fungsi yang berguna untuk mendukung versi Android lama. Jetpack menggantikan dan memperluas set library yang sebelumnya dikenal sebagai Android Support Library.
- Class yang diimpor dari paket
androidx
merujuk ke library Jetpack. Dependensi pada Jetpack dalam filebuild.gradle
juga dimulai denganandroidx
.
Kompatibilitas mundur untuk vektor drawable:
- Vektor drawable hanya didukung secara native di versi Android yang lebih tinggi dari API 21. Pada versi yang lebih lama, Gradle menghasilkan gambar PNG untuk drawable tersebut saat aplikasi Anda di-build.
- Anda dapat menentukan bahwa Android Support Library harus digunakan untuk vektor drawable dalam versi API lama dengan parameter konfigurasi
vectorDrawables.useSupportLibrary = true
dalam filebuild.gradle
. - Setelah mengaktifkan support library untuk vektor drawable, gunakan atribut
app:srcCompat
dalam elemen<ImageView>
(bukanandroid:src
) untuk menentukan sumber vektor drawable untuk gambar tersebut.
Namespace app
:
- Namespace
app
di file tata letak XML Anda ditujukan untuk atribut yang berasal dari kode kustom atau dari library, bukan dari framework Android inti.
Kursus Udacity:
Dokumentasi developer Android:
ImageView
- Ringkasan resource aplikasi
findViewById
()
- Referensi atribut alat
- Mendukung berbagai versi platform
- Menentukan persyaratan API level
- Android Jetpack
Lainnya:
Bagian ini mencantumkan kemungkinan tugas pekerjaan rumah untuk siswa yang mengerjakan codelab ini sebagai bagian dari kursus yang dipimpin oleh instruktur. Terserah instruktur untuk melakukan hal berikut:
- Tugaskan pekerjaan rumah jika diperlukan.
- Berkomunikasi dengan siswa cara mengirimkan tugas pekerjaan rumah.
- Beri nilai tugas pekerjaan rumah.
Instruktur dapat menggunakan saran ini sesedikit atau sebanyak yang mereka inginkan, dan harus bebas memberikan pekerjaan rumah lain yang dirasa sesuai.
Jika Anda mengerjakan codelab ini sendiri, silakan gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.
Mengubah aplikasi
Tambahkan tombol Clear ke aplikasi DiceRoller yang menyetel gambar dadu kembali ke gambar kosong.
Jawab pertanyaan berikut
Pertanyaan 1
Atribut <ImageView>
mana yang menunjukkan gambar sumber yang hanya boleh digunakan di Android Studio?
android:srcCompat
app:src
tools:src
tools:sourceImage
Pertanyaan 2
Metode apa yang mengubah resource gambar untuk ImageView
dalam kode Kotlin? xmx
setImageResource()
setImageURI()
setImage()
setImageRes()
Pertanyaan 3
Apa yang ditunjukkan kata kunci lateinit
dalam deklarasi variabel di kode Kotlin?
- Variabel tidak pernah diinisialisasi.
- Variabel hanya diinisialisasi pada waktu proses aplikasi.
- Variabel secara otomatis diinisialisasi ke
null
. - Variabel akan diinisialisasi nanti. Saya berjanji!
Pertanyaan 4
Konfigurasi Gradle mana yang menunjukkan API level terbaru yang telah diuji dengan aplikasi Anda?
minSdkVersion
compileSdkVersion
targetSdkVersion
testSdkVersion
Pertanyaan 5
Anda melihat baris impor dalam kode yang dimulai dengan androidx
. Apa maksudnya?
- Class adalah bagian dari library Android Jetpack.
- Class berada di library eksternal yang akan dimuat secara dinamis saat aplikasi berjalan.
- Class merupakan "extra" dan bersifat opsional untuk class Anda.
- Class adalah bagian dari dukungan XML Android.
Mengirimkan aplikasi untuk dinilai
Periksa untuk memastikan aplikasi memiliki hal berikut:
- Tata letak aplikasi harus menyertakan satu tampilan gambar dan dua tombol.
- Kode aplikasi harus menetapkan dua pengendali klik, satu untuk setiap tombol.
- Pengendali klik untuk tombol Clear harus menyetel gambar mati ke
R.drawable.empty_dice
.
Mulai pelajaran berikutnya:
Untuk link ke codelab lainnya dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Kotlin Android.