인프런 커뮤니티 질문&답변

kotlin21sswu님의 프로필 이미지

작성한 질문수

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

예제 앱 만들기 - 2 (데이터바인딩, 로그인, 로그아웃)

로그인 로그아웃

작성

·

25

0

강의 잘 보고 있습니다

다름이 아니라 로그인 로그아웃 버튼도 만들었고

수업에 나온 것처럼 똑같이 코드를 썼는데도

막상 작동하면 uid까진 출력되는데

문제는

1) 로그아웃 버튼을 누르면 null 메세지가 출력이 안 됩니다

2) 그렇다고 로그아웃 버튼을 누르고 로그인 되어있던 계정을 누르면 toast로 써둔 "로그인 성공"이라는 메세지가 안 뜸

 

일단 MainActivity.kt에 쓴 코드와

activity_main.xml에 쓴 코드를 올리겠습니다

 

//MainActivity.kt에 쓴 코드

package com.example.mysampleapp
import com.example.mysampleapp.databinding.ActivityMainBinding
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.databinding.DataBindingUtil
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        // Initialize Firebase Auth
        auth = Firebase.auth
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)

        Toast.makeText(this, auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show()

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        val joinBtnClicked = findViewById<Button>(R.id.joinBtn)
        joinBtnClicked.setOnClickListener {
//              첫번째 방법
//            val email = findViewById<EditText>(R.id.emailArea)
//            val pwd = findViewById<EditText>(R.id.pwdArea)

            //두번째 방법
            val email = binding.emailArea
            val pwd = binding.pwdArea

            auth.createUserWithEmailAndPassword(
                email.text.toString(),
                pwd.text.toString()

                )
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show()
                    } else {
                        Toast.makeText(this,"no",Toast.LENGTH_SHORT).show()
                    }
                }

                binding.logoutBtn.setOnClickListener{
                    auth.signOut()
                    Toast.makeText(this,auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show()
                }

                binding.loginBtn.setOnClickListener{

                    val email = binding.emailArea
                    val pwd = binding.pwdArea

                    auth.signInWithEmailAndPassword(
                        email.text.toString(),
                        pwd.text.toString()
                    )
                        .addOnCompleteListener(this) { task ->
                            if (task.isSuccessful) {
                                //성공하면
                                Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show()
                                //성공하면 UID 값을 띄워보자↓
                                Toast.makeText(this,auth.currentUser?.uid.toString(),Toast.LENGTH_SHORT).show()

                            } else {
                                //실패하면
                                Toast.makeText(this, "로그인 실패", Toast.LENGTH_SHORT).show()


                            }
                        }
                }
        }
    }
}

//activity_main.xml에 쓴 코드

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <LinearLayout
        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:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">

        <EditText
            android:id="@+id/emailArea"
            android:hint="email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <EditText
            android:id="@+id/pwdArea"
            android:hint="pwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/joinBtn"
            android:text="회원가입"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        
        <Button
            android:id="@+id/logoutBtn"
            android:text="LOGOUT"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/loginBtn"
            android:text="LOGIN"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>



    </LinearLayout>
</layout>

긴 글 읽어주심에 감사합니다....😥😥

답변 2

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

2024. 10. 17. 20:03

안녕하세요.

전체 프로젝트를 압축해서 깃허브나 구글 드라이브를 통해 공유해주시면 살펴볼게요~

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 16. 07:41

안녕하세요, 인프런 AI 인턴입니다. kotlin21sswu님.

로그인 및 로그아웃 기능과 관련하여 문제를 겪고 계신 것 같습니다. 우선, 로그인 및 로그아웃 버튼과 관련된 메소드를 다시 확인하고 테스트할 수 있도록 몇 가지 제안을 드리겠습니다.

문제 설명과 해결 방법

  1. 로그아웃 버튼을 누를 때 null 메세지가 출력되지 않는 문제:
  • 로그아웃 메소드는 auth.currentUsernull로 설정합니다. 로그아웃 후 auth.currentUsernull로 되어야 하지만, 문자열 변환 메소드 toString()을 사용할 때 실제 null이 아니라 “null”이라는 문자열이 출력될 수 있습니다.
  • 로그아웃 버튼의 코드에서 메세지를 auth.currentUser의 존재 여부에 따라 나타내도록 수정해보세요:
    
    binding.logoutBtn.setOnClickListener {
      auth.signOut()
      val message = if(auth.currentUser == null) "Logged out successfully" else "Failed to log out"
      Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
    

  1. 로그아웃 후 동일 계정으로 다시 로그인할 때 메세지가 뜨지 않는 문제:
  • 로그인 과정에서 메소드 체이닝 중에 문제가 발생한 것일 수도 있습니다. auth.signInWithEmailAndPassword()의 결과를 로그로 직접 확인하여 task.isSuccessful 내의 로직이 제대로 실행되고 있는지 체크해보세요:

    binding.loginBtn.setOnClickListener {
      val email = binding.emailArea
      val pwd = binding.pwdArea
    
    
      auth.signInWithEmailAndPassword(email.text.toString(), pwd.text.toString())
          .addOnCompleteListener(this) { task ->
              if (task.isSuccessful) {
                  Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show()
                  Toast.makeText(this, auth.currentUser?.uid.toString(), Toast.LENGTH_SHORT).show()
              } else {
                  Toast.makeText(this, "로그인 실패", Toast.LENGTH_SHORT).show()
              }
          }
    }
    
  1. 버튼의 리스너가 onCreate() 한 구문 내에 잘 배치되었는지:
  • onCreate() 메소드 안에서 setOnClickListenersetContentView(R.layout.activity_main) 호출 후에 배치됩니다. 이 부분이 잘 구현되어 있는지 확인하세요.

추가 도움말

최신 Firebase SDK가 설치되어 있는지, AndroidManifest.xml 및 google-services.json 파일이 올바르게 설정되어 있는지도 확인해 보세요. 문제가 지속된다면 로그를 통해 추가적인 오류 메시지를 확인하는 것이 도움될 수 있습니다.

이와 관련된 유사한 문제에 대한 추가적인 설명은 아래의 링크를 통해 참고하실 수 있습니다:
- 파이어 베이스 회원가입 과정이 안됩니다.
- 로그인 no 로 나오고 파이어베이스 사용자에 데이터가 안 들어옵니다

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.