1. Sebelum memulai
Di codelab sebelumnya, Anda membuat aplikasi Affirmations yang menampilkan daftar teks di RecyclerView
.
Di codelab lanjutan ini, Anda akan menambahkan gambar yang menginspirasi pada setiap afirmasi aplikasi. Anda akan menampilkan teks dan gambar untuk setiap afirmasi dalam kartu, menggunakan widget MaterialCardView
dari Komponen Material untuk library Android. Kemudian Anda akan menyelesaikan aplikasi ini dengan meningkatkan UI untuk membuat pengalaman pengguna yang lebih kohesif dan menarik. Ini adalah screenshot aplikasi yang telah selesai:
Prasyarat
- Dapat menambahkan aset gambar ke aplikasi.
- Paham cara mengubah tata letak XML.
- Dapat membuat aplikasi yang menampilkan daftar teks di
RecyclerView
. - Dapat membuat adaptor untuk
RecyclerView
.
Yang akan Anda pelajari
- Cara menambahkan gambar ke daftar afirmasi yang ditampilkan di
RecyclerView
. - Cara menggunakan
MaterialCardView
di tata letak itemRecyclerView
. - Cara membuat perubahan visual di UI agar aplikasi terlihat lebih baik.
Yang akan Anda bangun
- Aplikasi Affirmations bagus yang menggunakan
RecyclerView
untuk menampilkan daftar kartu. Setiap kartu berisi gambar dan teks afirmasi.
Yang Anda perlukan
- Komputer yang dilengkapi Android Studio versi 4.1 atau yang lebih baru.
- Akses ke koneksi internet untuk mendownload file gambar.
- Aplikasi Affirmations dari codelab Membuat aplikasi Affirmations sebelumnya. (Kode awal tidak disediakan. Membuat aplikasi adalah prasyarat).
2. Menambahkan gambar ke item daftar
Sejauh ini Anda telah membuat adaptor ItemAdapter
untuk menampilkan string afirmasi di RecyclerView
. Adaptor ini berfungsi dengan baik, tetapi visualisasinya kurang menarik. Dalam tugas ini, Anda akan mengubah tata letak item daftar dan kode adaptor untuk menampilkan gambar dengan afirmasi.
Mendownload gambar
- Untuk memulai, buka project aplikasi Affirmations di Android Studio dari codelab sebelumnya. Jika Anda tidak memiliki project ini, ikuti langkah-langkah di codelab sebelumnya untuk membuat project tersebut. Kemudian kembali ke sini.
- Selanjutnya download file gambar ke komputer Anda. Seharusnya ada sepuluh gambar, satu gambar untuk setiap afirmasi di aplikasi Anda. Nama file harus diubah dari
image1.jpg
menjadiimage10.jpg
. - Salin gambar dari komputer Anda ke dalam folder (
app/src/main/res/drawable
) project res > drawable Anda di dalam Android Studio. Jika aset ini telah ditambahkan, Anda akan dapat mengakses gambar tersebut dari kode Anda menggunakan ID asetnya, sepertiR.drawable.image1
. (Anda mungkin harus membuat ulang kode untuk Android Studio guna menemukan gambarnya.)
Sekarang gambar ini siap digunakan di aplikasi.
Menambahkan dukungan untuk gambar di class Affirmation
Pada langkah ini, Anda akan menambahkan properti di class data Affirmation
untuk menyimpan nilai ID aset gambar. Dengan begitu, satu instance objek Affirmation
akan berisi satu ID aset untuk teks afirmasi dan satu ID aset untuk gambar afirmasi.
- Buka file
Affirmation.kt
dalam paketmodel
. - Ubah konstruktor class
Affirmation
dengan menambahkan parameterInt
lain bernamaimageResourceId
.
Menggunakan anotasi aset
stringResourceId
dan imageResourceId
adalah nilai bilangan bulat. Meskipun tampak benar, pemanggil dapat tidak sengaja meneruskan argumen dalam urutan yang salah (imageResourceId
terlebih dahulu, bukan stringResourceId
).
Untuk menghindari hal ini, Anda dapat menggunakan anotasi Aset. Anotasi berguna karena fungsi ini menambahkan info tambahan ke class, metode, atau parameter. Anotasi selalu dideklarasikan dengan simbol @. Dalam kasus ini, tambahkan anotasi @StringRes
ke properti ID aset string dan anotasi @DrawableRes
ke properti ID resource drawable Anda. Kemudian Anda akan mendapatkan peringatan jika memberikan jenis ID aset yang salah.
- Tambahkan anotasi
@StringRes
kestringResourceId
. - Tambahkan anotasi
@DrawableRes
keimageResourceId
. - Pastikan impor
androidx.annotation.DrawableRes
danandroidx.annotation.StringRes
ditambahkan di bagian atas file Anda setelah deklarasi paket.
Affirmation.kt
package com.example.affirmations.model
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
data class Affirmation(
@StringRes val stringResourceId: Int,
@DrawableRes val imageResourceId: Int
)
Melakukan inisialisasi daftar afirmasi dengan gambar
Setelah mengubah konstruktor class Affirmation
, Anda harus mengupdate class Datasource
. Teruskan ID aset gambar ke setiap objek Affirmation
yang diinisialisasi.
- Buka
Datasource.kt
. Anda akan melihat error untuk setiap pembuatan instanceAffirmation
. - Untuk setiap
Affirmation
, tambahkan ID aset gambar sebagai argumen, sepertiR.drawable.image1
.
Datasource.kt
package com.example.affirmations.data
import com.example.affirmations.R
import com.example.affirmations.model.Affirmation
class Datasource() {
fun loadAffirmations(): List<Affirmation> {
return listOf<Affirmation>(
Affirmation(R.string.affirmation1, R.drawable.image1),
Affirmation(R.string.affirmation2, R.drawable.image2),
Affirmation(R.string.affirmation3, R.drawable.image3),
Affirmation(R.string.affirmation4, R.drawable.image4),
Affirmation(R.string.affirmation5, R.drawable.image5),
Affirmation(R.string.affirmation6, R.drawable.image6),
Affirmation(R.string.affirmation7, R.drawable.image7),
Affirmation(R.string.affirmation8, R.drawable.image8),
Affirmation(R.string.affirmation9, R.drawable.image9),
Affirmation(R.string.affirmation10, R.drawable.image10)
)
}
}
Menambahkan ImageView ke tata letak item daftar
Agar gambar ditampilkan untuk setiap afirmasi dalam daftar, Anda harus menambahkan ImageView
ke tata letak item. Karena Anda sekarang memiliki dua tampilan (TextView
dan ImageView
), Anda harus menempatkannya sebagai tampilan turunan di dalam ViewGroup
. Untuk mengatur tampilan di kolom vertikal, Anda dapat menggunakan LinearLayout
. LinearLayout
meratakan semua tampilan turunan dalam satu arah, secara vertikal atau horizontal.
- Buka res > layout > list_item.xml. Tambahkan
LinearLayout
di sekitarTextView
yang ada dan setel propertiorientation
kevertical
. - Pindahkan baris deklarasi
xmlns schema
dari elemenTextView
ke elemenLinearLayout
untuk menghilangkan error.
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- Di dalam
LinearLayout,
sebelumTextView,
, tambahkanImageView
dengan ID asetitem_image
. - Setel lebar
ImageView
menjadimatch_parent
dan tinggi menjadi194dp
. Tergantung pada ukuran layar, nilai ini akan menampilkan beberapa kartu di layar kapan saja. - Setel
scaleType
menjadicenterCrop.
- Setel atribut
importantForAccessibility
menjadino
karena gambar digunakan untuk tujuan dekoratif.
<ImageView
android:layout_width="match_parent"
android:layout_height="194dp"
android:id="@+id/item_image"
android:importantForAccessibility="no"
android:scaleType="centerCrop" />
Mengupdate ItemAdapter untuk menyetel gambar
- Buka
adapter/ItemAdapter.kt
(app > java > adapter > ItemAdapter) - Buka class
ItemViewHolder
. - Instance
ItemViewHolder
harus memiliki referensi keTextView
dan referensi keImageView
di tata letak item daftar. Buat perubahan berikut.
Di bawah inisialisasi properti textView
, tambahkan val
bernama imageView
. Gunakan findViewById()
untuk menemukan referensi ke ImageView
dengan ID item_image
dan tetapkan fungsi tersebut ke properti imageView
.
ItemAdapter.kt
class ItemViewHolder(private val view: View): RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(R.id.item_title)
val imageView: ImageView = view.findViewById(R.id.item_image)
}
- Temukan fungsi
onBindViewHolder()
diItemAdapter
. - Sebelumnya Anda menyetel
stringResourceId
afirmasi menjaditextView
diItemViewHolder
. Sekarang setelimageResourceId
item afirmasi keImageView
tampilan item daftar.
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = dataset[position]
holder.textView.text = context.resources.getString(item.stringResourceId)
holder.imageView.setImageResource(item.imageResourceId)
}
- Jalankan aplikasi, lalu scroll daftar afirmasi.
Aplikasi ini terlihat jauh lebih bagus dengan gambar. Namun, Anda tetap dapat meningkatkan UI aplikasi ini. Di bagian berikutnya, Anda akan membuat penyesuaian kecil pada aplikasi ini untuk meningkatkan UI.
3. Memoles UI
Sejauh ini, Anda telah membuat aplikasi fungsional yang berisi daftar string dan gambar afirmasi. Di bagian ini, Anda akan melihat bagaimana perubahan kecil dalam kode dan XML bisa membuat aplikasi tampak lebih menarik.
Menambahkan padding
Untuk memulai, tambahkan beberapa spasi kosong di antara item dalam daftar.
- Buka
item_list.xml
(app > res > layout > item_list.xml), lalu tambahkan padding16dp
keLinearLayout
yang ada.
list_item.xml
<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="16dp">
- Tambahkan padding
16dp
keitem_title
TextView
. - Di
TextView
, setel atributtextAppearance
ke?attr/textAppearanceHeadline6
.textAppearance
adalah atribut yang memungkinkan Anda menentukan gaya tertentu untuk teks. Untuk kemungkinan lain dari nilai tampilan teks yang ditentukan sebelumnya, Anda dapat melihat bagian TextAppearances di postingan blog tentang Atribut Tema Umum ini.
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
- Jalankan aplikasi. Apakah menurut Anda daftar tersebut tampak lebih baik?
Menggunakan kartu
Masih sulit untuk mengetahui apakah suatu gambar adalah bagian dari teks afirmasi di atas atau di bawahnya. Untuk memperbaikinya, Anda dapat menggunakan tampilan Kartu. Tampilan Kartu memberikan cara mudah untuk menampung sekelompok tampilan, sekaligus memberikan gaya yang konsisten untuk penampung. Untuk panduan Desain Material selengkapnya tentang cara menggunakan kartu, lihat panduan tentang kartu ini.
- Tambahkan
MaterialCardView
di sekitarLinearLayout
yang ada. - Sekali lagi, pindahkan deklarasi skema dari
LinearLayout
ke dalamMaterialCardView
. - Setel
layout_width
dariMaterialCardView
kematch_parent
, danlayout_height
kewrap_content
. - Tambahkan
layout_margin
dari8dp
. - Hapus padding di
LinearLayout
, agar tidak terlalu banyak spasi kosong. - Sekarang jalankan aplikasi lagi. Dapatkah Anda membedakan setiap afirmasi dengan
MaterialCardView
?
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="194dp"
android:importantForAccessibility="no"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
Mengubah warna tema aplikasi
Warna tema aplikasi default mungkin tidak menenangkan seperti beberapa pilihan lain yang dapat Anda buat. Dalam tugas ini, Anda akan mengubah warna tema aplikasi menjadi biru. Anda kemudian mengubahnya lagi menggunakan ide Anda sendiri!
Anda dapat menemukan nuansa biru yang ditentukan sebelumnya dari palet warna Desain Material dari link ini.
Dalam codelab ini, Anda akan menggunakan warna berikut dari palet Desain Material:
- blue_200:
#FF90CAF9
- blue_500:
#FF2196F3
- blue_700:
#FF1976D2
Menambahkan aset warna
Tentukan warna yang digunakan dalam aplikasi Anda di tempat terpusat: file colors.xml
.
- Buka
colors.xml
(res > values > colors.xml). - Tambahkan aset warna baru ke file untuk warna biru yang ditentukan di bawah:
<color name="blue_200">#FF90CAF9</color>
<color name="blue_500">#FF2196F3</color>
<color name="blue_700">#FF1976D2</color>
Mengubah warna tema
Setelah memiliki aset warna baru, Anda dapat menggunakannya di tema.
- Buka
themes.xml
(res > values > themes > themes.xml). - Temukan bagian
<!-- Primary brand color. -->
. - Tambahkan atau ubah
colorPrimary
untuk menggunakan@color/blue_500
. - Tambahkan atau ubah
colorPrimaryVariant
untuk menggunakan@color/blue_700
.
<item name="colorPrimary">@color/blue_500</item>
<item name="colorPrimaryVariant">@color/blue_700</item>
- Jalankan aplikasi. Anda akan melihat warna panel aplikasi berubah menjadi biru.
Mengupdate warna tema gelap
Sebaiknya pilih lebih banyak warna pudar untuk tema gelap aplikasi.
- Buka file
themes.xml
tema gelap (themes > themes.xml (night)). - Tambahkan atau ubah atribut tema
colorPrimary
dancolorPrimaryVariant
seperti berikut:
<item name="colorPrimary">@color/blue_200</item>
<item name="colorPrimaryVariant">@color/blue_500</item>
- Jalankan aplikasi Anda.
- Di Settings perangkat Anda, aktifkan Dark Theme.
- Aplikasi Anda akan beralih ke Dark Theme. Pastikan screenshot terlihat seperti di bawah ini:
- Pada tahap ini, Anda juga dapat menghapus warna yang tidak digunakan di file
colors.xml
Anda (misalnya, aset warna ungu digunakan di tema aplikasi default).
Mengubah ikon aplikasi
Sebagai langkah terakhir, Anda akan mengupdate ikon aplikasi.
- Download file ikon aplikasi
ic_launcher_foreground.xml
danic_launcher_background.xml
. Jika browser menampilkan file, pilih File > Save Page As... untuk menyimpannya ke komputer, bukan mendownloadnya. - Di dalam Android Studio, hapus dua file: file
drawable/ic_launcher_background.xml
dandrawable-v24/ic_launcher_foreground.xml
karena keduanya untuk ikon aplikasi sebelumnya. Anda dapat menghapus centang pada kotak Safe delete (with usage search). - Kemudian, klik kanan folder res > drawable dan pilih New > Image Asset.
- Di jendela Configure Image Asset, pastikan Foreground layer dipilih.
- Di bawahnya, temukan label Path.
- Klik ikon folder di dalam kotak teks Path.
- Temukan dan buka file
ic_launcher_foreground.xml
yang Anda download di komputer.
- Beralih ke tab Background Layer.
- Klik ikon Browse di dalam kotak teks Path.
- Temukan dan buka file
ic_launcher_background.xml
di komputer. Tidak ada perubahan lain yang diperlukan. - Klik Next.
- Di dialog Confirm Icon Path, klik Finish. Anda dapat menimpa ikon yang ada.
- Untuk praktik terbaik, Anda dapat memindahkan vektor drawable baru
ic_launcher_foreground.xml
danic_launcher_background.xml
ke direktori aset baru yang disebutdrawable-anydpi-v26
. Ikon adaptif diperkenalkan di API 26, sehingga aset ini hanya akan digunakan pada perangkat yang menjalankan API 26 dan yang lebih baru (untuk semua dpi). - Hapus direktori
drawable-v24
jika tidak ada lagi yang tersisa. - Jalankan aplikasi Anda dan lihat ikon aplikasi yang baru dan bagus di panel daftar aplikasi!
- Sebagai langkah terakhir, jangan lupa memformat ulang Kotlin dan file XML di project sehingga kode Anda lebih rapi dan mengikuti panduan gaya.
Selamat! Anda telah membuat aplikasi Affirmations yang menginspirasi.
Dengan menggunakan pengetahuan cara menampilkan daftar data di aplikasi Android, apa yang dapat Anda buat berikutnya?
4. Kode solusi
Kode solusi untuk aplikasi Affirmations ada di repositori GitHub di bawah:
- Buka halaman repositori GitHub yang disediakan untuk project.
- Pastikan nama cabang cocok dengan nama cabang yang ditentukan dalam codelab. Misalnya, dalam screenshot berikut, nama cabang adalah main (utama).
- Di halaman GitHub project, klik tombol Code yang akan menampilkan pop-up.
- Pada pop-up, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
- Temukan file di komputer Anda (mungkin di folder Downloads).
- Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.
Membuka project di Android Studio
- Mulai Android Studio.
- Di jendela Welcome to Android Studio, klik Open.
Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > Open.
- Di file browser, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
- Klik dua kali pada folder project tersebut.
- Tunggu Android Studio membuka project.
- Klik tombol Run untuk mem-build dan menjalankan aplikasi. Pastikan aplikasi di-build seperti yang diharapkan.
5. Ringkasan
- Untuk menampilkan konten tambahan di
RecyclerView
, ubah class model data dan sumber data yang mendasarinya. Kemudian lakukan update pada tata letak item daftar dan adaptor untuk menyetel data tersebut pada tampilan. - Gunakan anotasi aset untuk membantu memastikan bahwa jenis ID aset yang tepat diteruskan ke konstruktor class.
- Gunakan Komponen Material untuk library Android agar aplikasi Anda lebih mudah mengikuti panduan Desain Material yang direkomendasikan.
- Gunakan
MaterialCardView
untuk menampilkan konten di kartu Material. - Penyesuaian visual kecil pada warna dan spasi aplikasi Anda dapat membuat aplikasi tampak lebih bagus dan konsisten.
6. Pelajari lebih lanjut
7. Tugas tantangan
Dalam serangkaian codelab ini, Anda telah belajar menggunakan LinearLayoutManager
dengan RecyclerView
. RecyclerView
dapat menggunakan LayoutManagers lain untuk data tata letak yang berbeda.
- Ubah properti
layoutManager
dariRecyclerView
menjadiGridLayoutManager
. - Ubah jumlah kolom menjadi 3.
- Ubah tata letak adaptor untuk memvisualisasikan data dalam petak.