Использование цикла для установки кнопок onclicklistener

Я пытаюсь использовать цикл, чтобы установить действие для каждой кнопки при нажатии (так как большинство кнопок просто вернут свое текстовое значение), однако я получаю сообщение об ошибке, в котором «переменная« i »обращается изнутри внутреннего класса, требует Быть объявленным окончательным ». Как я могу обойти это?

Вот что я получил

String getValuesPressed(){ for(int i = 0; i < buttonList.length; i++){ buttonList[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(i == 0){//error occurs here //do stuff } } }); } return textOnScreen; } 

Вы можете скопировать значение i in в конечную переменную temp as –

 for (int i = 0; i < buttonList.length; i++) { final int finalI = i; buttonList[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (finalI == 0) {//error occurs here //do stuff } } }); } 

Вы создаете анонимный класс ( View.OnClickListener ) для каждой кнопки, метод getValuesPressed() внутри этого класса имеет разную область действия, чем метод getValuesPressed() , поэтому он не имеет доступа к локальной переменной i .

Решение содержится в приведенной выше ссылке:

Анонимный класс не может получить доступ к локальным переменным в своей охватывающей области, которые не объявлены окончательными или фактически окончательными.

Поэтому введение конечной переменной в цикл позволило бы устранить ошибку:

 String getValuesPressed(){ for(int i = 0; i < buttonList.length; i++){ final int j = i; buttonList[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(j == 0){//error occurs here //do stuff } } }); } return textOnScreen; } 

Вы можете создать свой собственный слушатель, который занимает позицию в качестве параметра, чтобы обойти тот факт, что вы используете анонимный внутренний класс.

 private class MyClickListener implements View.OnClickListener { int position; public MyClickListener (int position) { this.position = position; } @Override public void onClick(View v) { if(position == 0){ //do stuff } } } 

Затем в вашем цикле вы можете создать его так

 String getValuesPressed(){ for(int i = 0; i < buttonList.length; i++){ buttonList[i].setOnClickListener(new MyClickListener(i)); } return textOnScreen; } 
Intereting Posts
Плавная анимированная сворачивающаяся панель инструментов с поддержкой Android Design Library Как установить границу вокруг изображения в Android? Универсальное приложение в Android (телефон и планшет) Как разрешить это на Android Studio 3.0 Canary 1: Не удалось решить: com.google.android:android:2.3.1 Как использовать JNI с библиотекой AAR? Значок уведомлений выделен серым цветом Получение SQLite SUM в Java на Android Видео HTML5 не будет зацикливаться на устройствах Android Android & Maps v2: как мне получить местоположение пользователя? Полноэкранная кнопка Video внутри WebView не работает Эмулятор не запускает приложение OpenGL, сообщения которого «К сожалению, OpenGL ES 2.0 Basic остановлен» Импорт проекта android в Intellij IDEA / использование общих ресурсов API Jumblr дает плохой запрос при отправке изображения в Tumblr Скрыть / Показать панель действий более плавно? До сих пор требуется разрешение READ_GSERVICES для Карт Google?