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