2016-08-23 32 views
1

最近,我一直在做一个简单的棋盘游戏android应用程序。这个游戏发生在7x7网格上,并且我为所有的方块都制作了按钮。如何通过循环设置众多onClick()?

这不是我第一次做这个,而且不仅仅是为了这些按钮而编排布局,而且还为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)ij的每个,而不是逐个输入或生成代码?

P.S.我在这里没有做太多活动,而且我也不知道如何有效地寻找我的问题类型,或者验证是否有任何问题实际上有我的答案。如果你发现有同样答案的任何问题,请告诉我。我虽然搜索了这个。

回答

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); 
    } 
} 
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)而不是匿名类。

+0

我不认为我做了很多的了解。你能写一个关于创建一个'新的MyButtonListener(i,j)'的短代码吗? – MetaData