Удаление по нажатию кнопки «Слушатель» со всех кнопок - PullRequest
1 голос
/ 02 сентября 2011

Я делаю простую игру «крестики-нолики», поэтому у меня 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";
    }    
}

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Вы можете использовать эту функцию для обхода дерева представлений и удаления всех слушателей:

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 голосов
/ 02 сентября 2011

Вы сказали «крестики-нолики» и в настоящее время используете одно событие для всех кнопок.не будет ли это более подходящим, поскольку предполагается, что пользователь щелкает квадрат только один раз.

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);         
    }
};
...