在 Android 中访问内部 class 中的变量
access to variable within inner class in Android
我正在尝试使用数据库中的数据生成一组按钮。但是点击我面临以下错误
Variable 'i' is accessed from within the inner class, needs to be declared final,
由于 i 的值随着循环的进行而变化,我无法将其设置为最终值,
footnoteBtns[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(i).get("transNo"));
Popup();
}
});
您可以添加一个附加变量,它是最终的并设置为 i:
final int j = i;
然后在重写的 onClick 方法中使用那个。
您必须这样做的原因是,onClick 是在另一个时间点调用的,而不是直接在 for 循环内调用 -> 异步。因此,您需要确保清楚应该在稍后调用的方法中使用哪个值。这就是变量需要是最终变量的原因。
一般来说,将 setOnClickListener 放入循环中的方法很奇怪,但在您的情况下,您可以使用以下代码解决它:
for( int i = 0; i < N; i++) {
final int p = i;
footnoteBtns[p].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(p).get("transNo"));
popup();
}
});
}
试试这个代替当前代码:
class MyOnClickListener extends View.OnClickListener {
private int myi;
public MyOnClickListener(int i) {
myi = i;
}
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(myi).get("transNo"));
Popup();
}
};
footnoteBtns[i].setOnClickListener(new MyOnClickListener(i));
我正在尝试使用数据库中的数据生成一组按钮。但是点击我面临以下错误
Variable 'i' is accessed from within the inner class, needs to be declared final,
由于 i 的值随着循环的进行而变化,我无法将其设置为最终值,
footnoteBtns[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(i).get("transNo"));
Popup();
}
});
您可以添加一个附加变量,它是最终的并设置为 i:
final int j = i;
然后在重写的 onClick 方法中使用那个。
您必须这样做的原因是,onClick 是在另一个时间点调用的,而不是直接在 for 循环内调用 -> 异步。因此,您需要确保清楚应该在稍后调用的方法中使用哪个值。这就是变量需要是最终变量的原因。
一般来说,将 setOnClickListener 放入循环中的方法很奇怪,但在您的情况下,您可以使用以下代码解决它:
for( int i = 0; i < N; i++) {
final int p = i;
footnoteBtns[p].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(p).get("transNo"));
popup();
}
});
}
试试这个代替当前代码:
class MyOnClickListener extends View.OnClickListener {
private int myi;
public MyOnClickListener(int i) {
myi = i;
}
@Override
public void onClick(View v) {
footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(myi).get("transNo"));
Popup();
}
};
footnoteBtns[i].setOnClickListener(new MyOnClickListener(i));