アプリにスピナーを追加する

スピナーを使用すると、一連の値から 1 つの値をすばやく選択できます。デフォルトの状態では、スピナーに現在選択されている値が表示されます。スピナーをタップするとメニューが表示され、ユーザーが選択できる他のすべての値を確認できます。

図 1. 使用可能な値を示すスピナーのメニュー。

Spinner オブジェクトでスピナーをレイアウトに追加できます。これは通常、XML レイアウトで <Spinner> 要素を使用して行います。次の例はこの処理を示しています。

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

スピナーに選択肢のリストを入力するには、Activity または Fragment のソースコードで SpinnerAdapter を指定します。

マテリアル デザイン コンポーネントを使用している場合、表示されるプルダウン メニューSpinner に相当します。

スピナーにユーザーの選択を入力する

スピナーに指定する選択肢は、任意のソースから取得できますが、SpinnerAdapter を通じて指定する必要があります。たとえば、選択肢が配列で利用可能な場合は ArrayAdapter、選択肢がデータベース クエリから取得される場合は CursorAdapter を使用する必要があります。

たとえば、スピナーで使用可能な選択肢が事前に定義されている場合は、文字列リソース ファイルで定義された文字列配列を指定できます。

<?xml version="1.0" encoding="utf-8"?>
<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>

このような配列で、Activity または Fragment で次のコードを使用すると、ArrayAdapter のインスタンスを使用してスピナーに配列を指定できます。

Kotlin

val spinner: Spinner = findViewById(R.id.planets_spinner)
// Create an ArrayAdapter using the string array and a default spinner layout.
ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
).also { adapter ->
    // Specify the layout to use when the list of choices appears.
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    // Apply the adapter to the spinner.
    spinner.adapter = adapter
}

Java

Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
// Create an ArrayAdapter using the string array and a default spinner layout.
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
);
// Specify the layout to use when the list of choices appears.
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner.
spinner.setAdapter(adapter);

createFromResource() メソッドを使用すると、文字列配列から ArrayAdapter を作成できます。このメソッドの 3 番目の引数は、選択された選択肢がスピナー コントロールでどのように表示されるかを定義するレイアウト リソースです。プラットフォームには、simple_spinner_item レイアウトが用意されています。スピナーの外観について独自のレイアウトを定義する場合を除き、これはデフォルトのレイアウトです。

setDropDownViewResource(int) を呼び出して、アダプターがスピナーの選択リストを表示するために使用するレイアウトを指定します。simple_spinner_dropdown_item は、プラットフォームで定義されている別の標準レイアウトです。

setAdapter() を呼び出して、アダプターを Spinner に適用します。

ユーザーの選択に対応する

ユーザーがスピナーのメニューからアイテムを選択すると、Spinner オブジェクトは on-item-selected イベントを受け取ります。

スピナーの選択イベント ハンドラを定義するには、AdapterView.OnItemSelectedListener インターフェースと、対応する onItemSelected() コールバック メソッドを実装します。たとえば、Activity にインターフェースを実装する場合は次のようになります。

Kotlin

class SpinnerActivity : Activity(), AdapterView.OnItemSelectedListener {
    ...
    override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
        // An item is selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos).
    }

    override fun onNothingSelected(parent: AdapterView<*>) {
        // Another interface callback.
    }
}

Java

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...
    public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
        // An item is selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos).
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback.
    }
}

AdapterView.OnItemSelectedListener インターフェースには、onItemSelected() コールバック メソッドと onNothingSelected() コールバック メソッドが必要です。

setOnItemSelectedListener() を呼び出して、インターフェースの実装を指定します。

Kotlin

val spinner: Spinner = findViewById(R.id.planets_spinner)
spinner.onItemSelectedListener = this

Java

Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
spinner.setOnItemSelectedListener(this);

上記の例のように、AdapterView.OnItemSelectedListener インターフェースを Activity または Fragment で実装する場合は、インターフェース インスタンスとして this を渡すことができます。