코틀린 개인 과제

로그인 앱 제작

songyooho 2024. 6. 19. 18:00

1. 설계

1)SignInActivity

-아이디와 비밀번호 입력란을 만들음. 하나라도 비워져있으면 토스트 메세지 띄움

-로그인 버튼과 회원가입 버튼을 만들음

-로그인시 HomeActivity가 실행되고 아이디를 인텐트로 같이 전달

-회원가입시 SignUpActivity가 실행되고 이때 registerForActivityResult를 사용해 돌아올때 데이터를 보내도록 함

 

2)SignUpActivity

-아이디와 비밀번호, 이름 입력란을 만들음. 하나라도 비워져있으면 토스트 메세지 띄움

-회원가입버튼을 누르면 돌아가면서 아이디와 비밀번호 데이터를 같이 전달하며 finish()

 

3)HomeActivity

-전달받은 아이디를 화면에 띄우고 나머진 자기소개 하드코딩 해둠

-랜덤한 5개 이미지중 하나를 띄움

 

2. SignInActivity

package com.example.login

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class SignInActivity : AppCompatActivity() {
    private lateinit var launcher: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val id=findViewById<EditText>(R.id.id)
        val pass=findViewById<EditText>(R.id.pass)

        val login=findViewById<Button>(R.id.loginbtn)
        val signup=findViewById<Button>(R.id.signupbtn)

        login.setOnClickListener {
            val idStr=id.text.toString()
            val passStr=pass.text.toString()
            if(idStr.length==0||passStr.length==0){
                Toast.makeText(this,"아이디/비밀번호를 확인해주세요",Toast.LENGTH_SHORT).show()
            }else{
                Toast.makeText(this,"로그인 성공",Toast.LENGTH_SHORT).show()
                val intent=Intent(this, HomeActivity::class.java)
                intent.putExtra("id",idStr)
                startActivity(intent)
            }
        }

        launcher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
                result->
            run{
                id.setText(result.data!!.getStringExtra("id"))
                pass.setText(result.data!!.getStringExtra("pass"))
            }
        }

        signup.setOnClickListener {
            val intent=Intent(this, SignUpActivity::class.java)
            launcher.launch(intent)
        }
    }
}

1)registerForActivityResult

<1>특정 액티비티를 인텐트로 실행시켰다가 다시 돌아올때 결과 코드와 데이터를 받아오기위함

<2>방법

-전역변수 선언:Activity class내부에 선언

private lateinit var launcher: ActivityResultLauncher<Intent>

-반환 코드별 동작과 데이터 받아오기(예시)

launcher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
        result->
        if(result.resultCode==RESULT_OK){
        	~
        }
        else{
        	run{
                id.setText(result.data!!.getStringExtra("id"))
                pass.setText(result.data!!.getStringExtra("pass"))
            }
        }
    
}

-돌아가기전에 실행된 액티비티에서 데이터 송신

val intent=Intent(this,SignInActivity::class.java)
intent.putExtra("id",idStr)
intent.putExtra("pass",passStr)
setResult(RESULT_OK,intent)

-setResult는 반드시 해줘야 한다.

 

 

3. SignUpActivity

package com.example.login

import android.content.Intent
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

class SignUpActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_sign_up)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val name=findViewById<EditText>(R.id.name)
        val id=findViewById<EditText>(R.id.idup)
        val pass=findViewById<EditText>(R.id.passup)

        val signUpBtn=findViewById<Button>(R.id.signupbtnup)

        signUpBtn.setOnClickListener {


            val nameStr=name.text.toString()
            val idStr=id.text.toString()
            val passStr=pass.text.toString()

            if(nameStr.length==0||idStr.length==0||passStr.length==0){
                Toast.makeText(this,"입력되지 않은 정보가 있습니다",Toast.LENGTH_SHORT).show()
            }else{
                val intent=Intent(this,SignInActivity::class.java)
                intent.putExtra("id",idStr)
                intent.putExtra("pass",passStr)
                setResult(RESULT_OK,intent)
                finish()
            }
        }
    }
}

-EditText에서 문자열 가져오려면: editText.text.toString()

 

 

4.HomeActivity

package com.example.login

import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import java.util.Random

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_home)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val imageview=findViewById<ImageView>(R.id.randomImage)

        val random=Random()
        val num=random.nextInt(5)

        when(num){
            0->imageview.setImageResource(R.drawable.image1)
            1->imageview.setImageResource(R.drawable.image2)
            2->imageview.setImageResource(R.drawable.image3)
            3->imageview.setImageResource(R.drawable.image4)
            else->imageview.setImageResource(R.drawable.sparta)
        }


        val idstr=intent.getStringExtra("id")
        val id=findViewById<TextView>(R.id.idTextView)
        id.setText("아이디:"+idstr)

        val end=findViewById<Button>(R.id.endBtn)
        end.setOnClickListener {
            finish()
        }
    }
}

-Random클래스로 임의의 수 뽑기 가능=>랜덤한 이미지를 띄

-R.drawable.파일명 형태의 아이디로 이미지뷰 소스를 바꾸려면 setImageResource()사용

 

5. 실행 화면

SignInActivity
HomeActivity
SignUpActivity