LoginSignup
0
0

More than 1 year has passed since last update.

[Android][Kotlin] Spinnerの使い方とEnumの活用方法

Last updated at Posted at 2023-01-04

できたこと

Spinnerの簡単な実装と、Enumをうまく活用してみました!
Enumを使うことで、複数の定数を扱うことができて、コードもスッキリして見やすくできると思います。

具体的説明

Spinnerで選択された「選手名」をEnumから検索し、その選手のポジションをTextViewに反映させるというもの。
W杯でサッカーが盛り上がったのでサッカーのEnumにしちゃいました!

レイアウト

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/green">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:layout_centerHorizontal="true"
        android:text="ポジション"
        android:textColor="@color/black"
        android:textSize="50sp"/>

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_below="@id/tv"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:textAlignment="center"
        android:background="@color/white"/>

</RelativeLayout>

ソースコード

MainActivityMainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tv : TextView = findViewById(R.id.tv)
        val spinner : Spinner = findViewById(R.id.spinner)
        val spinnerList : List<String> = listOf(
            "南野拓実", "鎌田大地","長友佑都","川島永嗣",
        )

        // ここはほぼテンプレのようなもの。
        // スピナーの中身(テキストサイズや背景など)を変更したい場合は、「R.layout.~~」を変更してください。
        val adapter = ArrayAdapter(applicationContext, android.R.layout.simple_spinner_item, spinnerList)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner.adapter = adapter

        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            // Spinnerに中身が入っている時(今回はデフォルトで入っている状態)
            override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
                // spinnerで選択した選手名を取得
                val spinnerSelect = parent.selectedItem.toString()
                // 上記を元にEnumに走り、Position取得
                val playPosition = SoccerPlayerEnum.getEnumByPlayerName(spinnerSelect).position
                // TextViewにPosition反映
                tv.text = playPosition
            }
            // Spinnerの中身が空文字の時
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // そのようなことはほぼほぼないので何も書かない
            }
        }
    }
}

Enumクラス

SoccerPlayerEnum.kt
enum class SoccerPlayerEnum(val playerName: String, val position: String) {
    // Enumでは大文字で書く
    // 最後の定数の後は「;」
    MINAMINO ("南野拓実", "FW"),
    KAMADA   ("鎌田大地", "MF"),
    BRAVO    ("長友佑都", "DF"),
    KAWASHIMA("川島永嗣", "GK");

    companion object {
        // ここで選手名を取得する
        fun getEnumByPlayerName(playerName: String): SoccerPlayerEnum =
            values().find {
                it.playerName == playerName
            } ?: throw NotFoundException("エラー文")

        // ここでポジションを取得する
        fun getEnumByPosition(position: String): SoccerPlayerEnum =
            values().find {
                it.position == position
            } ?: throw NotFoundException("エラー文")
    }
}

応用として

getEnumByPositionでpositionの定数も取得することができるので、
positionを使ってみたり、定数を増やしてみたりしてうまく応用活用して見てください!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0