When(Switch-Case) 문을 이용한 액티비티 전환
한 액티비티에 10개의 버튼이있고 각 버튼을 클릭하면 서로 다른 액티비티로 전환되는 어플을 구현해야 한다. 이 경우 10개의 버튼 리스너를 만들고 버튼 리스너마다 각각 이동할 액티비티를 지정하는 방법으로 구현할 수 있다. 그러나 이렇게 구현할 경우 코드 중복도 생길 것이고 보기도 불편하다. 따라서 이럴 때는 분기문인 When(Switch-Case)을 이용하면 버튼 리스너를 하나만 구현할 수 있다.
코틀린에서는 switch-case가 when이다.
구현
시나리오
MainActivity에 button2와 button3버튼을 만든다.
button2를 선택 시 MainActivity2로 이동하고 button3을 선택 시 MainActivity3으로 이동한다.
activity_main.xml
activity_main의 주 내용은 버튼 두개(button2, button3)를 생성하는 것뿐이며 아래 아래 코드를 그대로 쓸 필요는 없다.
activity_main2와 activity_main3은 만들기만 하면 되며 수정내용은 없다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button2"
app:layout_constraintBottom_toTopOf="@id/button3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity
버튼들은 같은 리스너(ButtonListener)에 연결해줘서 하나의 리스너만 구현할 수 있도록 한다.
button2.setOnClickListener(ButtonListener())
button3.setOnClickListener(ButtonListener())
버튼 리스너는 inner class로 생성했다.
inner class ButtonListener: View.OnClickListener {
override fun onClick(v: View?) {
var intent = Intent()
when (v?.id) {
R.id.button2 -> {
Log.d("TestLog", "Button2")
intent = Intent(this@MainActivity, MainActivity2::class.java)
}
R.id.button3 -> {
Log.d("TestLog", "Button3")
intent = Intent(this@MainActivity, MainActivity3::class.java)
}
}
startActivity(intent)
}
}
Intent는 액티비티 전환에 사용하는 컴포넌트다.
// Intent(현재 액티비티, 전환할 액티비티)
intent = Intent(this@MainActivity, MainActivity2::class.java)
2021.06.07 - [언어, 라이브러리/Android] - [Android, Kotlin] 액티비티 데이터 전달(Intent)
전체코드
package com.hydroponicglass.myapplication // 수정필요
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("TestLog", "MainActivity")
button2.setOnClickListener(ButtonListener())
button3.setOnClickListener(ButtonListener())
}
inner class ButtonListener: View.OnClickListener {
override fun onClick(v: View?) {
var intent = Intent()
when (v?.id) {
R.id.button2 -> {
Log.d("TestLog", "Button2")
intent = Intent(this@MainActivity, MainActivity2::class.java)
}
R.id.button3 -> {
Log.d("TestLog", "Button3")
intent = Intent(this@MainActivity, MainActivity3::class.java)
}
}
startActivity(intent)
}
}
}
Log
각 액티비티 생성, 버튼 클릭 시 로그(Log.d)를 출력하도록 했다.
button2 클릭 시
D/TestLog: MainActivity
D/TestLog: Button2
D/TestLog: MainActivity2
button3 클릭 시
D/TestLog: MainActivity
D/TestLog: Button3
D/TestLog: MainActivity3
최근댓글