본문 바로가기

문돌이 존버/앱 개발 스터디

코틀린(kotlin) - 여러 버튼에 동일한 동작 구현하기

반응형
본 글은 스파르타 코딩 클럽의 "안드로이드 앱개발 기초반" 강의를 듣고 작성한 개발일지입니다.

지난 시간엔 성격 타입 중 ISTJ에 대해서만 새로운 액티비티(Acitivity)를 만들어 데이터를 전달하고 받았습니다. 이번엔 다른 성격 타입에 대해서도 동일한 과정을 적용해보겠습니다.

먼저 New > Activity > Empty Activity 를 통해 새로운 액티비티를 생성합니다. 이후 새롭게 만들어진 activity_isfj.xml 파일에 아래 코드를 추가합니다.

// activity_isfj.xml
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="용감한 수호자"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

이후 MainActivity.kt 에서 버튼 동작을 구현해보겠습니다.

fun clickIsfj(view: View) {
	  Toast.makeText(view.context, "진정한 데이터 분석가", Toast.LENGTH_LONG).show()  
  }

위에서 추가한 clickIsfj 함수를 ISFJ 버튼에 연결할 차례입니다.

<Button
    android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:layout_margin="4dp"
    android:onClick="clickIsfj" // 추가
    android:text="ISFJ" />

ISFJ 버튼을 클릭하면 데이터와 함께 새롭게 생성한 IsfjActivity 를 실행해보겠습니다.

//MainActivity.kt
fun clickIsfj(view: View) {
  //Toast.makeText(view.context, "진정한 데이터 분석가", Toast.LENGTH_LONG).show()
  var intent = Intent(this, IsfjActivity::class.java)
  intent.putExtra("PersonalKey", "ISFJ")
  startActivity(intent)
}

액티비티에 전달받은 데이터를 토스트로 보여주기 위해 putExtra 로 보낸 데이터를 받아보겠습니다. 

//IsfjActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_isfj)

  var personalKey = intent.getStringExtra("PersonalKey") // 추가
  Toast.makeText(this, personalKey, Toast.LENGTH_LONG).show() // 추가
}

마지막으로 토스트 메시지를 IsfjActivity 에서 TextView 로 바꿔보겠습니다.

//IsfjActivity.kt
class IsfjActivity : AppCompatActivity() {
  private lateinit var textView: TextView // 추가

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_isfj)

    var personalKey = intent.getStringExtra("PersonalKey")
    //Toast.makeText(this, personalKey, Toast.LENGTH_LONG).show()
    textView = findViewById(R.id.textView) // 추가
    textView.text = personalKey // 추가
  }
}

모든 성격의 유형에 대해 위와 같은 과정을 하나하나 반복하면 너무 귀찮겠죠. 반복되는 작업은 어느 언어나 프레임워크든 코드로 구현할 수 있다는 생각이 듭니다. 이를 위해선 공통적인 패턴을 찾아보겠습니다.

fun clickIstj(view: View) {
    // Toast.makeText(view.context, "진정한 데이터 사이언티스트", Toast.LENGTH_LONG).show()
    var intent = Intent(this, lstjActivity::class.java)
    intent.putExtra("PersonalKey", "ISTJ")
    startActivity(intent)
}

fun clickIsfj(view: View) {
    // Toast.makeText(view.context, "진정한 데이터 전문가", Toast.LENGTH_LONG).show()
    var intent = Intent(this, IsfjActivity::class.java)
    intent.putExtra("PersonalKey", "ISFJ")
    startActivity(intent)
}
intent.putExtra("PersonalKey", "성격유형")

위에서 빨간색으로 표시한 부분 이외에는 모두 공통 부분입니다. 빨간색만 어떻게 바꿀지 생각해봅시다. 어차피 성격 유형 버튼을 눌러서 해당 성격을 TextView 로 나타내게 할 것이므로 버튼 정보를 그대로 가져와보면 어떨까요?

위 함수에서 (view: View)onClick 을 발생시킨 view의 정보를 담고 있습니다. xml 파일을 보면 버튼(Button)에 android:onClick="clickIstj"  로 연결되어 있으니 해당 버튼의 정보를 담고 있을 것입니다.

fun clickIstj(view: View) {
    var button = view as Button // 추가
    var intent = Intent(this, lstjActivity::class.java)
    intent.putExtra("PersonalKey", button.text) // 변경
    startActivity(intent)
}
as 는 타입을 변경해서 사용하겠다는 코틀린 문법으로, "타입 캐스팅" 이라고 부릅니다.
Button이 View의 하위 개념이라 타입 캐스팅이 가능한 것입니다.

이제 xml 파일에서 모든 버튼에 android:onClick="clickIstj" 를 추가해주면 됩니다. 이 역시 단순 반복을 대체할 방법이 있지만 관련해서는 나중에 고민하고 현재는 하나하나 넣어주도록 하죠.

이렇게 하면 모든 버튼을 눌러도 그 버튼의 내용대로 텍스트가 나타나게 됩니다.

코틀린에는 위에서 미리 선언한 함수 이름이나 파일 이름을 손쉽게 바꾸는 방법이 있습니다. 약 16개 버튼이 있는데 이를 하나하나 수정하는 것은 시간 낭비겠죠. 

위의 함수 clickIstjclickTypeButton 이란 이름으로 바꾸고 싶다면 커서를 clickIstj 위에 놓고 오른쪽 마우스 클릭을 합니다. Refactor -> Rename 후 원하는 이름으로 바꾸면 해당 함수가 위치한 곳에서 모두 일괄 변경됩니다. 파일 역시 마찬가지로 파일 오른쪽 클릭 후 동일한 과정을 거치면 됩니다.

728x90
반응형