SOPT - Android : #Seminar 1

Yuree Choi·2022년 5월 18일
0

SOPT : ANDROID

목록 보기
1/1
post-thumbnail

사실 과제할 때 쓴 리드미를 긁어와서 여기다 쓰는 거긴 한데,
리드미 한 번 쓰고 풀리퀘하면 코드리뷰 받고 수정하면서 그 이후로 더 배우니까 추가적으로 글을 써보려고 한다.
1차 과제를 한지 한달 정도가 지났는데
예상대로 틀린 부분도 많았고 더 알게 된 부분도 많았음
한마디로 2차 리드미? 리드미 회고록?이라고 할 수 있겠다


Seminar 1

필수과제 1-1

  • 로그인 페이지 만들기

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에 실어 이동.
        }
    }
}
  • if : 빈칸인 경우를 작성할 때, if문 내에서 "" 같은 내용을 쓸 수도 있지만, isNullOrBlank 같은 함수를 이용해보는 것도 좋은 방법인 듯!

필수과제 1-2

  • 회원가입 페이지 만들기
    1.2.1. SignUpActivity
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()
            }
        }
    }
}
  • CallBack : 다른 함수의 인자로써 이용되는 함수 / 이벤트에 의해 호출되는 함수
  • putextra : putextra를 통해 데이터 담아서 전달이 가능하다.
  • RESULT_OK : setResult(Activity.RESULT_OK, intent)에서 결과 ok면 intent 객체 보낸다.

필수과제 1-3

  • 자기소개 페이지 만들기
    1.3.1. activity_home.xml
<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

  • 회원가입 -> 로그인 시 작성한 내용 유지

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)
    = signup 버튼을 누르면 SignUpActivity로 이동, intent 객체를 lancher에 실어 이동.

성장과제 2-2

  • 스크롤뷰, 사진 1:1

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 하나 넣고, 그 밑에 TextViewImageView등을 넣어주면 된다.
    원래 LinearLayout 썼었는데 이게 더 좋다고 합디다~
  • app:layout_constraintDimensionRatio="1:1" 로 1:1 실행

실행 화면

LOGINJOIN
profile
마음만은 잔디밭

0개의 댓글