2015-08-08 17 views
5

Próbuję użyć pętli, aby ustawić akcję dla każdego przycisku po kliknięciu (ponieważ większość przycisków po prostu zwróci ich wartość tekstową), jednak otrzymuję komunikat o błędzie "zmienna "i" jest dostępne z poziomu wewnętrznej klasy, musi być uznane za ostateczne ". Jak mogę to obejść?Używanie pętli do ustawiania przycisków onclicklistener

Oto co mam

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

Odpowiedz

7

można skopiować wartość i w zmiennej końcowej 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 
       } 
      } 
     }); 
    } 
2

Ty tworzysz anonymous class (View.OnClickListener) dla każdego przycisku, Metoda onClick() w tej klasie ma inny zakres niż metoda getValuesPressed(), dlatego nie ma dostępu do lokalnej zmiennej i.

Roztwór znajduje się w linku podanego powyżej:

An anonymous class cannot access local variables in its enclosing scope that are not declared as final or effectively final.

Dlatego wprowadzenie ostatecznej zmienną do pętli byłoby rozwiązać ten błąd:

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; 
} 
1

Państwo mogli tworzyć własne słuchacza, który bierze pozycja jako parametr, aby obejść fakt, że używasz anonimowej klasy wewnętrznej.

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 
     } 
    } 
} 

Następnie w pętli można utworzyć ją tak

String getValuesPressed(){ 

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

    return textOnScreen; 
} 
Powiązane problemy