Android - настройте счетчик для использования массива
-
22-09-2019 - |
Вопрос
Я объявляю свой счетчик следующим образом (он очень статичен, поэтому у меня
есть 2 строковых массива в array.xml
для названий и ценностей)
<Spinner
android:id="@+id/searchCriteria"
android:entries="@array/searchBy"
android:entryValues="@array/searchByValues" />
Я ожидаю , что spinner.getSelectedItem()
чтобы вернуть массив [title, value]
но на самом деле он возвращает просто строку заголовка.Это игнорирование
android:entryValues
?Как мне получить от него значение, а не название?
Это выполнимо только с XML или мне нужно создать адаптер и сделать это
программно?
Решение
Вместо метода двойного массива, почему бы не заполнить ваш ArrayAdapter программно объектами известного типа и не использовать это.Я написал учебник аналогичного характера (ссылка внизу), который делает это.Основная предпосылка состоит в том, чтобы создать массив объектов Java, сообщить об этом spinner, а затем использовать эти объекты непосредственно из класса spinner.В моем примере у меня есть объект, представляющий "Состояние", которое определяется следующим образом:
package com.katr.spinnerdemo;
public class State {
// Okay, full acknowledgment that public members are not a good idea, however
// this is a Spinner demo not an exercise in java best practices.
public int id = 0;
public String name = "";
public String abbrev = "";
// A simple constructor for populating our member variables for this tutorial.
public State( int _id, String _name, String _abbrev )
{
id = _id;
name = _name;
abbrev = _abbrev;
}
// The toString method is extremely important to making this class work with a Spinner
// (or ListView) object because this is the method called when it is trying to represent
// this object within the control. If you do not have a toString() method, you WILL
// get an exception.
public String toString()
{
return( name + " (" + abbrev + ")" );
}
}
Затем вы можете заполнить счетчик массивом этих классов следующим образом:
// Step 1: Locate our spinner control and save it to the class for convenience
// You could get it every time, I'm just being lazy... :-)
spinner = (Spinner)this.findViewById(R.id.Spinner01);
// Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, new State[] {
new State( 1, "Minnesota", "MN" ),
new State( 99, "Wisconsin", "WI" ),
new State( 53, "Utah", "UT" ),
new State( 153, "Texas", "TX" )
});
// Step 3: Tell the spinner about our adapter
spinner.setAdapter(spinnerArrayAdapter);
Вы можете извлечь выбранный элемент следующим образом:
State st = (State)spinner.getSelectedItem();
И теперь у вас есть настоящий Java-класс для работы.Если вы хотите перехватывать при изменении значения счетчика, просто реализуйте OnItemSelectedListener и добавьте соответствующие методы для обработки событий.
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
// Get the currently selected State object from the spinner
State st = (State)spinner.getSelectedItem();
// Now do something with it.
}
public void onNothingSelected(AdapterView<?> parent )
{
}
Вы можете найти весь учебник здесь:http://www.katr.com/article_android_spinner01.php
Другие советы
Итак, если вы пришли сюда, потому что хотите иметь в Спиннере и метку, и значение - вот как я это сделал:
- Просто создайте свой Спиннер обычным способом
- Определите 2 массива одинакового размера в вашем файле array.xml.Один для меток, один для значений
- Установите свой спиннер с помощью
android:entries="@array/labels"
В вашем коде - когда вам нужно значение, сделайте что-то вроде этого (нет, вам не нужно связывать его цепочкой)
String selectedVal = getResources().getStringArray(R.array.values)[spinner .getSelectedItemPosition()];
- И помните - эти 2 массива должны соответствовать друг другу по количеству слотов и позиций
Отбой, отбой!Я не знаю, что на меня нашло, но Spinner
не поддерживает android:entryValues
атрибут.Это на самом деле из ListPreference
который делает аналогичную вещь (отображает список элементов во всплывающем диалоговом окне).Для того, что мне нужно, мне придется (увы) использовать SpinnerAdapter