从Android Spinner中选择项目并使用它

时间:2012-05-24 11:31:49

标签: android spinner datamapper

我有一个由Enum填充的微调器:

public enum Frequencies
    {
    EVERYDAY("Every day"), EVERYOTHERDAY("Every second day");

    private String friendlyName;

    private Frequencies(String friendlyName)
    {
        this.friendlyName = friendlyName;
    }

    @Override public String toString()
    {
        return friendlyName;
    }
    };

toString()覆盖意味着微调器显示用户友好名称。

微调器的填充方式如下:

        ArrayAdapter<Frequencies> adapter = new ArrayAdapter<Frequencies>(this, android.R.layout.simple_spinner_item, 
            Frequencies.values());
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    newAlarmFreqSpinner.setAdapter(adapter);

所有这一切都运作良好。当用户从微调器中选择一个频率时,我想使用该值设置long值来表示简单Alarm对象中警报之间的间隔。因此,“每一天”的值将是一天中的秒数。

但是,我无法理解如何优雅地处理从微调器中检索的Frequency对象。我最初的想法是使用switch语句来打开显示的字符串以确定我需要的长值,但当然你不能在字符串上switch

然后我尝试修改频率枚举,以便每个条目都存储自己的长值:

    EVERYDAY("Every day", 86400), EVERYOTHERDAY("Every second day", 86400 * 2);

private String friendlyName;
public final int intervalInSecs;

private Frequencies(String friendlyName, int intervalInSecs)
{
    this.friendlyName = friendlyName;
    this.intervalInSecs = intervalInSecs;
}...

但是转换然后抱怨“case表达式必须是常量表达式”(即使我已经intervalInSecs final):

    Object obj = newAlarmFreqSpinner.getSelectedItem();
    switch(((Frequencies)obj).getIntervalInSecs())
{
    case Frequencies.EVERYDAY.intervalInSecs: //Java doesn't like this
    {

        break;
    }...

我确信我让它变得比实际更难!我很欣赏任何想法。

1 个答案:

答案 0 :(得分:1)

基本上,枚举类型具有相关的间隔。所以你不需要打开间隔,只需打开枚举类型:

Object obj = newAlarmFreqSpinner.getSelectedItem();
switch((Frequencies)obj) {
case Frequencies.EVERYDAY {
    alarm.setInterval(EVERYDAY.getIntervalInSecs());
    break;
}...