Я хочу использовать Spinner, который изначально (когда пользователь еще не сделал выбор) отображает текст «Select One». Когда пользователь щелкает счетчик, отображается список элементов, и пользователь выбирает один из вариантов. После того, как пользователь сделал выбор, выбранный элемент отображается в Spinner вместо «Select One».
У меня есть следующий код для создания Spinner:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
С этим кодом изначально отображается пункт «Один». Я мог бы просто добавить новый элемент «Выбрать один» к элементам, но тогда «Выбрать один» также будет отображаться в раскрывающемся списке в качестве первого элемента, что не является тем, что я хочу.
Как я могу решить эту проблему?
android
android-spinner
Питер Куйперс
источник
источник
Ответы:
Вот общее решение, которое отвергает
Spinner
мнение. Он переопределяет,setAdapter()
чтобы установить начальную позицию на -1, и предоставляет прокси для предоставленияSpinnerAdapter
строки приглашения для позиции меньше 0.Это было проверено на Android 1.5 через 4.2, но покупатель остерегается! Поскольку это решение опирается на отражение назвать частным
AdapterView.setNextSelectedPositionInt()
иAdapterView.setSelectedPositionInt()
, это не гарантирует работу в будущих обновлениях ОС. Кажется вероятным, что так и будет, но это ни в коем случае не гарантировано.Обычно я не одобряю что-то подобное, но этот вопрос задавался достаточно много раз, и кажется, что это достаточно разумная просьба, чтобы я решил опубликовать свое решение.
источник
Что вы можете сделать, это украсить свой
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
вместо этого. Хотя aButton
не является aSpinner
, поведение легко настроить.Сначала создайте адаптер как обычно:
Обратите внимание, что я использую в
simple_spinner_dropdown_item
качестве идентификатора макета. Это поможет улучшить внешний вид при создании диалогового окна предупреждения.В обработчике onClick для моей кнопки у меня есть:
И это все!
источник
Во-первых, вас может заинтересовать
prompt
атрибутSpinner
класса. См. Рисунок ниже: «Выберите планету» - это приглашение, которое можно задать в XML с помощьюandroid:prompt=""
.Я собирался предложить подкласс
Spinner
, где вы могли бы поддерживать два адаптера внутри. Один адаптер с опцией «Выбрать один», а другой - реальный адаптер (с актуальными опциями), затем с помощьюOnClickListener
переключателя адаптеров перед отображением диалогового окна выбора. Однако после попытки реализовать эту идею я пришел к выводу, что вы не можете получатьOnClick
события для самого виджета.Вы могли бы обернуть счетчик в другое представление, перехватить щелчки на представлении, а затем попросить
CustomSpinner
переключить адаптер, но это похоже на ужасный хак.Вам действительно нужно показать «Выбрать один»?
источник
Этот код был протестирован и работает на Android 4.4
источник
getItem(getCount())
для меня подчеркнуто красным? Не удается разрешить метод setHintЯ нашел это решение:
Просто измените массив [0] с помощью «Select One», а затем в onItemSelected переименуйте его в «One».
Не классное решение, но оно работает: D
источник
Нет API по умолчанию для установки подсказок на Spinner. Чтобы добавить его, нам нужен небольшой обходной путь без реализации отражения безопасности
Источник адаптера:
Первоначальный источник
источник
android.R.id.text1
getCount
методеЗдесь много ответов, но я удивлен, что никто не предложил простое решение: поместите TextView поверх Spinner. Установите прослушиватель щелчков на TextView, который скрывает TextView, показывает Spinner и вызывает spinner.performClick ().
источник
У меня та же проблема с блесной, с пустым выбором, и я нашел лучшее решение. Посмотрите на этот простой код.
Здесь spinneradapter - это небольшая настройка для arrayadapter. Это выглядит так:
источник
Вы можете изменить его на текстовое представление и использовать это:
а затем определить
android:text
свойство.источник
XML-файл:
Деятельность:
OnCreate:
Некоторая функция (добавить вещи в адаптер программно)>
Теперь у вас есть пустой счетчик, и вы можете написать код, чтобы не открывать диалоговое окно, если оно пустое. Или они могут нажать назад. Но вы также заполняете его функцией или другим списком во время выполнения.
источник
Я пытался, как следующее. Возьмите кнопку и передайте ей событие нажатия. Изменяя фон кнопки, она кажется вращающейся.
Объявите как глобальные переменные alerttdialog и значение по умолчанию.
источник
Это мой путь:
источник
Взгляните на приложение iosched для решения общего назначения по добавлению элемента в начало списка. В частности, если вы используете CursorAdapter, посмотрите на TracksAdapter.java который расширяет это определение, предоставляя метод "setHasAllItem" и связанный код для управления счетчиком списка, чтобы иметь дело с дополнительным элементом в верхней части.
Используя пользовательский адаптер, вы можете установить текст «Выбрать один» или что-то еще, что вы хотите, чтобы этот верхний элемент сказал.
источник
У меня есть спиннер в main.xml и его идентификатор
@+id/spinner1
это то, что я пишу в моей функции OnCreate:
Это не требует никакой реализации в классе.
источник
Я нашел много хороших решений для этого. большинство работает, добавляя элемент в конец адаптера, и не отображает последний элемент в раскрывающемся списке. Большая проблема для меня заключалась в том, что выпадающий список счетчика будет начинаться с нижней части списка. Таким образом, пользователь видит последние элементы вместо первых (в случае, если нужно отобразить много элементов), после первого касания счетчика.
Поэтому я поместил подсказку в начало списка. и скрыть первый элемент в раскрывающемся списке.
установите макет ниже в @Override getDropDownView (), когда позиция равна 0, чтобы скрыть первую строку подсказки.
R.layout.spinner_hint_list_item_layout:
источник
Кроме того, есть простой способ показать по умолчанию:
Вы можете добавить значение по умолчанию в свой список, а затем добавить всю свою коллекцию, используя
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
соответствующий ему.источник
Spinner
руководством (которое предположительно отображаетToast
ПОСЛЕ того, как вы выбрали элемент), это ДОЛЖНО работать: developer.android.com/resources/tutorials/views/…Для тех, кто использует Xamarin, здесь C # эквивалент ответа aaronvargas выше.
источник
Я также решил эту проблему с помощью следующего кода. Предположим, у вас есть список предметов, например,
Теперь мы должны предоставить струны для прядильщика, потому что прядильщик не может понять объект. Поэтому мы создадим новый список массивов со строковыми элементами, подобными этим ->
Теперь у нас есть
itemStringArrayList
список массивов с двумя строковыми элементами. И мы должны показать текст «Выбрать элемент» в качестве первого элемента. Поэтому мы должны вставить новую строку вitemStringArrayList
.Теперь у нас есть список массивов,
itemsArrayList
и мы хотим показать два элемента в выпадающем списке . Но условие здесь ... Если мы ничего не выбираем, тоSelect Item
должен появиться первый элемент, который не будет включен.Таким образом, мы можем реализовать эту функцию следующим образом. Если вам нужно загрузить элементы списка массивов в Android Spinner. Так что вам придется использовать какой-то адаптер. Так что здесь я буду использовать
ArrayAdapter
. Мы также можем использовать адаптер для настройки.Вот в этом коде. мы используем индивидуальный счетчик макета , т.е.
R.layout.spinner_item
. Это простой текстовый видНам нужно отключить первый текст в счетчике. Так что для позиции 0 мы отключаем текст. И цвет также мы можем установить, переопределив метод getDropDownView. Таким образом, мы получим ожидаемый счетчик.
источник
Я бы просто использовал RadioGroup с RadioButtons, если у вас есть только три варианта, вы можете сначала отключить их все.
источник
Ни один из ранее представленных ответов действительно не работал так, как я хотел решить эту проблему. Для меня идеальным решением было бы предоставить «Выбрать один» (или любой другой исходный текст) при первом отображении счетчика. Когда пользователь нажимает на счетчик, исходный текст не должен быть частью раскрывающегося списка.
Чтобы еще больше усложнить мою конкретную ситуацию, мои данные счетчика поступают из курсора, который загружается с помощью обратных вызовов LoaderManager.
После значительных экспериментов я нашел следующее решение:
источник
Я справляюсь с этим, используя кнопку вместо Spinner. У меня есть пример проекта на GitHub.
В проекте я показываю и Spinner, и кнопку, чтобы показать, что они действительно выглядят одинаково. Кроме кнопки вы можете установить исходный текст на что угодно.
Вот как выглядит это занятие:
ПРИМЕЧАНИЕ. Да, я понимаю, что это зависит от примененной темы, и при использовании Theme.Holo внешний вид будет немного отличаться. Однако, если вы используете одну из унаследованных тем, например, Theme.Black, все готово.
источник
если вы столкнулись с этой проблемой, когда ваши элементы заполняются из базы-курсора ,
самое простое решение, которое я нашел в этом SO ответе:
используйте UNION в запросе адаптера курсора и добавьте дополнительный элемент с id = -1 к результату запроса, не добавляя его в базу данных:
что-то вроде:
если выбранный элемент равен -1, то это значение по умолчанию. В противном случае это запись из таблицы.
источник
Кажется банальным решением, но я обычно помещаю просто TextView перед спиннером. Весь Xml выглядит следующим образом. (Эй, ребята, не стреляйте в меня, я знаю, что некоторым из вас не нравится этот вид брака):
Затем я скрываю TextView, когда элемент был выбран. Очевидно, что цвет фона TextView должен быть таким же, как у Spinner. Работает на Android 4.0. Не знаю, на старых версиях.
Да. Поскольку Spinner вызывает setOnItemSelectedListener в начале, скрытие текстового представления может быть немного сложным, но это можно сделать следующим образом:
источник
для меня это сработало примерно так. имеет улучшение, которое изменяет только текст в НЕКОТОРЫХ параметрах, а не во всех.
Сначала я беру имена счетчика и создаю адаптер массива с настраиваемым представлением, но теперь это не имеет значения, ключ переопределяет getView, и внутри меняются значения, которые нужно изменить. В моем случае был только первый, остальное оставляю оригинал
источник
вот простой
источник
Обратитесь к одному из приведенных выше ответов: https://stackoverflow.com/a/23005376/1312796
Я добавил свой код, чтобы исправить небольшую ошибку. Это где данные не получены .. Как показать текст подсказки ..!
Вот мой трюк ... Он прекрасно работает со мной. !
Попытайтесь поместить ваш счетчик в Relative_layouta и выровнять Textview с вашим счетчиком и играть с видимостью Textview (ПОКАЗАТЬ / СКРЫТЬ) всякий раз, когда адаптер счетчика загружен или пуст.
Вот код:
вызовите этот метод после и до загрузки и опустошения адаптера счетчика.
источник