Android - 配置 Spinner 以使用数组 [英] Android - configure Spinner to use array

查看:23
本文介绍了Android - 配置 Spinner 以使用数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I declare my Spinner in the following manner (it's very static so I have 2 string arrays in array.xml for titles and values)

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

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

I expect spinner.getSelectedItem() to return an array [title, value] but in fact it returns just a title String. Is it ignoring android:entryValues? How do I get a value, not a title from it? Is this doable with XML only or do I need to create adapter and do it programmatically?

推荐答案

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

Rather than the dual array method, why not fill your ArrayAdapter programmatically with objects of a known type and use that. I've written a tutorial of a similar nature (link at the bottom) that does this. The basic premise is to create an array of Java objects, tell the spinner about the, and then use those objects directly from the spinner class. In my example I have an object representing a "State" which is defined as follows:

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 + ")" );
}
}

然后你可以用这些类的数组填充一个微调器,如下所示:

Then you can populate a spinner with an array of these classes as follows:

       // 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);  

您可以按如下方式检索所选项目:

You can retrieve the selected item as follows:

State st = (State)spinner.getSelectedItem();

现在您有一个真正的 Java 类可以使用.如果你想在 spinner 值改变时进行拦截,只需实现 OnItemSelectedListener 并添加适当的方法来处理事件.

And now you have a bona fide Java class to work with. If you want to intercept when the spinner value changes, just implement the OnItemSelectedListener and add the appropriate methods to handle the events.

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

You can find the whole tutorial here: http://www.katr.com/article_android_spinner01.php

这篇关于Android - 配置 Spinner 以使用数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆