Удаление по нажатию кнопки «Слушатель» со всех кнопок?

1

Я делаю простую игру "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";
    }    
}
  • 0
    Вы можете опубликовать код, который вы используете для вашего текущего clickListener?
  • 0
    @mario: Вы всегда можете просто использовать переменную Boolean класса с именем processClick или аналогичную. Когда игра выиграна или сыграна вничью, установите для нее значение false а метод onClick(...) игнорирует любые щелчки, пока она не будет сброшена в значение true .
Показать ещё 2 комментария
Теги:
onclick
listener

2 ответа

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);
        }
    }
  • 0
    круто спасибо, я сделаю это!
0

вы сказали, что 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);         
    }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню