2009-10-19 3 views
42

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

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

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

+1

, даже если он не работает ... я люблю простоту этой мысли – kritzikratzi

ответ

110

Вместо того двойственного метода массива, почему не заполнять ваш 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

+0

String toString() - это ключ здесь, иначе он отобразит это имя ресурса при выборе счетчика – adadion

+0

, так, как установить значение по умолчанию в программе? –

7

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

+1

Вы будете желающей:> андроида: записи = "@ array/searchByValues ​​" – Blundell

54

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

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

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

  5. и помните - эти 2 массивы должны соответствовать друг другу, насколько количество слотов и позиции
+3

Параллельные массивы кричат ​​вместо Карты. – m0skit0

+0

müskitü: Я полностью согласен с вами, но я думаю, что Android затрудняет использование карт. –

+2

, то какова точка атрибута «entryValues» при определении listView через XML? – sports

Смежные вопросы