Furstin Aprilavia Putri - 5025221234 - PPB D
Membuat Aplikasi Kalkulator dengan menggunakan Kotlin
1. Pendahuluan
Kali ini saya membuat aplikasi Android sederhana menggunakan Jetpack Compose yang memiliki dua fitur utama, yaitu :
1. Kalkulator Aritmatika Dasar
2. Konversi Suhu dari Celsius ke Fahrenheit dan Kelvin
2. Aplikasi Sederhana
Kode lengkap bisa dilihat di GitHub : https://github.com/furstinvia/ppb-d-5-calculator.git
🧮 Kalkulator Aritmatika Dasar (CalculatorUI())
Fitur kalkulator memanfaatkan dua TextField untuk input angka, serta tombol operasi (+, -, *, /) yang memanggil fungsi calculate().
var num1 by remember { mutableStateOf("0") }
var num2 by remember { mutableStateOf("0") }
var result by remember { mutableStateOf<String?>(null) }
Input & Tombol Operasi:
TextField(value = num1, onValueChange = { num1 = it }, label = { Text("Angka Pertama") })
TextField(value = num2, onValueChange = { num2 = it }, label = { Text("Angka Kedua") })
Row {
Button(onClick = { result = calculate(num1, num2, "+") }) { Text("Add") }
Button(onClick = { result = calculate(num1, num2, "-") }) { Text("Sub") }
Button(onClick = { result = calculate(num1, num2, "*") }) { Text("Mul") }
Button(onClick = { result = calculate(num1, num2, "/") }) { Text("Div") }
}
Fungsi Hitung:
private fun calculate(n1: String, n2: String, operator: String): String {
return try {
val a = n1.toInt()
val b = n2.toInt()
when (operator) {
"+" -> (a + b).toString()
"-" -> (a - b).toString()
"*" -> (a * b).toString()
"/" -> if (b != 0) (a / b).toString() else "Error: divide by zero"
else -> "Invalid"
}
} catch (e: NumberFormatException) {
"Invalid input"
}
}
🌡️ Konversi Suhu (TemperatureConverterUI())
Fitur ini mengkonversi suhu dari Celsius ke Fahrenheit dan Kelvin dengan tombol aksi masing-masing.
var inputTemp by remember { mutableStateOf("0") }
var resultTemp by remember { mutableStateOf("") }
Input & Tombol Konversi:
TextField(
value = inputTemp,
onValueChange = { inputTemp = it },
label = { Text("Suhu dalam Celcius") }
)
Button(onClick = {
val c = inputTemp.toDoubleOrNull()
resultTemp = if (c != null) {
val f = c * 9 / 5 + 32
"Fahrenheit: %.2f".format(f)
} else "Invalid input"
}) { Text("To Fahrenheit") }
Button(onClick = {
val c = inputTemp.toDoubleOrNull()
resultTemp = if (c != null) {
val k = c + 273.15
"Kelvin: %.2f".format(k)
} else "Invalid input"
}) { Text("To Kelvin") }
Aplikasi ini merupakan contoh implementasi dua fitur interaktif dalam satu aplikasi Compose:
- Kalkulator Aritmatika (add, sub, mul, div)
- Konversi Suhu (Celsius → Fahrenheit/Kelvin)
Menggunakan Jetpack Compose membuat struktur UI lebih bersih dan terpisah dari logika.
3. Video Presentasi
Kode Lengkap
package com.example.calculator
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.calculator.ui.theme.CalculatorTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
CalculatorTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.padding(16.dp)
.fillMaxSize(),
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
CalculatorUI()
Spacer(modifier = Modifier.height(32.dp))
Divider()
Spacer(modifier = Modifier.height(32.dp))
TemperatureConverterUI()
}
}
}
}
}
@Composable
fun CalculatorUI() {
var num1 by remember { mutableStateOf("0") }
var num2 by remember { mutableStateOf("0") }
var result by remember { mutableStateOf<String?>(null) }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Calculator by Furstin Aprilavia",
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = num1,
onValueChange = { num1 = it },
label = { Text("Angka Pertama") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(8.dp))
TextField(
value = num2,
onValueChange = { num2 = it },
label = { Text("Angka Kedua") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth()
) {
Button(onClick = {
result = calculate(num1, num2, "+")
}) {
Text("Add")
}
Button(onClick = {
result = calculate(num1, num2, "-")
}) {
Text("Sub")
}
Button(onClick = {
result = calculate(num1, num2, "*")
}) {
Text("Mul")
}
Button(onClick = {
result = calculate(num1, num2, "/")
}) {
Text("Div")
}
}
Spacer(modifier = Modifier.height(24.dp))
Text(
text = "Result: ${result ?: ""}",
style = MaterialTheme.typography.bodyLarge,
fontSize = 18.sp
)
}
}
private fun calculate(n1: String, n2: String, operator: String): String {
return try {
val a = n1.toInt()
val b = n2.toInt()
when (operator) {
"+" -> (a + b).toString()
"-" -> (a - b).toString()
"*" -> (a * b).toString()
"/" -> if (b != 0) (a / b).toString() else "Error: divide by zero"
else -> "Invalid"
}
} catch (e: NumberFormatException) {
"Invalid input"
}
}
@Composable
fun TemperatureConverterUI() {
var inputTemp by remember { mutableStateOf("0") }
var resultTemp by remember { mutableStateOf("") }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Konversi Suhu by Furstin Aprilavia",
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = inputTemp,
onValueChange = { inputTemp = it },
label = { Text("Suhu dalam Celcius") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
modifier = Modifier.fillMaxWidth()
) {
Button(onClick = {
val c = inputTemp.toDoubleOrNull()
resultTemp = if (c != null) {
val f = c * 9 / 5 + 32
"Fahrenheit: %.2f".format(f)
} else {
"Invalid input"
}
}) {
Text("To Fahrenheit")
}
Button(onClick = {
val c = inputTemp.toDoubleOrNull()
resultTemp = if (c != null) {
val k = c + 273.15
"Kelvin: %.2f".format(k)
} else {
"Invalid input"
}
}) {
Text("To Kelvin")
}
}
Spacer(modifier = Modifier.height(16.dp))
Text(
text = resultTemp,
style = MaterialTheme.typography.bodyLarge,
fontSize = 18.sp
)
}
}
}
Comments
Post a Comment