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. 실행 화면
'코틀린 개인 과제' 카테고리의 다른 글
회원가입 MVVM 과제 (0) | 2024.07.14 |
---|---|
챌린지반 3주차 첫번째 과제: 디자인 패턴 구현 (0) | 2024.07.09 |
로그인 앱 제작-2 (0) | 2024.06.25 |
키오스크 제작 (0) | 2024.06.13 |
수식입력이 가능한 계산기 만들기 (0) | 2024.06.04 |