我正在尝试使用循环来设置单击时每个按钮的操作(因为大多数按钮只会返回其文本值),但是我收到一条错误,指出“变量'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;
}
答案 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 class(View.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;
}