사실 과제할 때 쓴 리드미를 긁어와서 여기다 쓰는 거긴 한데,
리드미 한 번 쓰고 풀리퀘하면 코드리뷰 받고 수정하면서 그 이후로 더 배우니까 추가적으로 글을 써보려고 한다.
1차 과제를 한지 한달 정도가 지났는데
예상대로 틀린 부분도 많았고 더 알게 된 부분도 많았음
한마디로 2차 리드미? 리드미 회고록?이라고 할 수 있겠다
1.1.1. SignInActivity
@file:Suppress("UnusedImport")
package com.example.a220402
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.example.a220402.databinding.ActivitySignInBinding
import kotlinx.android.synthetic.main.activity_sign_in.*
class SignInActivity : AppCompatActivity() {
private lateinit var binding: ActivitySignInBinding
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
//registerForActivityResult : Activityresult에 대한 콜백 생성, Lancher 생성
{
if (it.resultCode == Activity.RESULT_OK) { //result_ok인 경우 수행
val id = it.data?.getStringExtra("id") ?: "" //?. 연산은 엘비스 연산자임. 왼쪽 피연산자 값이 null이 아니면 id 출력
val pw = it.data?.getStringExtra("pw") ?: ""
binding.etId.setText(id)
binding.etPw.setText(pw)
}
}
super.onCreate(savedInstanceState)
binding = ActivitySignInBinding.inflate(layoutInflater) //inflate는 xml의 뷰를 객체화해준다고 생각하자
setContentView(binding.root)
val intent = Intent(this, HomeActivity::class.java)
binding.btn.setOnClickListener() {
if (binding.etId.text.isNullOrBlank() || binding.etPw.text.isNullOrBlank()) {
Toast.makeText(this, "아이디/비밀번호를 확인해주세요", Toast.LENGTH_SHORT).show()
//isNullOrBlank 함수 사용, id와 pw 둘 중 하나만 비어있어도 Toast 출력
} else {
Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show()
startActivity(intent)
//로그인 성공 시 홈 화면으로 이동
}
}
binding.btnSignup.setOnClickListener() {
val intent = Intent(this, SignUpActivity::class.java)
resultLauncher.launch(intent)
//signup 버튼을 누르면 SignUpActivity로 이동, intent 객체를 lancher에 실어 이동.
}
}
}
package com.example.a220402
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.a220402.databinding.ActivitySignUpBinding
import kotlinx.android.synthetic.main.activity_sign_in.*
class SignUpActivity : AppCompatActivity() {
private lateinit var binding: ActivitySignUpBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySignUpBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btnFinshSignup.setOnClickListener {
if (binding.etName.text.isNullOrBlank() || binding.etId.text.isNullOrBlank() || binding.etPw.text.isNullOrBlank()) {
Toast.makeText(this, "입력되지 않은 정보가 있습니다", Toast.LENGTH_SHORT).show()
} else {
val intent = Intent(this@SignUpActivity, SignInActivity::class.java) //signinactivity에 대한 intent 객체 생성
intent.putExtra("id", et_id.text.toString()) //id에 et_id 데이터 담음
intent.putExtra("pw", et_pw.text.toString()) //마찬가지로 pw에 et_pw 담음
setResult(Activity.RESULT_OK, intent) //result_ok인 경우 SignInActivitiy로 intent 객체 보냄
finish()
}
}
}
}
<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:src="@drawable/uxri"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.5" />
<TextView
android:id="@+id/myprofile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/profile"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/image" />
...
string.xml
에 문자열 저장해뒀다! 왜냐면 한글 섞이면 별로니까~2.1.1. SignUpActivity
binding.btnFinshSignup.setOnClickListener{
if(binding.etName.text.isNullOrBlank() ||binding.etId.text.isNullOrBlank() ||binding.etPw.text.isNullOrBlank()) {
Toast.makeText(this,"입력되지 않은 정보가 있습니다", Toast.LENGTH_SHORT).show()
}else{
valintent = Intent(this@SignUpActivity, SignInActivity::class.java)
//signinactivity에 대한 intent객체 생성
intent.putExtra("id", et_id.text.toString())//id에 et_id데이터 담음
intent.putExtra("pw", et_pw.text.toString())//마찬가지로 pw에 et_pw담음
setResult(Activity.RESULT_OK, intent)
//result_ok인 경우 SignInActivitiy로 intent객체 보냄
finish()
}
}
isNullOrBlank
에서 내용 입력 되었는지 확인putExtra
에서 intent 객체로 받아온 내용 각 변수에 담음2.1.2. SignInActivity
override fun onCreate(savedInstanceState: Bundle?) {
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
{
if (it.resultCode == Activity.RESULT_OK) {
val id = it.data?.getStringExtra("id") ?: ""
val pw = it.data?.getStringExtra("pw") ?: ""
binding.etId.setText(id)
binding.etPw.setText(pw)
}
}
super.onCreate(savedInstanceState)
binding = ActivitySignInBinding.inflate(layoutInflater)
setContentView(binding.root)
val intent = Intent(this, HomeActivity::class.java)
//중략...
binding.btnSignup.setOnClickListener() {
val intent = Intent(this, SignUpActivity::class.java)
resultLauncher.launch(intent)
}
}
registerForActivityResult
: ActivityResult
에 대한 콜백 생성, Lancher 생성?.
연산은 엘비스 연산자inflate
xml의 뷰를 객체화해줌. 즉 xml 코드를 Java 코드로 변환해주는 코드val intent = Intent(this, SignUpActivity::class.java) resultLauncher.launch(intent)
2.2.1.activity_home
<ScrollView
android:id="@+id/sv_profile"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraint_Layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:src="@drawable/uxri"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.5" />
//tv 생략
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
...
Scrollview
밑에는 하나의 직계 자식만 가질 수 있다. 이처럼 ScrollView 밑에androidx.constraintlayout.widget.ConstraintLayout
하나 넣고, 그 밑에 TextView
와 ImageView
등을 넣어주면 된다.LinearLayout
썼었는데 이게 더 좋다고 합디다~app:layout_constraintDimensionRatio="1:1"
로 1:1 실행LOGIN | JOIN |
---|---|