Android – configuration微调使用数组

我以下面的方式声明我的微调(它非常静态,所以我有2个string数组在array.xml中的标题和值)

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

我期望spinner.getSelectedItem()返回一个数组[title, value]但实际上它只返回一个标题string。 它忽略了android:entryValues吗? 我如何得到一个价值,而不是一个标题? 这是可行的只有XML或我需要创build适配器,并以编程方式吗?

而不是双数组方法,为什么不用编程方式用已知types的对象填充ArrayAdapter并使用它。 我写了一个类似的教程(链接在底部),这样做。 基本的前提是创build一个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 ) { } 

你可以在这里find整个教程: http : //www.katr.com/article_android_spinner01.php

所以如果你来到这里是因为你想要在Spinner中有标签和价值 – 我是这样做的:

  1. 只要用通常的方式创build你的Spinner即可
  2. 在你的array.xml文件中定义两个相等大小的数组。 一个用于标签,一个用于值
  3. android:entries="@array/labels"设置你的微调android:entries="@array/labels"
  4. 在你的代码中 – 当你需要一个值时,可以这样做(不,你不必链接它)

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

  5. 请记住 – 这两个arrays必须相互匹配,直到数字插槽和位置

中止,放弃! 我不知道什么进入了我,但Spinner不支持android:entryValues属性。 那个实际上是从ListPreference中做了类似的事情(显示popup对话框中的项目列表)。 为了我所需要的,我必须(唉)使用SpinnerAdapter