我有一个由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;
}...
我确信我让它变得比实际更难!我很欣赏任何想法。
答案 0 :(得分:1)
基本上,枚举类型具有相关的间隔。所以你不需要打开间隔,只需打开枚举类型:
Object obj = newAlarmFreqSpinner.getSelectedItem();
switch((Frequencies)obj) {
case Frequencies.EVERYDAY {
alarm.setInterval(EVERYDAY.getIntervalInSecs());
break;
}...