Нельзя ссылаться на не конечную переменную i внутри внутреннего класса, определенного другим способом

У меня есть «Не могу ссылаться на не конечную переменную 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 <=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"); } }); } } } 

}

В сообщении об ошибке указано, что не так: переменная 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"); } }); } } 

Из раздела 8.1.3 Спецификации языка Java :

Любой локальный переменный, параметр формального метода или параметр обработчика исключений, используемый, но не объявленный во внутреннем классе, должен быть объявлен окончательным. Любая локальная переменная, используемая, но не объявленная во внутреннем классе, должна быть определенно назначена (§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. Это должно работать (не проверено)

Intereting Posts
Просмотр фрагмента ViewPager's, потерянный при отображении родительского фрагмента ViewPager, затем отображается Почему дочерние представления наследуют альфа-значение от родительского макета Почему в ProcessAndroidResources отсутствует атрибут assetsDir? Является ли какая-нибудь функция быстрой, похожей на R.java в Android? Как отключить элемент ListView после его нажатия? Android – paint.setShadowLayer Игнорирование shadowColor Как уменьшить размер веб-виджета динамически в соответствии с его содержимым? Почему «BluetoothAdapter: startLeScan (): null» «произошел, когда BLE Scan в Android? Разрешения на запуск Android в режиме ожидания для Android 6.0 (API уровня 23) Вставить массив в базу данных SQLite в android Android 4+ html5 canvas не перерисовывается Android sqlite двунаправленная синхронизация sqlite Android Bluetooth Scan для классических и BTLE устройств Android: java.lang.NullPointerException в android.graphics.Canvas.drawLine (Canvas.java:809) (возможно, связано с моим ресурсом, который можно выделить) Просмотр с горизонтальным и вертикальным панорамированием / перетаскиванием и масштабированием