【问题标题】:public void method in for loop; can't recieve loop variablefor 循环中的公共 void 方法;无法接收循环变量
【发布时间】:2011-09-03 23:03:26
【问题描述】:

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

【问题讨论】:

    标签: java android loops void


    【解决方案1】:

    我不确定这是否可行,但请尝试:

    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(...) 了解更多信息。

    【讨论】:

    • 呵呵,没想到这样的解决方案。看起来很奇怪,但它正在工作。
    【解决方案2】:

    匿名类无法在其方法中访问本地变量,您需要将它们设为对象的实例变量(这里我使用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("");
                }
           });
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用

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

      【讨论】:

        【解决方案4】:

        或者你可以创建一个自定义的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));
        

        【讨论】:

          猜你喜欢
          • 2015-05-22
          • 1970-01-01
          • 2018-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 2023-03-04
          相关资源
          最近更新 更多