Android - настроить Spinner для использования массива

Я объявляю свой Spinner следующим образом (он очень статичен, поэтому у меня есть 2 строковых массива в array.xml для заголовков и значений)

<Spinner
    android:id="@+id/searchCriteria"
    android:entries="@array/searchBy"
    android:entryValues="@array/searchByValues" />

Я ожидаю, что spinner.getSelectedItem() вернет массив [title, value] но на самом деле он возвращает только строку заголовка. Это игнорирование android:entryValues? Как получить значение, а не заголовок? Это выполнимо только с XML или мне нужно создать адаптер и сделать это программно?

Ответ 1

Вместо метода с двумя массивами, почему бы не заполнить ваш ArrayAdapter программно объектами известного типа и использовать их. Я написал учебник аналогичного характера (ссылка внизу), который делает это. Основная предпосылка - создать массив объектов Java, рассказать об этом, а затем использовать эти объекты непосредственно из класса 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

Итак, если вы пришли сюда, потому что вы хотите иметь как метку, так и значение в Spinner - вот как я это сделал:

  • Просто создайте свой Spinner обычным способом.
  • Определите 2 массива равного размера в файле array.xml. Один для меток, один для значений
  • Установите Spinner с помощью android:entries="@array/labels"
  • В вашем коде - когда вам нужно значение, сделайте что-то вроде этого (нет, вам не нужно его связывать)

    String selectedVal = getResources().getStringArray(R.array.values)[spinner
                             .getSelectedItemPosition()];
    

  • И помните, что эти 2 массива должны соответствовать друг другу, поскольку число слотов и позиций

Ответ 3

Отменить, прервать! Я не знаю, что получилось, но Spinner не поддерживает атрибут android:entryValues. Это фактически от ListPreference, который делает аналогичную вещь (отображает список элементов во всплывающем диалоговом окне). Для того, что мне нужно, мне придется (увы) использовать SpinnerAdapter