不能在不同方法中定义的内部类中引用非final变量i

我有“不能在一个不同方法中定义的内部类中引用非最终变量”错误…我哪里出错了?…我刚开始学习android和java编程..

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 ** 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"); } }); } } } 

}

错误消息确切地说明了什么是错误的: i变量不是final,但是你试图在匿名内部类中引用它。

你可以这样做:

 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 ,然后我们可以在匿名内部类中使用它。 或者,如果您不关心arrays更改的可能性,您可以:

 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"); } }); } } 

从Java语言规范的8.1.3节 :

使用但未在内部类中声明的任何局部变量,forms方法参数或exception处理程序参数必须声明为final。 任何在内部类中使用但未声明的局部变量必须在内部类的主体之前明确赋值(第16节)。

你可以创建一个方法,如下所示:

 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循环中使用它。 这应该工作(未测试)