这是 for 循环。 问题:我需要在按钮数组上获取一个监听器,并根据数组编号将按钮添加到具有相同编号的textview
数组。
问题是,我无法将int i
提供给public void方法。如果我将它声明为主类,那么应用程序就会失败。当我将i
值更改为某个实数时,它可以正常工作。所以我发现问题是 - onClick 方法正在接收null
而不是i
。
for(int i=0; i<n;i++){
btninput.get(i).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
converswindow.get(i).append(Html.fromHtml("<b>Вы:</b> "+msginput.get(i).getText()+"<br />"));
msginput.get(i).setText("");
}
});
}
答案 0 :(得分:2)
我不确定这是否有效,但请尝试:
for(int i=0; i<n; i++) {
final int j = i;
btninput.get(i).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
converswindow.get(j).append(Html.fromHtml("<b>Вы:</b> "+msginput.get(i).getText()+"<br />"));
msginput.get(j).setText("");
}
});
}
如果这不起作用,您可以使用Android的View标记机制将数据添加到按钮。阅读View.setTag(...)
和View.getTag(...)
了解更多信息。
答案 1 :(得分:1)
匿名类无法访问其方法中的本地变量,您需要将它们作为对象的实例变量(这里我使用ind
进行了实现)
for(int i=0; i<n;i++){
btninput.get(i).setOnClickListener(new OnClickListener() {
int ind=i;//here keep a copy of the local var
@Override
public void onClick(View v) {
converswindow.get(ind).append(Html.fromHtml("<b>Вы:</b> "+msginput.get(ind).getText()+"<br />"));
msginput.get(ind).setText("");
}
});
}
答案 2 :(得分:0)
尝试使用
public void onClick(View v) {
converswindow.get(btninput.indexOf(v)).append(Html.fromHtml("<b>Вы:</b> "+msginput.get(btninput.indexOf(v).getText()+"<br />"));
msginput.get(btninput.indexOf(v)).setText("");
答案 3 :(得分:0)
或者您可以创建自定义OnClickListener
并为其提供一个接收int
的构造函数:
public class CustomListener implements OnClickListener {
int i;
CustomListener(int i) {
this.i = i;
}
@Override
public void onClick(View v) {
converswindow.get(j).append(Html.fromHtml("<b>Вы:</b>"+msginput.get(i).getText()+"<br />"));
msginput.get(j).setText("");
}
}
然后你可以这样称呼它:
btninput.get(i).setOnClickListener(new CustomListener(i));