Dasar-Dasar Android Kotlin 01.3: Resource dan kompatibilitas gambar

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

  1. Buka project aplikasi DiceRoller di Android Studio jika belum terbuka. Jika Anda tidak menyelesaikan codelab terakhir, Anda dapat mendownload aplikasi di sini: DiceRoller.
  2. 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 folder res. Folder drawable adalah tempat Anda harus meletakkan semua resource gambar untuk aplikasi Anda. Sudah ada dalam folder drawable Anda dapat menemukan sumber daya untuk ikon peluncur aplikasi.
  3. 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.
  4. Klik Pratinjau di kolom kanan editor XML untuk melihat vektor drawable dalam bentuk visual.


  5. Download gambar dadu untuk aplikasi Anda dari DiceImages.zip. Ekstrak arsip. Anda akan memiliki folder file XML yang terlihat seperti ini:

  1. 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.


  2. Luaskan DiceRoller > app > src > main > res > drawable.
  3. Tarik semua file XML individual dari folder DiceImages ke Android Studio dan ke folder drawable. Klik OK.
  1. Alihkan project kembali ke tampilan Android, dan perhatikan bahwa file XML gambar dadu Anda berada di folder drawable.
  2. 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.

  1. Buka file tata letak activity_main.xml jika belum terbuka. Klik tab Text untuk melihat kode XML tata letak.
  2. Hapus elemen <TextView>.
  3. 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.

  1. Klik tombol Pratinjau untuk melihat pratinjau tata letak. Aplikasi akan terlihat seperti ini:

Langkah 3: Perbarui kode

  1. Buka MainActivity. Berikut tampilan fungsi rollDice() 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.

  1. Hapus dua baris di akhir fungsi yang menentukan variabel resultText dan setel properti teksnya. Anda tidak lagi menggunakan TextView dalam tata letak, jadi Anda tidak memerlukan baris mana pun.
  2. Gunakan findViewByID() untuk mendapatkan referensi ke ImageView baru dalam tata letak menurut ID (R.id.dice_image), dan tetapkan tampilan tersebut ke variabel diceImage baru:
val diceImage: ImageView = findViewById(R.id.dice_image)
  1. Tambahkan blok when untuk memilih gambar dadu tertentu berdasarkan nilai randomInteger:
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.

  1. Perbarui sumber ImageView dengan metode setImageResource() dan referensi ke gambar mati yang baru saja Anda temukan.
diceImage.setImageResource(drawableResource)
  1. 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.

  1. Buka MainActivity, jika belum terbuka. Pada metode rollDice(), perhatikan deklarasi untuk variabel diceImage:
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.

  1. Di bagian atas class, sebelum onCreate(), buat kolom untuk menyimpan ImageView.
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.

  1. Ubah deklarasi diceImage untuk menggunakan kata kunci lateinit, dan hapus penetapan null:
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.

  1. Di onCreate(), setelah metode setContentView(), gunakan findViewById() untuk mendapatkan ImageView.
diceImage = findViewById(R.id.dice_image)
  1. Hapus baris lama di rollDice() yang mendeklarasikan dan mendapatkan ImageView. Anda telah mengganti baris ini dengan deklarasi kolom sebelumnya.
val diceImage : ImageView = findViewById(R.id.dice_image)
  1. 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.

  1. Buka activity_layout.xml di tab Text.
  2. Dalam elemen <ImageView>, tetapkan atribut android: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.

  1. 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.
  2. Di activity_layout.xml, salin baris android: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.

  1. 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"
   ...
  1. Ubah atribut tools:src dalam tag ImageView menjadi dice_1, bukan empty_dice:
android:src="@drawable/empty_dice" 
tools:src="@drawable/dice_1" />

Perhatikan bahwa gambar dice_1 sekarang ditempatkan sebagai gambar placeholder dalam pratinjau.

  1. 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.

  1. 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.
  2. Periksa bagian android di bagian atas file build.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"
   }
  1. 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).

  1. Periksa parameter targetSdkVersion yang ada di dalam bagian defaultConfig:
targetSdkVersion 28

Nilai ini adalah API terbaru yang digunakan untuk menguji aplikasi Anda. Dalam banyak kasus, nilai ini sama dengan compileSdkVersion.

  1. 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.

  1. Buka MainActivity.
  2. Perhatikan bahwa class MainActivity Anda tidak diperluas dari Activity itu sendiri, tetapi dari AppCompatActivity.
class MainActivity : AppCompatActivity() { 
...

AppCompatActivity adalah class kompatibilitas yang memastikan aktivitas Anda terlihat sama di berbagai tingkat OS platform.

  1. Klik simbol + di samping baris yang diawali dengan import untuk meluaskan impor untuk class Anda. Perhatikan bahwa class AppCompatActivity diimpor dari paket androidx.appcompat.app. Namespace untuk library Android Jetpack adalah androidx.
  2. 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.

  1. 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.
  2. Buka build.gradle (Module: app). Tambahkan baris ini ke bagian defaultConfig:
vectorDrawables.useSupportLibrary = true
  1. Klik tombol Sync Now. Setiap kali file build.gradle dimodifikasi, Anda harus menyinkronkan file build dengan project tersebut.
  2. Buka file tata letak main_activity.xml. Tambahkan namespace ini ke tag <LinearLayout> root, di bawah namespace tools:
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.

  1. Ubah atribut android:src dalam elemen <ImageView> menjadi app: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.

  1. 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 atribut android:src. Untuk merujuk ke folder resource drawable, gunakan @drawable, misalnya "@drawable/image_name".
  • Gunakan tampilan ImageView dalam kode MainActivity untuk gambar. Anda dapat menggunakan setImageResource() untuk mengubah gambar tampilan ke resource lain. Gunakan R.drawable untuk merujuk ke drawable tertentu, misalnya setImageResource(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 di onCreate(). Gunakan kata kunci lateinit 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 untuk android: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 atribut tools 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 file build.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 dengan compileSdkVersion.
  • 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 file build.gradle juga dimulai dengan androidx.

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 file build.gradle.
  • Setelah mengaktifkan support library untuk vektor drawable, gunakan atribut app:srcCompat dalam elemen <ImageView> (bukan android: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:

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: 1.4: Pelajari cara membantu diri Anda sendiri

Untuk link ke codelab lainnya dalam kursus ini, lihat halaman landing codelab Dasar-Dasar Kotlin Android.