for循环中的public void方法;无法接收循环变量

时间:2011-05-28 14:00:50

标签: java android loops void

这是 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("");
         }
     });
 }

4 个答案:

答案 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));