如何通过循环设置多个onClick()?

时间:2016-08-23 15:25:25

标签: android button

最近,我一直在制作一个简单的棋盘游戏Android应用程序。这个游戏是在7x7网格上进行的,我为所有正方形制作了按钮。

这不是我第一次这样做,不仅制作布局而且为每个按钮编写onClick()都很辛苦。由于矩阵数组(int state[7][7]Button board[][]=new Button[7][7]),我可以将所有49个代码推送到一个函数中,但写得像

board[0][0]=(Button)findViewById(R.id.board00);
board[0][1]=(Button)findViewById(R.id.board01);
int i;
for(i=0;i<2;i++){
  board[0][i].setOnClickListener(new OnClickListener() {
    public void onClick(View v){
      my_function(0,i);
  }
}

(我不得不写一些完整的代码,因为上次我省略了部分代码,每个人都在说我错过了那部分。)

将使所有按钮都集中在生成的i上,而不是它最初用于的数字。 (我知道那部分,不要只是告诉我“那不行,因为〜”。)

所以,我的问题是:有没有办法让[i][j]按钮为my_function(i,j)和{{1}的每个调用i而不是逐个输入或生成代码?

P.S。我在这里做了很多活动,我不知道如何有效地查找我的问题类型,或者验证是否有任何问题确实有我的答案。如果您发现有相同答案的任何问题,请告诉我。我确实搜索了这个。

2 个答案:

答案 0 :(得分:1)

不要使用匿名类。做一个完整的课程。然后它可以有一个你可以调用的构造函数并传入参数。例如

private static class MyButtonListener implements OnClickListener {
    int i;
    int j;
    public MyButtonListener(int i, int j) {
        this.i = i;
        this.j = j;
    }
    public void onClick(View v){
      my_function(i, j);
    }
}

然后在你的循环中,创建一个new MyButtonListener(i,j)而不是一个匿名类。

答案 1 :(得分:1)

如果你想保留匿名课程,那么这应该有效

for (int i = 0; i < 7; i++) {
  for (int j = 0; j < 7; j++){
  final int ii = i;
  final int jj = j;
  board[j][i].setOnClickListener(new OnClickListener() {
    public void onClick(View v){
      my_function(ii, jj);
  }
}