2016-08-23 40 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