Spinnerでenumを使おう

AndroidでSpinnerを使ってみたので、方法をまとめたいと思います。

####①xmlファイルを使う
これが一番楽な方法だと思います。
Strings.xmlもしくは自作のxmlファイルに定義します。

```kotlin:Strings.xml 
<resources>  
    <string-array name="color">  
        <item>赤</item>  
        <item>青</item>  
        <item>黒</item>   
    </string-array>  
</resources>
```

そして、Spinnerを呼び出す箇所で下記実装を行います。

```kotlin:MainActivity 
var selectedOption = resources.getStringArray(R.Strings.color)

val adapter = ArrayAdapter(applicationContext,
                android.R.layout.simple_spinner_item, selectedOption)

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

        spinner.adapter = adapter

        // リスナーを登録
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            // アイテムが選択された時
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                // spinnerを取得
                val spinnerParent = parent as Spinner
                item = spinnerParent.selectedItem as String
            }

            // アイテムが選択されなかった
            override fun onNothingSelected(parent: AdapterView<*>?) {
            }
        }
    }
```

spinnerのonItemSelectedListenerでは選択した処理と選択されない場合の処理が必要になります。

これで、プルダウンを押下したときに選択肢が出るようになります。
ただ、仮に登録した内容をDBに保存したくても、色の名前ではなくコードで登録したい場合はこの方法より、enumを使ったほうが便利かもしれません。

####②enumを使う

enumを使えば、色の名前、コードを保持できるため、便利です。

```kotlin:Color 
enum class Color(val code: Int, val colorName: String) {
    RED(0,"赤"),
    BLUE(1,"青"),
    BLACK(2,"黒")
}
```

こうすることで、
`Color.RED.code`で0が取得でき、`Color.RED.colorName`で赤が取得できます。

そして、①で記載した、spinnerの設定を書き換えます。

```kotlin:MainActivity 

        var selectedOption = arrayListOf<String>()

        for (color in Color.values()) {
            selectedOption.add(color.colorName)
        }

        val adapter = ArrayAdapter(applicationContext,
                android.R.layout.simple_spinner_item, selectedOption)

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

        spinner.adapter = adapter

        // リスナーを登録
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            // アイテムが選択された時
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                // spinnerを取得
                val spinnerParent = parent as Spinner
                item = spinnerParent.selectedItem as String
            }

            // アイテムが選択されなかった
            override fun onNothingSelected(parent: AdapterView<*>?) {
            }
        }
```

`Color.values()`ではenumのRED、BLUE、BLACKが取得できます。
なので、color.colorNameで色の名前を取得します。

```
for (color in Color.values()) {
    selectedOption.add(color.colorName)
}
```

上記の部分はラムダ式を使うとよりすっきりかけます。

```
Color.values().map { selectedOption.add(it.colorName) }
```

####※編集####

ご指摘を受けたのですが、こちらのほうがよりどんな処理が行われているのか分かりやすいです。

```
val selectedOption = Color.values().map { it.colorName }
```

こうすると①と同じように名前が選択肢に表示されるだけでなく登録時や検索時にはコード値を使うことも可能です。

#####参照
[プルダウンで項目選択できるSpinnerを設定](https://akira-watson.com/android/kotlin/spinner-simple.html)

[kotlin enum reference](https://kotlinlang.org/docs/reference/enum-classes.html)