2017-02-09 21 views
1

Я устанавливаю метод onClick программно или в файл xml, я не знаю, как я могу передать через него дополнительные параметры. В следующем коде:Как я могу позволить 6 кнопкам вызывать один и тот же метод с разными параметрами в Android?

for (int i = 0; i < 6; i++) { 
     rollView[i].setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       changeKeepRoll(i); 
      } 
     }); 
    } 

Я Установка onClickListener для 6 различных TextView с и я хочу, чтобы вызвать метод changeKeepRoll, который принимает целочисленный параметр в качестве входных данных, но я получаю ошибку «Variable„я“ доступ изнутри внутреннего класса, должен быть объявлен окончательным ». Что это значит и как я могу это исправить?

ответ

2
for (int i = 0; i < 6; i++) { 
     final int temp = i; 
     rollView[i].setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      changeKeepRoll(temp); 
     } 
    }); 
    } 
+1

У Java есть правило: если вы используете анонимный внутренний класс для создания объекта, любая переменная, используемая внутри, должна быть либо объявлена ​​внутри этого блока, либо если вы хотите использовать переменную извне блока, объект должен быть окончательный или эффективный окончательный (java 8) – Kushan

1

Реализовать класс OnClickListener и перегрузить метод с различными наборами параметров

public class myClass implements View.OnClickListener { 
int changeKeepRoll; 
    @Override 
    public void onClick(View v) { 

    } 

    public void onClick(int i) { 

    } 
} 

сделать переменную changeKeepRoll за рамки вашего метода или сделать его окончательным.

1

Вы можете передать параметры OnClickListener путем реализации интерфейса:

class MyOnClickListener implements OnClickListener { 

    private int i; 

    public MyOnClickListener(int i) { 
     this.i = i; 
    } 

    public void onClick(View view) { 
     changeKeepRoll(i); 
    } 
} 

И, ваш for цикл будет выглядеть следующим образом:

for(int i = 0; i < rollView.length; i ++) { 
    rollView[i].setOnClickListener(new MyOnClickListener(i)); 
} 

Это было предложено до: How to pass parameters to OnClickListener?

Надеюсь, это поможет, Bala

+0

@Thomas Doyle Этот ответ - лучшая практика ... Мой ответ - это взломать, чтобы обмануть компилятор, я просто хотел помочь вам не слишком сильно изменить ваш код;) – Kushan