〈kotlin〉スピナー

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

タップすると選択可能な値の入ったプルダウンメニューが表示され、
その中から1つの値を素早く選択することができる「スピナー」を実装する。

レイアウト

xmlファイルにSpinnerタグを追加する。

<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

デフォルトではプルダウンで選択肢が表示されるようになっているが、
android:spinnermode="dialog"を記述するとダイアログで選択肢が表示されるように設定できる。

選択肢の作成

選択肢とする値をStrings.xmlにstring-arrayとして定義する。
string-arrayタグの中のitemタグに値を1つずつ記述する。
(ここで作成した文字列配列は後ほどAdapterに渡す。)

<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

Adapterの設定

選択肢の配列とレイアウトを ArrayAdapterに設定する。

val adapter = ArrayAdapter(
        this,
        android.R.layout.simple_spinner_item,
        resources.getStringArray(R.array.planets_array)
)

第2引数のsimple_spinner_item レイアウトは選択肢がどのように表示されるか、
プラットフォームによって提供されている標準レイアウト。
独自のレイアウトを作成して渡すこともできる。
第3引数には上記で作成したリストを配列型にして渡す。
もしくは下記コードのようにcreateFromResource() メソッドを使用することで、
文字列配列から 直接ArrayAdapter を作成できる。

val adapter =  ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
)

次にsetDropDownViewResource(int) を呼び出して、
アダプターがスピナー選択リストに表示するために使用するレイアウトを指定する。
これも標準レイアウトが提供されている。
その後、spinnerのadapterに設定する。

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
binding.spinner.adapter = adapter

クリックイベントの追加

項目が選択された場合の処理を記述するには、
AdapterView.OnItemSelectedListener インターフェースと対応するコールバックメソッドを実装する。

spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
        override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
            //選択されたときの処理
        }

        override fun onNothingSelected(p0: AdapterView<*>?) {
            //選択されなかったときの処理
        }

参考
https://developer.android.com/guide/topics/ui/controls/spinner?hl=ja