Добавьте спиннеры в свое приложение

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

Рисунок 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 :

Котлин

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
}

Ява

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 из массива строк. Третий аргумент этого метода — это ресурс макета, который определяет, как выбранный вариант отображается в элементе управления счетчиком. Платформа предоставляет макет simple_spinner_item . Это макет по умолчанию, если вы не хотите определить свой собственный макет для внешнего вида счетчика.

Вызовите setDropDownViewResource(int) чтобы указать макет, который адаптер использует для отображения списка вариантов счетчика. simple_spinner_dropdown_item — еще один стандартный макет, определенный платформой.

Вызовите setAdapter() , чтобы применить адаптер к вашему Spinner .

Реагировать на выбор пользователя

Когда пользователь выбирает элемент в меню счетчика, объект Spinner получает событие выбора элемента.

Чтобы определить обработчик события выбора для счетчика, реализуйте интерфейс AdapterView.OnItemSelectedListener и соответствующий метод обратного вызова onItemSelected() . Например, вот реализация интерфейса в Activity :

Котлин

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.
    }
}

Ява

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() :

Котлин

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

Ява

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

Если вы реализуете интерфейс AdapterView.OnItemSelectedListener с помощью Activity или Fragment , как в предыдущем примере, вы можете передать this как экземпляр интерфейса.