使用循环设置按钮onclicklistener

时间:2015-08-08 09:04:56

标签: android button onclick 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;
}

3 个答案:

答案 0 :(得分:9)

您可以将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 } } }); } 的值复制为临时最终变量 -

{{1}}

答案 1 :(得分:2)

您正在为每个按钮创建anonymous classView.OnClickListener),该类中的onClick()方法的范围与方法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; 
} 

答案 2 :(得分: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; 
}