2015-08-08 42 views
5

我想使用循環來設置單擊時每個按鈕的動作(因爲大多數按鈕將只返回它們的文本值),但是我收到一個錯誤,指出「變量'我'是從內部類訪問的,需要被聲明爲最終的「。我怎樣才能解決這個問題?使用循環設置按鈕onclicklistener

這裏是我得到

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

回答

7

您可以複製的i值到一個臨時最終變量 -

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

你正在創建一個anonymous classView.OnClickListener)爲每個按鈕,該類中的onClick()方法與方法getValuesPressed()有不同的範圍,因此它無法訪問本地變量i

該解決方案包含的鏈接內的上方設置:

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

因此引入最後一個變量進入循環就解決了錯誤:

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

你可以創建你自己的監聽器,是以位置作爲參數來解決您使用匿名內部類的事實。

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