Tugas 4 PPB F
Nama : Beryl
NRP : 5025201029
Kelas : Pemrograman Perangkat Bergerak F
Dice Roller App
Membuat project
- Di Android Studio, klik File > New > New Project.
- Dalam dialog New Project, pilih Empty Activity, lalu klik Next.
- Di kolom Name, masukkan
Dice Roller
. - Di kolom Minimum SDK, pilih API level minimum 24 (Nougat) dari menu, lalu klik Finish.
Mengubah Struktur Kode Contoh
Untuk menyusun ulang kode contoh:
- Hapus fungsi
DefaultPreview()
. - Buat fungsi
DiceWithButtonAndImage()
dengan anotasi@Composable
.
Fungsi composable ini mewakili komponen UI tata letak dan juga menampung logika klik tombol dan tampilan gambar.
- Hapus fungsi
Greeting(name: String)
. - Buat fungsi
DiceRollerApp()
dengan anotasi@Preview
dan@Composable
.
Aplikasi ini hanya terdiri dari tombol dan gambar. Jadi, anggap fungsi composable ini sebagai aplikasi itu sendiri. Itulah alasannya fungsi ini disebut fungsi DiceRollerApp()
.
- Hapus semua kode di dalam lambda
setContent{}
yang ditemukan dalam metodeonCreate()
. - Di bagian lambda
setContent{}
, panggil lambdaDiceRollerTheme{}
, lalu di dalam lambdaDiceRollerTheme{}
, panggil fungsiDiceRollerApp()
.
- Di fungsi
DiceRollerApp()
, panggil fungsiDiceWithButtonAndImage()
.
Menambahkan pengubah
Modifier
yang merupakan kumpulan elemen yang mendekorasi atau mengubah perilaku elemen UI Compose. Anda menggunakannya untuk menata gaya komponen UI dari komponen aplikasi Dice Roller.- Ubah fungsi
DiceWithButtonAndImage()
untuk menerima argumenmodifier
dari jenisModifier
dan tetapkan nilai defaultModifier
.
- Setelah composable
DiceWithButtonAndImage()
memiliki parameter pengubah, teruskan pengubah saat composable dipanggil. Tanda tangan metode untuk fungsiDiceWithButtonAndImage()
mengalami perubahan sehingga objekModifier
dengan dekorasi yang diinginkan harus diteruskan saat dipanggil. ClassModifier
bertanggung jawab atas dekorasi, atau penambahan perilaku, pada composable di fungsiDiceRollerApp()
. Dalam hal ini, ada beberapa dekorasi penting yang dapat ditambahkan ke objekModifier
yang diteruskan ke fungsiDiceWithButtonAndImage()
.
- Buat rantai metode
fillMaxSize()
ke objekModifier
sehingga tata letak mengisi seluruh layar.
Column()
.- Dalam fungsi
DiceWithButtonAndImage()
, tambahkan fungsiColumn()
. - Teruskan argumen
modifier
dari tanda tangan metodeDiceWithImageAndButton()
ke argumen pengubahColumn()
.
Argumen modifier
memastikan bahwa composable dalam fungsi Column()
mematuhi batasan yang dipanggil pada instance modifier
.
- Teruskan argumen
horizontalAlignment
ke fungsiColumn()
, lalu tetapkan ke nilaiAlignment.CenterHorizontally
.
Menambahkan tombol
- Di file
strings.xml
, tambahkan string dan tetapkan ke nilaiRoll
. - Dalam isi lambda
Column()
, tambahkan fungsiButton()
. - Di file
MainActivity.kt
, tambahkan fungsiText()
keButton()
dalam isi lambda fungsi. - Teruskan ID resource string dari string
roll
ke fungsistringResource()
dan teruskan hasilnya ke composableText
.
Menambahkan gambar
- Buka URL ini untuk mendownload file zip gambar dadu ke komputer, lalu tunggu download selesai.
- Ekstrak file zip untuk membuat folder
dice_images
baru yang berisi enam file gambar dadu dengan nilai dadu dari 1 sampai 6.
Menambahkan gambar dadu ke aplikasi Anda
- Di Android Studio, klik View > Tool Windows > Resource Manager.
- Klik + > Import Drawables untuk membuka file browser.
- Temukan dan pilih enam folder gambar dadu, lalu lanjutkan untuk menguploadnya.
Gambar yang diupload akan muncul sebagai berikut.
- Klik Next.
Dialog Import Drawables akan muncul dan menampilkan lokasi file resource berada di struktur file.
- Klik Import untuk mengonfirmasi bahwa Anda ingin mengimpor enam gambar.
Gambar akan muncul di panel Resource Manager.
Menambahkan composable Image
- Pada isi fungsi
Column()
, buat fungsiImage()
sebelum fungsiButton()
.
- Teruskan argumen
painter
ke fungsiImage()
, lalu tetapkan nilaipainterResource
yang menerima argumen ID resource drawable. Untuk saat ini, teruskan ID resource berikut: argumenR.drawable.dice_1
.
- Setiap kali membuat Gambar di aplikasi, Anda harus memberikan apa yang disebut dengan "deskripsi konten". Deskripsi konten adalah bagian penting dari pengembangan Android. Gambar menyediakan deskripsi ke komponen UI masing-masing untuk meningkatkan aksesibilitas. Untuk informasi deskripsi konten selengkapnya, lihat Menjelaskan setiap elemen UI. Anda dapat meneruskan deskripsi konten ke gambar sebagai parameter.
Kini semua komponen UI yang diperlukan sudah ada. Namun, Button
dan Image
sedikit saling bersinggungan.
- Untuk memperbaikinya, tambahkan composable
Spacer
di antara composableButton
danImage
.Spacer
menggunakanModifier
sebagai parameter. Dalam hal ini,Image
berada di atasButton
sehingga harus ada spasi vertikal di antara keduanya. Oleh karena itu, tinggiModifier
dapat disetel agar berlaku untukSpacer
. Coba tetapkan tinggi ke16.dp
. Biasanya, dimensi dp diubah dengan kelipatan4.dp
.
Membuat logika pelemparan dadu
- Pada fungsi
DiceWithButtonAndImage()
sebelum fungsiColumn()
, buat variabelresult
dan tetapkan agar sama dengan nilai1
. - Lihat composable
Button
. Anda akan melihat parameteronClick
yang ditetapkan ke sepasang tanda kurung kurawal dengan komentar/*TODO*/
di dalam kurung kurawal. Dalam hal ini kurung kurawal mewakili lambda, area di dalam kurung kurawal yang menjadi badan lambda. Jika diteruskan sebagai argumen, fungsi juga dapat disebut sebagai " callback". - Dalam fungsi
Button()
, hapus komentar/*TODO*/
dari nilai isi lambda parameteronClick
. - Lemparan dadu bersifat acak. Untuk menunjukkan hal itu dalam kode, Anda perlu menggunakan sintaksis yang benar untuk menghasilkan angka acak. Di Kotlin, Anda dapat menggunakan metode
random()
pada rentang nomor. Dalam isi lambdaonClick
, tetapkan variabelresult
ke rentang antara 1 hingga 6, lalu panggil metoderandom()
pada rentang tersebut. Ingat bahwa dalam Kotlin, rentang ditentukan oleh dua titik antara angka pertama dalam rentang dan angka terakhir dalam rentang.
Menambahkan kondisional ke aplikasi dice roller
result
akan direset saat tombol Roll diketuk dan akan menentukan gambar yang ditampilkan. Composable bersifat stateless secara default, yang berarti bahwa composable tersebut tidak memiliki nilai dan dapat disusun ulang oleh sistem kapan saja sehingga mengakibatkan nilai tersebut direset. Namun, Compose menyediakan cara yang praktis untuk menghindari hal ini. Fungsi composable dapat menyimpan objek dalam memori menggunakan composable remember
.- Ubah variabel
result
menjadi composableremember
.
Composable remember
memerlukan fungsi yang diteruskan.
- Dalam isi composable
remember
, teruskan fungsimutableStateOf()
, lalu teruskan argumen1
ke fungsi tersebut.
Fungsi mutableStateOf()
akan menampilkan objek yang dapat diamati. Anda akan mempelajari observable lebih lanjut nanti. Namun, untuk saat ini, pada dasarnya ini berarti bahwa saat nilai variabel result
berubah, rekomposisi akan dipicu, nilai hasilnya akan tercermin, dan UI akan di-refresh.
Sekarang, saat tombol diketuk, variabel result
akan diupdate dengan nilai angka acak.
Sekarang, variabel result
dapat digunakan untuk menentukan gambar yang akan ditampilkan.
- Di bawah pembuatan instance variabel
result
, buat variabelimageResource
tetap yang ditetapkan ke ekspresiwhen
yang menerima variabelresult
, lalu tetapkan setiap kemungkinan hasil ke drawable-nya.
- Ubah ID yang diteruskan ke parameter
painterResource
composableImage
dari drawableR.drawable.dice_1
ke variabelimageResource
. - Ubah parameter
contentDescription
composableImage
untuk mencerminkan nilai variabelresult
dengan mengonversi variabelresult
menjadi string dengantoString()
dan meneruskannya sebagaicontentDescription
.
- Jalankan aplikasi.
Tampilan Akhir
Source Code
package com.example.tugasppb4 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.tugasppb4.ui.theme.TugasPPB4Theme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { TugasPPB4Theme { DiceRollerApp() } } } } @Preview @Composable fun DiceRollerApp() { DiceWithButtonAndImage(modifier = Modifier .fillMaxSize() .wrapContentSize(Alignment.Center) ) } @Composable fun DiceWithButtonAndImage(modifier: Modifier = Modifier) { var result by remember { mutableStateOf(1) } val imageResource = when (result) { 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 } Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally ) { Image( painter = painterResource(imageResource), contentDescription = result.toString() ) Spacer(modifier = Modifier.height(16.dp)) Button(onClick = { result = (1..6).random() }) { Text(stringResource(R.string.roll)) } } }
Tugas PPB 4
ReplyDelete