我有“不能在不同方法中定义的内部类中引用非最终变量”错误...我哪里出错了?...我刚开始学习android和java编程.. < / p>
public class Tictac extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button[] = new Button[9];
button[0]= (Button) findViewById(R.id.button1);
button[1] = (Button) findViewById(R.id.button2);
button[2] = (Button) findViewById(R.id.button3);
button[3] = (Button) findViewById(R.id.button4);
button[4] = (Button) findViewById(R.id.button5);
button[5] = (Button) findViewById(R.id.button6);
button[6] = (Button) findViewById(R.id.button7);
button[7] = (Button) findViewById(R.id.button8);
button[8] = (Button) findViewById(R.id.button9);
final TextView text = (TextView) findViewById(R.id.textView1);
final ImageView img[] = new ImageView[9];
img[0] = (ImageView) findViewById(R.id.img1);
img[1] = (ImageView) findViewById(R.id.img2);
img[2] = (ImageView) findViewById(R.id.img3);
img[3] = (ImageView) findViewById(R.id.img4);
img[4] = (ImageView) findViewById(R.id.img5);
img[5] = (ImageView) findViewById(R.id.img6);
img[6] = (ImageView) findViewById(R.id.img7);
img[7] = (ImageView) findViewById(R.id.img8);
img[8] = (ImageView) findViewById(R.id.img9);
final ImageView imSq[] = new ImageView[9];
imSq[0] = (ImageView) findViewById(R.id.imSq1);
imSq[1] = (ImageView) findViewById(R.id.imSq2);
imSq[2] = (ImageView) findViewById(R.id.imSq3);
imSq[3] = (ImageView) findViewById(R.id.imSq4);
imSq[4] = (ImageView) findViewById(R.id.imSq5);
imSq[5] = (ImageView) findViewById(R.id.imSq6);
imSq[6] = (ImageView) findViewById(R.id.imSq7);
imSq[7] = (ImageView) findViewById(R.id.imSq8);
imSq[8] = (ImageView) findViewById(R.id.imSq9);
for(int i =0;i <=8;i++){
if(i%2==0){
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
**HERE-->** img[i].setVisibility(2);
text.setText("COOL");
}
});
}
else{
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
**HERE-->** imSq[i].setVisibility(2);
text.setText("COOL");
}
});
}
}
}
}
答案 0 :(得分:11)
错误消息确切地说错了:i
变量不是最终的,但是你试图在匿名内部类中引用它。
你可以这样做:
for (int i = 0; i <= 8;i++) {
if (i % 2 == 0) {
final int j = i;
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
img[j].setVisibility(2);
text.setText("COOL");
}
});
}
}
在这里,我们获取变量i
的副本,并将其分配给最终变量j
,然后我们可以在匿名内部类中使用它。或者,如果您不关心数组更改的可能性,您可以这样做:
for (int i = 0; i <= 8;i++) {
if (i % 2 == 0) {
final ImageView imageView = img[i];
button[i].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
imageView.setVisibility(2);
text.setText("COOL");
}
});
}
}
来自section 8.1.3 of the Java Language Specification:
使用但未在内部类中声明的任何局部变量,形式方法参数或异常处理程序参数必须声明为final。必须在内部类的主体之前明确赋值(§16)使用但未在内部类中声明的任何局部变量。
答案 1 :(得分:0)
你可以创建一个方法,如:
private void method(final Button btn, final ImageView img) {
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
img.setVisibility(2);
text.setText("COOL");
}
});
}
并在你的for i循环中使用它。 这应该工作(未经测试)