- Spinner
- Общая информация
- Используем адаптер
- В закрытом состоянии
- В раскрытом состоянии
- За честные выборы! — что выбрал пользователь
- Предупредить компонент об изменении пунктов
- Найти позицию по слову
- Тонкая настройка — своя разметка для Spinner
- spinner.xml
- spinner_dropdown_item.xml
- Программная настройка цвета и размера текста для первой строчки
- Не выбирать элемент при запуске
- CustomAdapter.java
- Режим android:spinnerMode=»dialog»
- Как сделать Android Spinner с начальным текстом «Select One»?
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(). Заголовок выводится при раскрытии списка.
Источник
Как сделать Android Spinner с начальным текстом «Select One»?
Я хочу использовать Spinner, который изначально (когда пользователь еще не сделал выбор) отображает текст «Select One». Когда пользователь щелкает счетчик, отображается список элементов, и пользователь выбирает один из вариантов. После того, как пользователь сделал выбор, выбранный элемент отображается в Spinner вместо «Select One».
У меня есть следующий код для создания Spinner:
С этим кодом изначально отображается пункт «Один». Я мог бы просто добавить новый элемент «Выбрать один» к элементам, но тогда «Выбрать один» также будет отображаться в раскрывающемся списке в качестве первого элемента, что не является тем, что я хочу.
Как я могу решить эту проблему?
Вот общее решение, которое отвергает Spinner мнение. Он переопределяет, setAdapter() чтобы установить начальную позицию на -1, и предоставляет прокси для предоставления SpinnerAdapter строки приглашения для позиции меньше 0.
Это было проверено на Android 1.5 через 4.2, но покупатель остерегается! Поскольку это решение опирается на отражение назвать частным AdapterView.setNextSelectedPositionInt() и AdapterView.setSelectedPositionInt() , это не гарантирует работу в будущих обновлениях ОС. Кажется вероятным, что так и будет, но это ни в коем случае не гарантировано.
Обычно я не одобряю что-то подобное, но этот вопрос задавался достаточно много раз, и кажется, что это достаточно разумная просьба, чтобы я решил опубликовать свое решение.
10 пикселей в моей Galaxy S, что недопустимо. Я пробовал несколько вещей (гравитация, отступы, поля и т. Д.), И ни одна из них не работала надежно на разных устройствах, поэтому я выберу другое решение.
Что вы можете сделать, это украсить свой SpinnerAdapter вариант изображением «Выбор варианта . », чтобы Spinner отображался без выбора.
Вот рабочий пример, протестированный для Android 2.3 и 4.0 (он ничего не использует в библиотеке совместимости, так что на какое-то время все будет в порядке) Поскольку это декоратор, он должен легко модифицировать существующий код, и он также отлично работает с CursorLoader s. (Поменять курсор на завернутый cursorAdapter конечно . )
Есть ошибка в Android, которая немного усложняет повторное использование представлений. (Таким образом, вы должны использовать setTag или что-то еще, чтобы убедиться, что вы convertView правы.) Spinner не поддерживает несколько типов представлений
Примечания к коду: 2 конструктора
Это позволяет вам использовать стандартную подсказку или определить свое собственное «ничего не выбрано» в качестве первой строки, или обе, или ни одной. (Примечание. В некоторых темах вместо диалогового окна отображается DropDown для Spinner. Обычно в раскрывающемся меню подсказка не отображается)
Вы определяете макет, чтобы он выглядел как приглашение, например, серым цветом .
Используя стандартную подсказку (обратите внимание, что ничего не выбрано):
Или с подсказкой и чем-то динамическим (не могло также быть подсказкой):
Использование в приведенном выше примере
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
Я закончил тем, что использовал Button вместо этого. Хотя a Button не является a Spinner , поведение легко настроить.
Сначала создайте адаптер как обычно:
Обратите внимание, что я использую в simple_spinner_dropdown_item качестве идентификатора макета. Это поможет улучшить внешний вид при создании диалогового окна предупреждения.
В обработчике onClick для моей кнопки у меня есть:
Во-первых, вас может заинтересовать prompt атрибут Spinner класса. См. Рисунок ниже: «Выберите планету» — это приглашение, которое можно задать в XML с помощью android:prompt=»» .
Я собирался предложить подкласс Spinner , где вы могли бы поддерживать два адаптера внутри. Один адаптер с опцией «Выбрать один», а другой — реальный адаптер (с актуальными опциями), затем с помощью OnClickListener переключателя адаптеров перед отображением диалогового окна выбора. Однако после попытки реализовать эту идею я пришел к выводу, что вы не можете получать OnClick события для самого виджета.
Вы могли бы обернуть счетчик в другое представление, перехватить щелчки на представлении, а затем попросить CustomSpinner переключить адаптер, но это похоже на ужасный хак.
Вам действительно нужно показать «Выбрать один»?
Этот код был протестирован и работает на Android 4.4
Я нашел это решение:
Просто измените массив [0] с помощью «Select One», а затем в onItemSelected переименуйте его в «One».
Не классное решение, но оно работает: D
Нет API по умолчанию для установки подсказок на Spinner. Чтобы добавить его, нам нужен небольшой обходной путь без реализации отражения безопасности
Здесь много ответов, но я удивлен, что никто не предложил простое решение: поместите TextView поверх Spinner. Установите прослушиватель щелчков на TextView, который скрывает TextView, показывает Spinner и вызывает spinner.performClick ().
У меня та же проблема с блесной, с пустым выбором, и я нашел лучшее решение. Посмотрите на этот простой код.
Здесь spinneradapter — это небольшая настройка для arrayadapter. Это выглядит так:
Вы можете изменить его на текстовое представление и использовать это:
а затем определить android:text свойство.
Некоторая функция (добавить вещи в адаптер программно)>
Теперь у вас есть пустой счетчик, и вы можете написать код, чтобы не открывать диалоговое окно, если оно пустое. Или они могут нажать назад. Но вы также заполняете его функцией или другим списком во время выполнения.
Я пытался, как следующее. Возьмите кнопку и передайте ей событие нажатия. Изменяя фон кнопки, она кажется вращающейся.
Объявите как глобальные переменные alerttdialog и значение по умолчанию.
Взгляните на приложение iosched для решения общего назначения по добавлению элемента в начало списка. В частности, если вы используете CursorAdapter, посмотрите на TracksAdapter.java который расширяет это определение, предоставляя метод «setHasAllItem» и связанный код для управления счетчиком списка, чтобы иметь дело с дополнительным элементом в верхней части.
Используя пользовательский адаптер, вы можете установить текст «Выбрать один» или что-то еще, что вы хотите, чтобы этот верхний элемент сказал.
У меня есть спиннер в main.xml и его идентификатор @+id/spinner1
это то, что я пишу в моей функции OnCreate:
Это не требует никакой реализации в классе.
Я нашел много хороших решений для этого. большинство работает, добавляя элемент в конец адаптера, и не отображает последний элемент в раскрывающемся списке. Большая проблема для меня заключалась в том, что выпадающий список счетчика будет начинаться с нижней части списка. Таким образом, пользователь видит последние элементы вместо первых (в случае, если нужно отобразить много элементов), после первого касания счетчика.
Поэтому я поместил подсказку в начало списка. и скрыть первый элемент в раскрывающемся списке.
установите макет ниже в @Override getDropDownView (), когда позиция равна 0, чтобы скрыть первую строку подсказки.
Кроме того, есть простой способ показать по умолчанию:
Вы можете добавить значение по умолчанию в свой список, а затем добавить всю свою коллекцию, используя list.addAll(yourCollection);
Пример работоспособного кода здесь:
Надеюсь, это восстановит вашу сложность. Удачного кодирования!
Я думаю, что самый простой способ — создать фиктивный элемент с индексом 0, говоря «выберите один», а затем при сохранении, возможно, проверить, что выбор не равен 0.
Так что это мой последний пример «олл-ин» для кнопки-прядильщика
В activity_my_form.xml
В strings.xml
В MyFormActivity.java
Наконец-то я получил размер шрифта, который можно настраивать без выбора первого элемента. Благодаря HRJ
При расширении SpinnerAdapter вы переопределяете два View метода -производства getView(int, View, ViewGroup) и getDropDownView(int, View, ViewGroup) . Первый поставляет View вставленный в Spinner себя; вторая поставляет View в раскрывающемся списке (как следует из названия). Вы можете переопределить getView(. ) так, чтобы, пока элемент не был выбран, он отображал TextView подсказку; затем, когда вы обнаружите, что элемент выбран, вы изменяете его, чтобы отобразить TextView соответствующий ему.
Для тех, кто использует Xamarin, здесь C # эквивалент ответа aaronvargas выше.
Я также решил эту проблему с помощью следующего кода. Предположим, у вас есть список предметов, например,
Теперь мы должны предоставить струны для прядильщика, потому что прядильщик не может понять объект. Поэтому мы создадим новый список массивов со строковыми элементами, подобными этим ->
Теперь у нас есть itemStringArrayList список массивов с двумя строковыми элементами. И мы должны показать текст «Выбрать элемент» в качестве первого элемента. Поэтому мы должны вставить новую строку в itemStringArrayList .
Теперь у нас есть список массивов, itemsArrayList и мы хотим показать два элемента в выпадающем списке . Но условие здесь . Если мы ничего не выбираем, то Select Item должен появиться первый элемент, который не будет включен.
Таким образом, мы можем реализовать эту функцию следующим образом. Если вам нужно загрузить элементы списка массивов в Android Spinner. Так что вам придется использовать какой-то адаптер. Так что здесь я буду использовать ArrayAdapter . Мы также можем использовать адаптер для настройки.
Вот в этом коде. мы используем индивидуальный счетчик макета , т.е. R.layout.spinner_item . Это простой текстовый вид
Нам нужно отключить первый текст в счетчике. Так что для позиции 0 мы отключаем текст. И цвет также мы можем установить, переопределив метод getDropDownView. Таким образом, мы получим ожидаемый счетчик.
Источник