我想有一个记忆我当前所在菜单的开关,然后检查按下了什么按钮,这样它就可以引导我去另一个活动。
目前我已经提出了这个问题,但由于某种原因,当我调试第二种情况时:case R.id.bt1
甚至没有达成。
我已经输入了变量类:public static int currentMenu = 0;
但是当我将其设置为1时,我的调试器变得非常奇怪。
任何人都可以弄清楚我可能做错了什么吗?
@Override
public void onClick(View view) {
int currentMenu = Variables.currentMenu;
switch (currentMenu) {
case 0:
switch (view.getId()) {
case R.id.bt1:
currentMenu = 1;
Variables.currentMenu = currentMenu;
checkMenu();
break;
case R.id.bt2:
currentMenu = 2;
Variables.currentMenu = currentMenu;
checkMenu();
break;
case R.id.bt3:
break;
}
case 1:
switch (view.getId()) {
case R.id.bt1:
currentMenu = 0;
Variables.currentMenu = currentMenu;
checkMenu();
break;
case R.id.bt2:
Intent adam = new Intent(Home.this, BattleScene.class);
startActivity(adam);
Variables.currentMenu = 0;
break;
case R.id.bt3:
break;
}
}
答案 0 :(得分:3)
直接答案:您错过了外部开关的中断。
但为什么会发生这种情况 - 导致真正的答案:不甚至尝试编写此类代码。
严重违反了Single Layer of Abstraction原则。
其效果明显:这样的代码在您关闭编辑器时会变成 spaghetti 代码。您甚至似乎尝试在“内部”时更改您在“外部”侧切换的变量的内容。令人难以置信。以消极的方式。
换句话说:你刚开始编写这段代码,但你无法正确理解。原因是因为你决定使用复杂的方式表达你的想法。
长话短说:使用开关来做出决定和驱动行为是“程序性”编程。处理此类事物的OOP方式:使用状态机器。而不是要求状态和切换它,调用对象上的方法。这些对象可能会返回您可以调用方法的其他对象。
答案 1 :(得分:1)
你的外switch
有一个堕落。就像你在内部switch
中所做的那样,你很可能希望在每个break
的末尾case
。
@Override
public void onClick(View view) {
int currentMenu = Variables.currentMenu;
switch (currentMenu) {
case 0:
switch (view.getId()) {
// omitted for readability
}
break; // <-- outer break
case 1:
switch (view.getId()) {
// omitted for readability
}
break; // <-- outer break
}