我已经查看了类似于这个问题的各种Q& As,但是还没有找到解决方案。
我所拥有的是一个枚举,代表了查看电视指南的不同方式......
在NDroid Application
类
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
...当用户更改视图时,事件处理程序从0-2收到int
并且我想做这样的事情......
在Android Activity
onClick(DialogInterface dialog, int which)
事件处理程序
// 'which' is an int from 0-2
switch (which) {
case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
...
break;
}
我已经习惯了C#enums和select / case语句,这些语句允许类似上面的东西,我知道Java做的事情有所不同,但我无法理解我需要做什么。
我是否必须诉诸if
陈述?可能只有3个选择,所以我可以做到但我想知道如何用Java中的switch-case完成它。
编辑抱歉,我没有完全扩展这个问题,因为我认为它是一个通用的Java问题。我已经添加了这个问题来进一步解释。
没有任何特定于Android的内容,这就是为什么我没有将其标记为Android,但是枚举是在Application
类中定义的,而我不想切换的代码在{{ 1}}。枚举是静态的,因为我需要从多个活动中访问它。
答案 0 :(得分:152)
您缺少的部分是从整数转换为类型安全的枚举。 Java不会自动执行此操作。有几种方法可以解决这个问题:
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
确定int值表示的枚举值,然后打开枚举值。
enum GuideView {
SEVEN_DAY,
NOW_SHOWING,
ALL_TIMESLOTS
}
// Working on the assumption that your int value is
// the ordinal value of the items in your enum
public void onClick(DialogInterface dialog, int which) {
// do your own bounds checking
GuideView whichView = GuideView.values()[which];
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
}
您可能会发现编写自定义valueOf
实现更有帮助/更不容易出错,该实现将整数值作为参数来解析相应的枚举值,并允许您集中边界检查。
答案 1 :(得分:39)
如果whichView
是GuideView枚举的对象,则以下效果很好。请注意,case
之后的常量没有限定符。
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
答案 2 :(得分:12)
枚举不应该在案例标签中被限定为NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
,而应取消资格并使用GUIDE_VIEW_SEVEN_DAY
答案 3 :(得分:5)
我喜欢Java枚举的一些用法:
枚举值参数:
enum StateEnum {
UNDEFINED_POLL ( 1 * 1000L, 4 * 1000L),
SUPPORT_POLL ( 1 * 1000L, 5 * 1000L),
FAST_POLL ( 2 * 1000L, 4 * 60 * 1000L),
NO_POLL ( 1 * 1000L, 6 * 1000L);
...
}
切换示例:
private void queuePoll(StateEnum se) {
// debug print se.name() if needed
switch (se) {
case UNDEFINED_POLL:
...
break;
case SUPPORT_POLL:
...
break;
答案 4 :(得分:3)
这应该按照您描述的方式工作。你遇到了什么错误?如果你可以粘贴你的代码,那将有所帮助。
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
编辑:您确定要定义静态枚举吗?这对我来说听起来不对。枚举与任何其他对象非常相似。如果您的代码编译并运行但结果不正确,这可能就是原因。答案 5 :(得分:2)
enumerations accessing is very simple in switch case
private TYPE currentView;
//declaration of enum
public enum TYPE {
FIRST, SECOND, THIRD
};
//handling in switch case
switch (getCurrentView())
{
case FIRST:
break;
case SECOND:
break;
case THIRD:
break;
}
//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
this.currentView = currentView;
}
public TYPE getCurrentView() {
return currentView;
}
//usage of setting the enum
setCurrentView(TYPE.FIRST);
avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always
答案 6 :(得分:1)
我这样做
public enum State
{
// Retrieving, // the MediaRetriever is retrieving music //
Stopped, // media player is stopped and not prepared to play
Preparing, // media player is preparing...
Playing, // playback active (media player ready!). (but the media player
// may actually be
// paused in this state if we don't have audio focus. But we
// stay in this state
// so that we know we have to resume playback once we get
// focus back)
Paused; // playback paused (media player ready!)
//public final static State[] vals = State.values();//copy the values(), calling values() clones the array
};
public State getState()
{
return mState;
}
并在Switch Statement中使用
switch (mService.getState())
{
case Stopped:
case Paused:
playPause.setBackgroundResource(R.drawable.selplay);
break;
case Preparing:
case Playing:
playPause.setBackgroundResource(R.drawable.selpause);
break;
}
答案 7 :(得分:1)
短关联函数示例:
public String getIcon(TipoNotificacao tipo)
{
switch (tipo){
case Comentou : return "fa fa-comments";
case ConviteEnviou : return "icon-envelope";
case ConviteAceitou : return "fa fa-bolt";
default: return "";
}
}
就像@Dhanushka所说,省略内部的限定符" switch"是关键。