我在Android工作,尝试为10个按钮设置OnClickListeners。如果我在switch语句中写出每个按钮的动作,我可以让代码按照我想要的方式工作,但是每个按钮的微小变化都需要做很多工作。有没有办法使用循环来迭代交换机的情况?
下面的代码无法编译,“case i”的错误表示“case表达式必须是常量表达式”。
private OnClickListener buttonListener = new OnClickListener() {
@Override
public void onClick(final View v) {
for(int i = 0; i < 10; i++) {
switch(v.getId()) {
case i:
for(int j = 0; j < numberOfPlayers; j++) {
if(playersArray[j].isChecked()) {
playerScores[j] += i;
playersArray[j].setScore(Integer.toString(playerScores[i]));
}
}
}
}
}
};
这个代码是我试图避免做的,但仍然会编译并正确运行:
private OnClickListener buttonListener = new OnClickListener() {
@Override
public void onClick(final View v) {
switch(v.getId()) {
case 0:
for(int i = 0; i < numberOfPlayers; i++) {
if(playersArray[i].isChecked()) {
playerScores[i] += possibleValue[0];
playersArray[i].setScore(Integer.toString(playerScores[i]));
}
}
break;
case 1:
for(int i = 0; i < numberOfPlayers; i++) {
if(playersArray[i].isChecked()) {
playerScores[i] += possibleValue[1];
playersArray[i].setScore(Integer.toString(playerScores[i]));
}
}
break;
case ... :
}
}
};
答案 0 :(得分:1)
你可能想要:
private OnClickListener buttonListener = new OnClickListener() {
@Override
public void onClick(final View v) {
for(int i = 0; i < 10; i++) {
if (v.getId() == i) {
for(int j = 0; j < numberOfPlayers; j++) {
if(playersArray[j].isChecked()) {
playerScores[j] += i;
playersArray[j].setScore(Integer.toString(playerScores[i]));
}
}
}
}
}
};
或者,如果我理解你的逻辑,这种更直接的方法应该同样有效:
private OnClickListener buttonListener = new OnClickListener() {
@Override
public void onClick(final View v) {
int i = v.getId();
for(int j = 0; j < numberOfPlayers; j++) {
if(playersArray[j].isChecked()) {
playerScores[j] += i;
playersArray[j].setScore(Integer.toString(playerScores[i]));
}
}
}
};