从所有按钮上删除单击侦听器?

时间:2011-09-01 23:49:54

标签: android onclick listener

我正在做一个简单的'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";
    }    
}

2 个答案:

答案 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);         
    }
};