- Spinner
- Общая информация
- Используем адаптер
- В закрытом состоянии
- В раскрытом состоянии
- За честные выборы! — что выбрал пользователь
- Предупредить компонент об изменении пунктов
- Найти позицию по слову
- Тонкая настройка — своя разметка для Spinner
- spinner.xml
- spinner_dropdown_item.xml
- Программная настройка цвета и размера текста для первой строчки
- Не выбирать элемент при запуске
- CustomAdapter.java
- Режим android:spinnerMode=»dialog»
- Как сделать Android Spinner с начальным текстом » Выберите один»
- 30 ответов
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 с начальным текстом » Выберите один»
в Android я хочу использовать счетчик, который изначально (когда пользователь еще не сделал выбор) отображает текст «выбрать один». Когда пользователь щелкает счетчик, отображается список элементов, и пользователь выбирает один из вариантов. После того, как пользователь сделал выбор, выбранный элемент отображается в блесне вместо «выбрать один».
У меня есть следующий код для создания блесны:
С помощью этого кода первоначально элемент » One » является отображается. Я мог бы просто добавить новый элемент » выбрать один «к элементам, но затем» выбрать один » также будет отображаться в раскрывающемся списке в качестве первого элемента, что не то, что я хочу.
Как я могу решить эту проблему?
30 ответов
вот общее решение, которое переопределяет Spinner вид. Он переопределяет setAdapter() чтобы установить начальную позицию в -1, и прокси поставляемые SpinnerAdapter для отображения строки приглашения для позиции менее 0.
это было протестировано на Android 1.5 через 4.2, но покупатель будьте осторожны! Потому что это решение полагается на отражение, чтобы вызвать private AdapterView.setNextSelectedPositionInt() и AdapterView.setSelectedPositionInt() , это не гарантированно работать в будущих обновлениях ОС. Кажется вероятным, что так и будет, но это отнюдь не так гарантированный.
обычно я бы не стал потворствовать чему-то подобному, но этот вопрос задавался достаточно часто, и это кажется достаточно разумным запросом, что я думал, что опубликую свое решение.
что вы можете сделать, это украсить ваш SpinnerAdapter С одним, который представляет » выбрать опцию. ‘Просмотр первоначально для Spinner для отображения с ничего не выбран.
вот рабочий пример, протестированный для Android 2.3 и 4.0 (он ничего не использует в библиотеке совместимости, поэтому он должен быть в порядке на некоторое время), так как это декоратор, должно быть легко модифицировать существующий код, и он отлично работает с CursorLoader s также. (Поменять курсор на обернутый cursorAdapter конечно. )
там это ошибка Android, которая делает это немного сложнее для повторного использования представлений. (Таким образом, вы должны использовать setTag или что-то еще, чтобы обеспечить ваш convertView является правильным.) Spinner не поддерживает несколько типов просмотра
код примечания: 2 конструктора
это позволяет использовать стандартное приглашение или определить свой собственный «ничего не выбрано» в качестве первой строки, или оба, или нет. (Примечание: некоторые темы показывают выпадающий список для Spinner вместо диалога. Выпадающем не нормально показать подсказку)
вы определяете макет, чтобы «выглядеть» как приглашение, например, серым цветом.
используя стандартное приглашение (обратите внимание, что ничего не выбрано):
или с подсказкой и чем-то динамическим (также не могло быть подсказки):
использование в выше пример
contact_spinner_row_nothing_selected.в XML
NothingSelectedSpinnerAdapter.java
Я закончил тем, что использовал Button вместо. А Button — это не Spinner поведение легко настроить.
сначала создайте адаптер как обычно:
обратите внимание, что я использую simple_spinner_dropdown_item как идентификатор макета. Это поможет создать лучший внешний вид при создании диалогового окна оповещения.
в обработчике onClick для моей кнопки у меня есть:
Я знаю, что этот вопрос имеет много ответов, но я нашел простой и легкий способ сделать.
данное решение не зависит от уровня API, он будет работать для всех уровней API.
идея состоит в том, чтобы установить последний элемент spinner по умолчанию один..ie
пункт, наконец, индекс должен быть вашим названием spinner, как «Выберите страну»
и при заполнении счетчика уменьшить количество элементов на один.я.е //Рассчитывать начинается от 1 до общего пункта.
таким образом, ваш поток кода будет таким
Название Блесны Пункт Блесны
во-первых, вы можете быть заинтересованы в на Spinner класса. См. рисунок ниже,» выберите планету » — это приглашение, которое можно установить в XML с помощью android:prompt=»» .
Я собирался предложить подклассы Spinner , где вы можете поддерживать два адаптера внутри. Один адаптер, который имеет опцию» выбрать один», а другой реальные адаптер (с фактическими параметрами), затем с помощью OnClickListener чтобы переключиться отображаются адаптеры перед диалогом выбора. Однако, попробовав реализовать эту идею, я пришел к выводу, что вы не можете получить OnClick события для самого виджета.
вы можете обернуть счетчик в другой вид, перехватить клики на вид, а затем сказать ваш CustomSpinner для переключения адаптера, но кажется, как ужасный Хак.
вам действительно нужно показать «выбрать один»?
этот код был протестирован и работает на Android 4.4
Я нашел такое решение:
просто измените массив[0] с помощью «Select One», а затем в onItemSelected переименуйте его в «One».
Не классное решение, но оно работает: D
нет API по умолчанию для установки подсказки на Spinner. Чтобы добавить его, нам нужно небольшое обходное решение без реализации отражения безопасности
много ответов здесь, но я удивлен, что никто не предложил простое решение: поместите TextView поверх Spinner. Установите прослушиватель щелчка на TextView, который скрывает TextView, показывает счетчик и вызывает счетчик.performClick().
у меня такая же проблема для spinner, с пустым выбором, и я нашел лучшее решение. Взгляните на этот простой код.
здесь spinneradapter-это небольшая настройка для arrayadapter. Выглядит это так:
некоторая функция (добавьте вещи в адаптер программно)>
теперь у вас есть пустой счетчик, и вы можете написать код, чтобы не открывать диалог, если он пуст. Или они могут отодвинуться. Но вы также заполняете его функцией или другим списком во время выполнения.
вы можете изменить его на текстовое представление и использовать это:
и android:text собственность.
Я пробовал следующее. Возьмите кнопку и дайте ей событие click. Изменяя фон кнопки, кажется, что это спиннер.
объявить как глобальные переменные alertdialog и значение по умолчанию..
взгляните на приложение iosched для решения общего назначения для добавления элемента в верхнюю часть списка. В частности, если вы используете CursorAdapter, посмотрите на TracksAdapter.java который расширяет это определение, чтобы предоставить метод «setHasAllItem» и связанный с ним код для управления количеством списков для работы с дополнительным элементом вверху.
используя пользовательский адаптер, вы можете установить текст «выбрать один» или что-то еще, что вы хотите, чтобы этот верхний элемент сказал.
у меня есть счетчик на моем основном.xml и его идентификатор @+id/spinner1
это то, что я пишу в своей функции OnCreate:
он не нуждается в какой-либо реализации в классе.
Я думаю, что самый простой способ-создать фиктивный элемент в индексе 0, говоря «выберите один», а затем при сохранении, возможно, проверьте, что выбор не равен 0.
Итак, это мой последний пример «all-in» для кнопки-spinner
на activity_my_form.в XML
на строки.в XML
на MyFormActivity.java
наконец, я получил размер шрифта, настраиваемый без первого элемента, выбираемого кнопкой spinner. благодаря HRJ
Я нашел много хороших решений для этого. большинство работает путем добавления элемента в конец адаптера и не отображает последний элемент в раскрывающемся списке. Большой проблемой для меня был выпадающий список spinner, который начнется с нижней части списка. Таким образом, пользователь видит последние элементы вместо первых элементов (в случае, если есть много элементов, чтобы показать), после касания прядильщика в первый раз.
поэтому я помещаю элемент подсказки в начало списка. и скрыть первый пункт в раскрывающемся списке список.
установите нижеприведенный макет в @Override getDropDownView (), когда позиция равна 0, чтобы скрыть первую строку подсказки.
при расширении SpinnerAdapter , вы переопределить два View методов производства, getView(int, View, ViewGroup) и getDropDownView(int, View, ViewGroup) . Первый поставляет View вставить в Spinner сам; второй поставляет View в раскрывающемся списке (как следует из названия). Вы можете переопределить getView(. ) так, что, пока элемент не был выбран, он отображается TextView содержащий приглашение; затем, когда вы обнаружите, что элемент был выбран, вы измените его, чтобы отобразить TextView соответствующее что.
для тех, кто использует Xamarin, вот c#, эквивалентный ответу aaronvargas выше.
Я также решил эту проблему, используя следующий код. Предположим, у вас есть список элементов, например
теперь мы должны предоставить строки spinner, потому что spinner не может понять объект. Поэтому мы создадим новый список массивов со строковыми элементами, как это ->
теперь у нас есть itemStringArrayList список массивов с двумя строковыми элементами. И мы должны показать текст «Select Item» в качестве первого элемента. Поэтому мы должны вставить новую строку в itemStringArrayList .
теперь у нас есть список выбора itemsArrayList и мы хотим показать два элемента в выпадающем списке. Но условие здесь есть . Если мы ничего не выберем, то Select Item должны отображаться как первый элемент, который не будет включен.
таким образом, мы можем реализовать эту функциональность следующим образом. Если вам нужно загрузить элементы списка массивов в Android spinner. Поэтому вам придется использовать какой-то адаптер. Поэтому здесь я буду использовать ArrayAdapter . Мы также можем использовать адаптер customise.
вот в этом коде. мы используем индивидуальный макет spinner, т. е. R.layout.spinner_item . Это простой текстовый вид
нам нужно отключить первый текст в spinner. Поэтому для позиции 0 мы отключаем текст. И цвет также мы можем установить путем overiding метод getDropDownView. Таким образом, мы получим ожидаемый блесны.
Я бы просто использовать RadioGroup с радиокнопки если у вас есть только три варианта, вы можете сделать их все непроверено на первый взгляд.
ни один из ранее представленных ответов не работал так, как я хотел решить эту проблему. Для меня идеальное решение предоставит «выбрать один» (или любой исходный текст) при первом отображении блесны. Когда пользователь нажимает счетчик, исходный текст не должен быть частью раскрывающегося списка, который отображается.
чтобы еще больше усложнить мою конкретную ситуацию, мои данные spinner формируются курсором, который загружается через LoaderManager обратный вызов.
после значительных экспериментов я пришел к следующему решению:
я обрабатываю это с помощью кнопки вместо счетчика. у меня есть образец проекта на GitHub.
в проекте я показываю как счетчик, так и кнопку, чтобы показать, что они действительно выглядят одинаково. Кроме кнопки, вы можете установить начальный текст на все, что хотите.
вот как выглядит активность:
Примечание: Да, я понимаю, что это зависит от прикладной темы, и внешний вид будет немного отличается при использовании темы.Голографический. Однако, если вы используете одну из устаревших тем, таких как тема.Блэк, ты можешь идти.
Если вы столкнулись с этой проблемой когда ваши элементы заполняются из базы данных-курсор,
самое простое решение, которое я нашел в этой вот ответ:
используйте UNION в запросе адаптера курсора и добавьте дополнительный элемент с в результат запроса, не добавляя его в БД:
db.rawQuery («выберите iWorkerId как _id, nvLastName как имя из Worker W UNION SELECT -1 as _id, «as name», null);
Если выбран элемент -1, то это значение по умолчанию. Иначе это запись со стола.
кажется банальным решением, но я обычно ставлю просто TextView перед спиннером. Весь Xml выглядит так. (Эй, ребята, не стреляйте в меня, я знаю, что некоторым из вас не нравится такой брак):
затем я скрываю TextView, когда элемент был выбран. Очевидно, что цвет фона TextView должен быть таким же, как и Spinner. Работает на Android 4.0. Не знаю по старым версиям.
да. Потому что счетчик звонков setOnItemSelectedListener в начале скрытие textview может быть немного сложным, но может быть сделано следующим образом:
для меня это сработало примерно так. имеет улучшение, которое изменяет текст только в некоторых вариантах, а не во всех.
сначала я беру имена spinner и создаю arrayadapter с настраиваемым представлением, но теперь это не имеет значения, ключ переопределяет getView, а внутри изменяет значения, которые вам нужно изменить. В моем случае был только первый, остальные я оставляю оригинальным
Источник