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中有标签和价值 – 我是这样做的:
- 只要用通常的方式创build你的Spinner即可
- 在你的array.xml文件中定义两个相等大小的数组。 一个用于标签,一个用于值
- 用
android:entries="@array/labels"
设置你的微调android:entries="@array/labels"
-
在你的代码中 – 当你需要一个值时,可以这样做(不,你不必链接它)
String selectedVal = getResources().getStringArray(R.array.values)[spinner .getSelectedItemPosition()];
- 请记住 – 这两个arrays必须相互匹配,直到数字插槽和位置
中止,放弃! 我不知道什么进入了我,但Spinner
不支持android:entryValues
属性。 那个实际上是从ListPreference
中做了类似的事情(显示popup对话框中的项目列表)。 为了我所需要的,我必须(唉)使用SpinnerAdapter