我正在做一个简单的'tic tac toe'游戏,所以我有9个按钮。这9个按钮都是一样的 我在布局“on click”属性中设置的click侦听器,这样我就不必在代码中创建9个按钮来设置监听器。
我的问题是我必须删除所有的侦听器 当比赛获胜或并列时,从按钮开始。
有没有办法遍历所有按钮而不必实际创建9个按钮变量并将每个侦听器设置为null?
我的代码:
public void onClick(View v) {
Button b = (Button) v;
Integer tag = Integer.parseInt((String) b.getTag());
values[tag] = turnToPlay;
b.setText(turnToPlay);
b.setOnClickListener(null);
playerTurn.setText("Player " + turnToPlay + " turn");
if(isBoardFull()) {
playerWon.setText("Tie Game!!");
removeAllListeners()
}
if(turnToPlay.equalsIgnoreCase("X")) {
turnToPlay = "O";
}
else {
turnToPlay = "X";
}
}
答案 0 :(得分:5)
您可以使用此功能遍历视图树并删除所有侦听器:
public void removeListeners() {
View topView = getWindow().getDecorView();
traverseTree(topView);
}
private void traverseTree(View view) {
if(view instanceof ViewGroup) {
ViewGroup group = (ViewGroup)view;
for(int index = 0; index < group.
getChildCount(); index++) {
traverseTree(group.getChildAt(index));
}
}
else if (view instanceof Button) {
Button button = (Button)view;
button.setOnClickListener(null);
}
}
答案 1 :(得分:0)
你说过tic tac toe并且目前正在为所有按钮使用一个事件。这不会更合适,因为用户应该只在广场上点击一次。
View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.b1:
//...
break;
case R.id.b2:
break;
}
v.setOnClickListener(null);
}
};