PPB - Tugas 6

Nama : Ahmad Hafiz Mahardika

NRP : 5025201196

Kelas : Pemrograman Perangkat Bergerak (B)

Implementasi Halaman Login

Implementasi:

class MainActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
MyLoginTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
LoginScreen(modifier = Modifier.padding(innerPadding))
}
}
}
}
}
Class ini merupakan titik awal dari aplikasi halaman login ini. Pada class ini, dipanggil fungi composable LoginScreen sebagai isi dari halaman login.

Fungsi Composable LoginScreen
@Composable
fun LoginScreen(modifier: Modifier = Modifier) {
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }

Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.login_art2),
contentDescription = "Login Art",
modifier = Modifier
.size(200.dp),
)
Text(
text = "Welcome Back",
style = MaterialTheme.typography.headlineLarge,
fontWeight = FontWeight.Bold
)
Text(
text = "Login to your account",
style = MaterialTheme.typography.bodyLarge
)

Spacer(modifier = Modifier.height(32.dp))

OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Email,
imeAction = ImeAction.Next
),
singleLine = true
)
Spacer(modifier = Modifier.height(8.dp))
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
)
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = { /*TODO*/ }
) {
Text("Login")
}

Spacer(modifier = Modifier.height(32.dp))

Text(
text = "Forgot password?",
modifier = Modifier.clickable(onClick = { /*TODO*/ })
)

Spacer(modifier = Modifier.height(32.dp))

Text("Or sign in with")
Spacer(modifier = Modifier.height(16.dp))
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 48.dp)
) {
Image(
painter = painterResource(id = R.drawable.facebook_logo),
contentDescription = "Facebook Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
Image(
painter = painterResource(id = R.drawable.google__g__logo),
contentDescription = "Google Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
Image(
painter = painterResource(id = R.drawable.x_logo),
contentDescription = "X Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
}
}
}
Fungsi LoginScreen adalah fungsi composable utama pada halaman login yang diimplementasi. Pertama, dipanggil fungsi Column untuk meletakkan komponen-komponen halaman berurutan secara vertikal. Didalam Column, dipanggil komponen Image untuk memasukkan gambar, komponen text untuk memasukkan elemen teks, komponen OutlinedTextField sebagai field untuk input dari user dan komponen Button untuk tombol login. Untuk memberikan jeda antar komponen, digunakan komponen Spacer. Logo-logo untuk authorization melalui pihak ketiga diletakkan pada komponen Row agar logo muncul berurutan secara horizontal.

Screenshot Hasil dan Demo

Screenshot:

Demo:



Kode

MainActivity.kt
package com.example.mylogin

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.ui.Modifier
import com.example.mylogin.ui.theme.MyLoginTheme

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
MyLoginTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
LoginScreen(modifier = Modifier.padding(innerPadding))
}
}
}
}
}
LoginScreen.kt
package com.example.mylogin

import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
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.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.mylogin.ui.theme.MyLoginTheme

@Composable
fun LoginScreen(modifier: Modifier = Modifier) {
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }

Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.login_art2),
contentDescription = "Login Art",
modifier = Modifier
.size(200.dp),
)
Text(
text = "Welcome Back",
style = MaterialTheme.typography.headlineLarge,
fontWeight = FontWeight.Bold
)
Text(
text = "Login to your account",
style = MaterialTheme.typography.bodyLarge
)

Spacer(modifier = Modifier.height(32.dp))

OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Email,
imeAction = ImeAction.Next
),
singleLine = true
)
Spacer(modifier = Modifier.height(8.dp))
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
)
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = { /*TODO*/ }
) {
Text("Login")
}

Spacer(modifier = Modifier.height(32.dp))

Text(
text = "Forgot password?",
modifier = Modifier.clickable(onClick = { /*TODO*/ })
)

Spacer(modifier = Modifier.height(32.dp))

Text("Or sign in with")
Spacer(modifier = Modifier.height(16.dp))
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 48.dp)
) {
Image(
painter = painterResource(id = R.drawable.facebook_logo),
contentDescription = "Facebook Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
Image(
painter = painterResource(id = R.drawable.google__g__logo),
contentDescription = "Google Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
Image(
painter = painterResource(id = R.drawable.x_logo),
contentDescription = "X Logo",
modifier = Modifier
.size(40.dp)
.clickable(onClick = { /*TODO*/ })
)
}
}
}

@Preview(showBackground = true)
@Composable
fun LoginScreenPreview() {
MyLoginTheme {
LoginScreen()
}
}

Referensi

Comments

Popular posts from this blog

PPB - Tugas 2

PPB - Tugas 4