- Spinner
- Общая информация
- Используем адаптер
- В закрытом состоянии
- В раскрытом состоянии
- За честные выборы! — что выбрал пользователь
- Предупредить компонент об изменении пунктов
- Найти позицию по слову
- Тонкая настройка — своя разметка для Spinner
- spinner.xml
- spinner_dropdown_item.xml
- Программная настройка цвета и размера текста для первой строчки
- Не выбирать элемент при запуске
- CustomAdapter.java
- Режим android:spinnerMode=»dialog»
- ПРОГРАММИРОВАНИЕ НА ANDOIRD STUDIO (ВЫПАДАЮЩИЙ СПИСОК SPINNER)
- ПРОГРАММИРОВАНИЕ НА ANDROID STUDIO — CUSTOM SPINNER (НАСТРАИВАЕМЫЙ ВЫПАДАЮЩИЙ СПИСОК) Ч. 2.2
- Android. Выпадающий список (Spinner) с индикатором загрузки
- Собственно цель
- XML-layout
- Класс CustomSpinner
- Управление состоянием
- «Костыли»
- CustomSpinner на форме
Spinner
Общая информация
Компонент Spinner из раздела Containers (раньше был в разделе Widgets) похож на выпадающий список (ComboBox), используемый в OC Windows (не путать с игрушкой Fidget Spinner). В закрытом состоянии компонент показывает одну строчку, при раскрытии выводит список в виде диалогового окна с переключателями.
Сначала покажу быстрый способ использования элемента. При добавлении элемента на экран отображается просто полоска со строкой Item1. В основном настройка происходит программным путём. Но можно и через XML. Добавим в строковый файл ресурсов strings.xml несколько элементов массива:
Теперь осталось в атрибуте android:entries указать на созданный массив и компонент Spinner будет заполнен данными. Запустите проект и проверьте.
Цвет компонента можно задать в атрибуте android:background=»@color/colorAccent».
Внешний вид компонента в разных версиях Android менялся.
Если нужно из программы узнать, какой пункт из выпадающего списка выбран в Spinner, то можно использовать такой код, например, при нажатии кнопки:
Если нужен не текст, а номер позиции, то вызывайте метод getSelectedItemPosition()
Если вам нужно получить выбранный элемент сразу в момент выбора, то используйте метод setOnItemSelectedListener(), который описан ниже.
Используем адаптер
Как и в случае с компонентом ListView, Spinner использует адаптер данных для связывания содержимого из набора данных с каждым пунктом в списке. Для загрузки данных нужно:
- Получить экземпляр компонента Spinner
- Настроить адаптер данных для связывания
- Вызвать метод setAdapter()
В закрытом состоянии
В раскрытом состоянии
Данные в закрытом и раскрытом состоянии Spinner отображает по разному. Поэтому необходимо создавать макеты шаблонов для обоих состояний. Android предоставляет несколько своих собственных ресурсов для Spinner для простых задач. Например, есть ресурс android.R.layout.simple_spinner_item для создания представления для каждого элемента списка. Ресурс android.R.layout.simple_spinner_dropdown_item служит шаблоном для раскрывающего списка.
Создадим строковый массив в файле strings.xml:
Загрузим строковый массив с именем animals в экземпляр класса ArrayAdapter при помощи метода createFromResource():
Запустив программу, вы увидите работающий пример, как на картинках, представленных выше.
По умолчанию выводится первый элемент списка. С помощью метода setSelection() можно установить нужный элемент по умолчанию, указав индекс из строкового ресурса.
За честные выборы! — что выбрал пользователь
Нам интересно узнать, что именно выбрал пользователь из списка и обработать эту информацию.
Нам нужно получить выбранный пользователем пункт в компоненте Spinner при помощи метода setOnItemSelectedListener() и реализовать метод onItemSelected() класса AdapterView.OnItemSelectedListener:
Теперь при выборе любого пункта вы получите всплывающее сообщение о выбранном пункте. Обратите внимание, что нам также пришлось реализовать вызов обратного вызова onNothingSelected().
В начале статьи показывался более простой способ с использованием метода getSelectedItem(), который достаточен для большинства случаев.
Предупредить компонент об изменении пунктов
Если в приложении вы изменили состав выпадающего списка, то необходимо сообщить компоненту Spinner, чтобы он показывал обновлённый список. Сделать это можно при помощи метода адаптера notifyDataSetChanged().
Найти позицию по слову
Если мы хотим узнать, в какой позиции находится то или иное слово, то нужно получить адаптер через метод getAdapter(), а затем уже и позицию.
Тонкая настройка — своя разметка для Spinner
Вы можете установить собственный фон, но не можете установить, к примеру, цвет и размер текста в настройках свойств. В предыдущих примерах мы видели, что при подключении к адаптеру используются системные разметки android.R.layout.simple_spinner_item и android.R.layout.simple_spinner_dropdown_item. Ничто не мешает вам посмотреть исходники данных файлов и создать файлы для собственной разметки, которые потом можно подключить к адаптеру.
Давайте создадим собственную разметку с значками. В папке res/layout создаём файл row.xml:
Осталось в коде заменить две строки на одну:
В примере использовался один общий файл, но можете создать два отдельных шаблона для закрытого и раскрытого вида элемента. Например, так (простейший вариант):
spinner.xml
spinner_dropdown_item.xml
В принципе, вы можете установить свой значок для каждого пункта, вам нужно создать свой адаптер под свои нужды. Создадим новый класс на основе ArrayAdapter и реализуем задачу. Теперь у двух любимых дней недели будет выводиться лапочка.
Программная настройка цвета и размера текста для первой строчки
В сети нашёл пример программной установки цвета и размера текста для первой строчки элемента в закрытом состоянии. Может кому пригодится.
Не выбирать элемент при запуске
Иногда хочется, что при запуске не выбирался первый элемент списка, как это происходит по умолчанию. Решение в лоб — добавить первым элементом пустую строку или текст «Выберите. » не слишком красив, так как при раскрытии списка мы увидим эти элементы, которые только портят картину. В сети нашёл вариант, использующий собственный адаптер.
CustomAdapter.java
Попробуйте этот вариант, может он подойдёт вам.
Режим android:spinnerMode=»dialog»
У компонента есть атрибут android:spinnerMode, у которого можно установить значение dialog. В этом случае при раскрытии списка задняя активность затемняется. Это хорошо заметно на белом фоне. Проверьте самостоятельно.
В этом режиме диалога для компонента Spinner можно вывести заголовок с помощью методов setPrompt() или setPromptId(). Заголовок выводится при раскрытии списка.
Источник
ПРОГРАММИРОВАНИЕ НА ANDOIRD STUDIO (ВЫПАДАЮЩИЙ СПИСОК SPINNER)
В этом уроке мы разберём создание выпадающего списка (Spinner) в Android Studio.
Spinner — это выпадающий список, позволяющий разработчику мобильного приложения предоставить пользователю возможность выбора тех или иных действий, которые будет выполнять приложение.
Создадим новое приложение в Android Studio, выбрав Start a new Android Studio project. Назовём проект SpinnerLesson (поле Application name). Домен компании назовём lessons.ru (поле Company domain). Выберем каталог расположения нашего проекта в поле Project location. И нажмём кнопку Next
В следующем окне можно выбрать настройки в соответствии и изображением и нажать Next. Выберем Empty Activity (пустой активити) и нажмём Next. Имя главного Activity, можно оставить так, как есть, то есть MainActivity и нажать Finish. После создания проекта в открывшемся окне есть один Activity, это MainActivity. Теперь перейдём к представлению главного Activity, то есть к activity_main.xml. Activity_main.xml представляет собой xml файл и хранится в папке ресурсов res в подпапке layout.
Заменим всё содержимое activity_main.xml на следующее:
Где Spinner и есть тот самый выпадающий список.
Теперь перейдём к MainActivity и отредактируем его таким образом, чтобы его содержимое соответствовало следующему коду:
Где строковый массив private String[] autoBrands = – это пункты выпадающего списка. Функция onItemSelectedListener() – это обработчик события, который срабатывает при выборе элемента списка. Toast.makeText(getBaseContext(), parent.getSelectedItem().toString(), Toast.LENGTH_SHORT).show() выводит содержимое выбранного элемента списка на экран. Первый параметр этой функции — это контекст, второй параметр — само сообщение, третий параметр — временной интервал, в течении которого сообщение будет находиться на экране.
Источник
ПРОГРАММИРОВАНИЕ НА ANDROID STUDIO — CUSTOM SPINNER (НАСТРАИВАЕМЫЙ ВЫПАДАЮЩИЙ СПИСОК) Ч. 2.2
В нашем сегодняшнем уроке мы продолжим рассматривать возможности настраиваемого выпадающего списка (Custom Spinner) в Android Studio.
Давайте предположим, что нам необходимо сделать выпадающий список таким образом, чтобы в случаи, когда список развёрнут, то каждый пункт списка отображал бы полную информацию, а в случаи, когда какой-то пункт выбран, то отображалась бы краткая информация. Создайте новое приложение в Android Studio с пустым активити (Empty Activity), и начнём делать наш список. Список будет содержать автомобильные бренды, логотипы этих брендов и информацию о сайте производителя. Пусть в развёрнутом виде нам нужно отображать логотип, наименование бренда и ссылку на сайт, а когда пункт выбран, только логотип и наименование бренда. Создадим шаблон пункта выпадающего списка. Для этого перейдите к каталогу layout ресурсов проекта:
Нажмите на этом каталоге правой кнопкой мыши и в появившемся меню выберите New -> Layout resource file: Назовите его spinner_item: Отредактируйте содержимое spinner_item.xml в соответствии со следующим текстом:
В той же папке layout, где был создан spinner_item.xml аналогичным образом создайте шаблон для выбранного пункта списка и назовите его selected_item.xml. Отредактируйте содержимое selected_item.xml в соответствии со следующим текстом:
Теперь перейдите к файлу activity_main.xml, который расположен в том же каталоге layout и добавьте туда элемент Spinner. Должно получиться следующее:
После всего этого нам нужно создать класс, который будет содержать в себе информацию о каждом отдельно взятом бренде, т.е. наименование бренда, информацию о сайте и логотип. Для этого перейдём к каталогу, в котором у нас расположен MainActivity и создадим в нём подкаталог, к котором разместим наш класс: Нажмём на нём правой кнопкой мыши. В появившемся меню выберем New -> Package : Назовите новый каталог AdditionalClasses : Нажмите на вновь созданный каталог AdditionalClasses правой кнопкой мыши и выберите New -> Java Class : Назовите новый класс AutoBrandClass :
Отредактируйте его код в соответствии со следующим текстом:
В том же каталоге, где был создан каталог AdditionalClasses создайте ещё один каталог и назовите его Adapters . Должно получиться так: Теперь создадим адаптер для выпадающего списка. Нажмите на каталоге Adapters правой кнопкой мыши и выберите New -> Java Class (Все действия аналогичны тем, которые мы делали при создании класса AutoBrandClass ). Назовите этот класс AutoBrandsSpinnerAdapter . Отредактируйте его код в соответствии со следующим текстом: Теперь нам понадобятся три графических png файла, который будут содержать логотипы брендов — toyota.png, nissan.png и bmw.png. Их нужно просто скопировать в каталог drawable проекта:
Взять архив с логотипами можно здесь: LogoImg
Теперь перейдите к MainActivity и отредактируйте его в соответствии со следующим кодом:
Источник
Android. Выпадающий список (Spinner) с индикатором загрузки
Приветствую тебя, читатель!
Представляю твоему вниманию небольшой очерк о том, как захотелось мне видеть прогресс-бар («infinite circle») во время загрузки данных в выпадающий список, который в Андроиде называется Spinner.
Необходимость такая возникла при разработке небольшой утилиты по работе с веб-сервисом. Параметры некоего расчёта хранятся на централизованном сервере. Веб-сервис .NET отдаёт списки возможных параметров в виде массивов разной длины (от 2 до 50 элементов). Для отображения этих параметров и был выбран выпадающий список. Инициализация списков, как и положено, происходит асинхронно. И в то время, пока данные загружаются, смотреть на пустые статичные элементы безо всякого прогресса скучно, уныло и вообще.
Собственно цель
Стандартный Spinner выглядит так:
После небольшой доработки получается нечто такое (CustomSpinner):
«В чём же соль!?» — спросите вы? А соль в промежуточном состоянии (загрузка данных):
Для получения такого эффекта я вижу 2 пути:
1 Унаследоваться от Spinner; переопределить onDraw() и, возможно, какие-то другие методы; реализовать обработку состояний (загружается/загружен)
2 Унаследоваться от Layout; расположить на нём Spinner и ProgressBar; организовать работу контрола в соответствии со своими требованиями.
Первый путь, наверное, более правильный. Но каждый раз ступая на него я упирался в Exception’ы и вылеты приложения. Хотя с Android знаком достаточно давно, честно признаюсь — до сих пор не могу понять что именно нужно делаеть в методе onDraw(). Коврыться в исходниках очень не хочется, хотя иногда полезно. В-общем этот путь закончился, так тольком и не начавшись.
Второй путь подробнее описан в сети. По нему я прошёл быстро и непринуждённо. И был он таков…
XML-layout
Для начала нам нужно «набросать» наш новый контрол (custom_spinner.xml). В этом нет ничего сложного — корневой лэйаут и два дочерных элемента (спиннер и прогресс-бар). Для этого хорошо подойдёт RelativeLayout. У меня он получился вот таким:
Класс CustomSpinner
Для работы с контролом нужно реализовать класс CustomSpinner. Создаём класс, унаследованный от RelativeLayout:
Управление состоянием
Для достижения первоначальной цели (показ прогресс-бара при загрузке данных) модифицируем класс CustomSpinner:
В случае когда контрол находится в процессе загрузки нужно скрыть возможные имеющиеся в нём значения списка — spinner.setAdapter(emptyAdapter); . И, собственно, показать прогресс-бар.
Теперь при асинхронной загрузке, для которой я иcпользую AsyncTask, мы можем управлять поведением контрола:
«Костыли»
Ну конечно, а куда ж без них!
Вспомним, что значально мы хотели именно Spinner. Поэтому поведение контрола должно быть соответствующим. При выбранной реализации нужно реализовать несколько затычек:
Методы getAdapter(), setAdapter(), getSelectedItemPosition() просто «пробрасывают» действия на внутренний Spinner.
Внимание следует уделить методу setOnItemSelectedListener(OnItemSelectedListener l) . Я использую один обработчик (listener) для всех контролов (думаю так правильней) в котором с помощью switch(*some_unique_value*). case(R.id.model) определяю, что делать далее. Так как у выпадающего списка внутри нашего контрола нет уникального глобального идентификатора (он для всех R.id.spinner), то в тэг выпадающего списка записываем идентификатор родительского контрола ( spinner.setTag(getId()); ). Теперь при вызове обработчика смены значения в выпадающем списке сможем идентифицировать, какой именно список изменился:
Оработчик выпадающего списка:
Если бы наш кастомный контрол был унаследован непосредственно от Spinner, то этих костылей могло бы и не быть. Но увы.
CustomSpinner на форме
Осталось вставить наш новый элемент в интерфейс (лэйаут) приложения:
Источник