Я делаю простую игру "tic tac toe", поэтому у меня есть 9 кнопок. Эти 9 кнопок имеют то же самое на прослушивателе кликов, которое я установил в свойстве "на клик", так что мне не нужно создавать 9 кнопок в коде, чтобы установить прослушиватель.
Моя проблема в том, что я должен удалить всех слушателей с кнопок, когда игра выиграна или привязана.
Есть ли способ перебрать все кнопки без фактического создания 9 переменных кнопок и установки каждого слушателя на нуль?
Мой код:
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";
}
}
Вы можете использовать эту функцию для перемещения дерева просмотра и удаления всех прослушивателей:
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);
}
}
вы сказали, что tic tack 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);
}
};
Boolean
класса с именемprocessClick
или аналогичную. Когда игра выиграна или сыграна вничью, установите для нее значениеfalse
а методonClick(...)
игнорирует любые щелчки, пока она не будет сброшена в значениеtrue
.