Как добавить спиннеры в приложение

Спиннеры позволяют быстро выбрать одно значение из набора. В состоянии по умолчанию спиннер показывает текущее выбранное значение. При нажатии на него открывается меню со всеми доступными значениями.

Рисунок 1. Меню со списком доступных значений.

Вы можете добавить спиннер в макет с помощью объекта Spinner. Обычно это делается в макете XML с помощью элемента <Spinner>. Это показано в следующем примере:

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

Чтобы заполнить список, укажите SpinnerAdapter в исходном коде Activity или Fragment.

Если вы используете компоненты Material Design, то раскрывающиеся меню эквивалентны 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 из массива строк. Третий аргумент этого метода – ресурс разметки, который определяет, как выбранный вариант будет отображаться в элементе управления Spinner. Платформа предоставляет макет 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 в качестве экземпляра интерфейса.