49

我以以下方式声明我的 Spinner(它非常静态,所以我有 2 个字符串数组array.xml用于标题和值)

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

我希望spinner.getSelectedItem()返回一个数组[title, value] ,但实际上它只返回一个标题字符串。是无视 android:entryValues吗?我如何从中获得价值,而不是标题?这仅适用于 XML 还是我需要创建适配器并以编程方式进行?

4

3 回答 3

136

而不是双数组方法,为什么不用已知类型的对象以编程方式填充您的 ArrayAdapter 并使用它。我已经写了一个类似性质的教程(底部的链接)来做到这一点。基本前提是创建一个 Java 对象数组,告诉微调器,然后直接从微调器类中使用这些对象。在我的示例中,我有一个表示“状态”的对象,其定义如下:

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

于 2010-10-30T16:22:37.327 回答
55

因此,如果您来这里是因为您想在 Spinner 中同时拥有标签和值 - 这就是我的做法:

  1. 只需按照通常的方式创建您的 Spinner
  2. 在您的 array.xml 文件中定义 2 个大小相等的数组。一个用于标签,一个用于值
  3. 设置你的微调器android:entries="@array/labels"
  4. 在您的代码中-当您需要一个值时,请执行以下操作(不,您不必链接它)

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

  5. 请记住 - 这两个数组必须相互匹配,就数字插槽和位置而言
于 2009-10-19T17:15:49.110 回答
8

中止,中止!我不知道是什么进入了我,但Spinner不支持android:entryValues属性。那个实际上是从ListPreference哪个做类似的事情(在弹出对话框中显示项目列表)。对于我需要的东西,我将不得不(唉)使用SpinnerAdapter

于 2009-10-19T05:48:35.500 回答