最近,我一直在制作一个简单的棋盘游戏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。我在这里做了很多活动,我不知道如何有效地查找我的问题类型,或者验证是否有任何问题确实有我的答案。如果您发现有相同答案的任何问题,请告诉我。我确实搜索了这个。
答案 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);
}
}