2015-08-08 68 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; 
} 
创建