안드로이드 앱 개발

(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

[결과화면]