안드로이드 앱 개발
(3) 바디와이짐 커뮤니티 앱 개발 - 홈 화면
vitamin3000
2024. 9. 20. 14:45
지난 과정인 파이어베이스 연결 후 과정으로
초기 디자인에 맞게 로그인 화면을 구성하였다.
[작성한 코드는 다음과 같다]
html 화면 구성
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
tools:context=".LoginActivity">
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="392dp"
android:orientation="vertical"
android:paddingLeft="50dp"
android:paddingRight="50dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<EditText
android:id="@+id/editTextId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ems="10"
android:hint="아이디"
android:inputType="text"
android:paddingLeft="9dp"
android:textColor="#000000"
android:textColorHint="#8D000000"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="11dp"
android:layout_marginBottom="70dp"
android:ems="10"
android:hint="비밀번호"
android:inputType="textPassword"
android:paddingLeft="8dp"
android:textColor="#000000"
android:textColorHint="#8D000000"
app:layout_constraintBottom_toTopOf="@+id/btnLogin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextId" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/btnLogin"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:backgroundTint="#00FF0000"
android:padding="5dp"
android:text="로그인"
android:textColor="#000000" />
<Button
android:id="@+id/btnRegister"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:backgroundTint="#00FF0000"
android:padding="5dp"
android:text="회원가입"
android:textColor="#000000" />
</LinearLayout>
<ImageView
android:id="@+id/imageView"
android:layout_width="281dp"
android:layout_height="244dp"
android:layout_marginTop="80dp"
android:src="@drawable/bodygym"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
기능 구현 LoginActivity.kt
package com.example.bodygym
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
class LoginActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var editTextId: EditText
private lateinit var editTextPassword: EditText
private lateinit var btnLogin: Button
private lateinit var btnRegister: Button
// SharedPreferences를 사용하기 위한 변수
private lateinit var prefs: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
auth = FirebaseAuth.getInstance()
// SharedPreferences 인스턴스 초기화
prefs = getSharedPreferences("com.example.bodygym", Context.MODE_PRIVATE)
editTextId = findViewById(R.id.editTextId)
editTextPassword = findViewById(R.id.editTextPassword)
btnLogin = findViewById(R.id.btnLogin)
btnRegister = findViewById(R.id.btnRegister)
btnLogin.setOnClickListener {
val email = editTextId.text.toString()
val password = editTextPassword.text.toString()
loginUserOnFirebase(email, password)
}
btnRegister.setOnClickListener {
// RegisterActivity를 실행하기 위한 Intent 생성
val intent = Intent(this, RegisterActivity::class.java)
// Intent를 실행하여 RegisterActivity를 시작
startActivity(intent)
Toast.makeText(this, "회원가입 화면으로 이동합니다.", Toast.LENGTH_SHORT).show()
}
}
private fun loginUserOnFirebase(email: String, password: String) {
// 이메일과 비밀번호가 비어 있지 않은지 확인
if (email.isBlank() || password.isBlank()) {
Toast.makeText(this, "이메일과 비밀번호를 모두 입력해주세요.", Toast.LENGTH_SHORT).show()
return
}
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// 로그인 성공 후 SharedPreferences에 로그인 정보 저장
saveLoginInfo(email)
Toast.makeText(this, "$email 님, 로그인에 성공하셨습니다.", Toast.LENGTH_SHORT).show()
val intent = Intent(this, HomeActivity::class.java) // HomeActivity로 이동하는 Intent 생성
startActivity(intent) // Intent 시작
finish() // 현재 Activity 종료
} else {
// 로그인 실패 시 예외 메시지를 사용자에게 보여줍니다.
Toast.makeText(this, "로그인 실패: ${task.exception?.localizedMessage}", Toast.LENGTH_LONG).show()
}
}
}
// 로그인 성공 후 SharedPreferences에 로그인 정보 저장하는 메서드
private fun saveLoginInfo(email: String) {
val editor = prefs.edit()
editor.putString("userId", email)
editor.apply()
}
}
[아쉬운 점]
우선 제작하는 것에 초점이 맞췄기 떄문에 버튼 id를 각각 지정하는 것
대신 각 버튼마다 값을 직접 넣어 전체 코드가 길어졌다.
이 점이 아쉽다.
저장되는 데이터 구조는 다음과 같다.
Users -> 각 사용자의 uuid -> nickname
[결과화면]