Spinnerで選択されたアイテムのIDを取得するには

文字配列リソースからSpinnerのアイテムを作る方法については簡単にSpinnerのアイテムを作る方法で書きました。

文字配列から簡単にスピナーアイテムを作ることができるので便利な方法ですが、1つ問題があります。

それは選択されたアイテムIDを取得することです。

例えば次のような文字配列リソースがあるとします。

<string-array name="animal_list">
    <item>@string/mouse</item>
    <item>@string/cow</item>
    <item>@string/tiger</item>
    <item>@string/rabbit</item>
    <item>@string/dragon</item>
</string-array>

この文字配列リソースをレイアウト画面のスピナーのプロパティ画面を開いてEntriesプロパティに配列を追加します。

そしてコード中でSpinnerにリスナーを設定します。

Spinner animalSpinner = (Spinner) findViewById(R.id.animalSpinner);
animalSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> adapter, View v,
                    int position, long id) 
    {
        /// アイテムが選択されたときの処理
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapter) {}
});

これでもスピナーとしては機能しますが、onItemSelectedメソッドで選択されたアイテムのインデックス(position)を知ることはできますがアイテムのIDを調べることができません。

もちろんインデックスで処理してもいいのですが、文字配列リソースでアイテムを追加・挿入などしたときにいちいち書き直さなくてはならなくなります。

その問題を解決するために次のようにコードを書き換えます。

Spinner animalSpinner = (Spinner) findViewById(R.id.animalSpinner);
animalSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> adapter, View v,
                    int position, long id) 
    {
        TypedArray array = getResources().obtainTypedArray(
                R.array.animal_list);
        int itemId = array.getResourceId(position, R.string.mouse);
        switch(itemId){
        case R.string.mouse:
            /// 何か処理
            break;
        case R.string.cow:
            /// 何か処理
            break;
        /// ... 以下略
        }
        array.recycle();
            ///使わなくなったら解放
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapter) {}
});

この例ではTypedArrayを使ってインデックスからアイテムIDを取得しています。

インデックスではなくアイテムIDを取得できるので配列に変更があったとしてもコードを変更せずに済みます。

以上が文字配列から作ったSpinnerのアイテムIDを取得する方法です。では、また!

関連項目