[Android/Kotlin]When構文(Switch構文)

目次

概要

Switch構文というのはKotlinにはない。代わりに、When構文が存在する。
使い方にそこまで差はないものの、書き方が微妙に異なる。
基本的な書き方は以下の通り。
複数行に渡るような場合は括弧を書く必要がある。

when ([変数]) {
  [値1の処理] -> {
    // 値が1の時に行われる処理
  }
  [値2の処理] -> {
    // 値が2の時に行われる処理
  }
  [値3の処理] -> {
    // 値が3の時に行われる処理
  }
  else -> {
    // 上記のどれにも該当しない場合の処理
  }
}

ソースコード

MainFragment.kt
package com.seeking_star.test.ui.main

import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.RadioGroup
import android.widget.TextView
import com.seeking_star.test.R

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        var view = inflater.inflate(R.layout.fragment_main, container, false)
        var radioGroup = view.findViewById<RadioGroup>(R.id.magicTypeGroup)
        view.findViewById<Button>(R.id.decideButton).setOnClickListener {
            when (radioGroup.checkedRadioButtonId) {
                R.id.radioFire -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("メラ")
                    view.findViewById<TextView>(R.id.textlevel2).setText("メラミ")
                    view.findViewById<TextView>(R.id.textlevel3).setText("メラゾーマ")
                }
                R.id.radioIce -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("ヒャド")
                    view.findViewById<TextView>(R.id.textlevel2).setText("ヒャダルコ")
                    view.findViewById<TextView>(R.id.textlevel3).setText("マヒャド")
                }
                R.id.radioWind -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("バギ")
                    view.findViewById<TextView>(R.id.textlevel2).setText("バギマ")
                    view.findViewById<TextView>(R.id.textlevel3).setText("バギクロス")
                }
                R.id.radioElectric -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("デイン")
                    view.findViewById<TextView>(R.id.textlevel2).setText("ライデイン")
                    view.findViewById<TextView>(R.id.textlevel3).setText("ギガデイン")
                }
                R.id.radioBomb -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("イオ")
                    view.findViewById<TextView>(R.id.textlevel2).setText("イオラ")
                    view.findViewById<TextView>(R.id.textlevel3).setText("イオナズン")
                }
                R.id.radioDark -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("ドルマ")
                    view.findViewById<TextView>(R.id.textlevel2).setText("ドルクマ")
                    view.findViewById<TextView>(R.id.textlevel3).setText("ドルマドン")
                }
                else -> {
                    view.findViewById<TextView>(R.id.textlevel1).setText("失敗")
                    view.findViewById<TextView>(R.id.textlevel2).setText("失敗")
                    view.findViewById<TextView>(R.id.textlevel3).setText("失敗")
                }
            }

        }

        return view
    }
}
Kotlin

xmlファイル

fragment_main.xml
<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.main.MainFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="魔法の属性を選択してください"
            android:textSize="24dp" />

        <RadioGroup
            android:id="@+id/magicTypeGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <RadioButton
                android:id="@+id/radioFire"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="メラ" />

            <RadioButton
                android:id="@+id/radioIce"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="ヒャド" />

            <RadioButton
                android:id="@+id/radioWind"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="バギ" />

            <RadioButton
                android:id="@+id/radioElectric"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="デイン" />

            <RadioButton
                android:id="@+id/radioBomb"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="イオ" />

            <RadioButton
                android:id="@+id/radioDark"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="ドルマ" />

        </RadioGroup>

        <Button
            android:id="@+id/decideButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="決定" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textlevel1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="30dp"
                android:text="TextView" />

            <TextView
                android:id="@+id/textlevel2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="30dp"
                android:text="TextView" />

            <TextView
                android:id="@+id/textlevel3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="30dp"
                android:text="TextView" />
        </LinearLayout>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
XML

デモ動画

詳細

このWhen構文は数字(Int型など)の他、文字列(String型)も使用することができる。
また、elseは書かなくてもエラーにはならない。
また、参考ページにもあるように、whenの結果に代入値を記載することでそのまま代入をすることもできる。

参考ページ:
 ヒヨコ プログラミング(ヒヨプロ).