2012-03-04 73 views
4

我正在編寫一個Android應用程序,其中我有幾個按鈕放在網格中。我想設置每個按鈕的onclick方法,所以我寫了這個:我想引用在不同的方法中定義的內部類中的非最終變量

for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 
     button[i][j].setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       press(i, j); 
      } 
     }); 
    } 
} 

其中press(int i, int j)在其他地方實施。我得到錯誤,「不能引用一個非最終變量我在一個不同的方法中定義的內部類中」。

所以,現在我只是寫出來,這樣每個函數:

button[0][0].setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     press(0, 0); 
    } 
}); 

button[0][1].setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     press(0, 1); 
    } 
}); 

// more like this... 

這工作,但似乎很傻。有沒有更好的辦法?

+0

「用不同的方法定義「似乎不相關? – 2012-03-04 02:36:33

+0

add final int ii = i;和final int jj = j;在調用setOnClickListener之前 – 2012-03-04 07:47:10

回答

6

是的,試試這個:

for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 
     final int listenerI = i; 
     final int listenerJ = j; 
     button[i][j].setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       press(listenerI, listenerJ); 
      } 
     }); 
    } 
} 
2
for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 

     final int localI = i; 
     final int localJ = j; 

     button[localI][localJ].setOnClickListener(...); 
    } 
} 
4

您可以定義一個輔助方法來設置監聽器按鈕:

private static void setListenerForButton(Button button, final int i, final int j) { 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      press(i, j); 
     } 
    }); 
}  

,然後你可以使用它像這樣

for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 
     setListenerForButton(button[i][j], i, j); 
    } 
} 

這是更通用的解決方案的特例:定義額外的final int用於內部類的變量,並使用ij的值對它們進行初始化。在這種情況下,額外的final int變量是輔助函數的參數。

1

聲明Ĵ作爲全局變量的外部類

1

你可以用一個聽衆獲得通過:

package tayek.so9551773; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.*; 
import android.util.Log; 
public class So9551773 extends Activity { 
    void press(int i,int j) { 
     Log.d("so",i+","+j+" was clicked"); 
     System.out.println(i+","+j+" was clicked"); 
    } 
    void addButtons(TableLayout tableLayout) { 
     for(int i=0;i<buttons.length;i++) { 
      TableRow tableRow=new TableRow(this); 
      tableLayout.addView(tableRow); 
      for(int j=0;j<buttons[i].length;j++) { 
       buttons[i][j]=new Button(this); 
       tableRow.addView(buttons[i][j]); 
       buttons[i][j].setText(i+" "+j); 
       buttons[i][j].setId(i*buttons.length+j); 
       buttons[i][j].setOnClickListener(onClickListener); 
      } 
     } 
    } 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("so","created"); 
     TableLayout tableLayout=new TableLayout(this); 
     addButtons(tableLayout); 
     setContentView(tableLayout); 
    } 
    Button[][] buttons=new Button[3][3]; 
    OnClickListener onClickListener=new OnClickListener(){ 
     public void onClick(View v) { 
      int id=v.getId(); 
      press(id/buttons.length,id%buttons.length); 
     } 
    }; 
} 
相關問題