0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spinnerでenumを使おう

Last updated at Posted at 2019-05-09

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

①xmlファイルを使う

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

Strings.xml
<resources>  
    <string-array name="color">  
        <item></item>  
        <item></item>  
        <item></item>   
    </string-array>  
</resources>

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

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を使えば、色の名前、コードを保持できるため、便利です。

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

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

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

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を設定

kotlin enum reference

0
1
3

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?