【问题标题】:access to variable within inner class in Android访问Android内部类中的变量
【发布时间】:2015-05-25 04:24:19
【问题描述】:

我正在尝试使用数据库中的数据生成一组按钮。但是点击后我面临以下错误

从内部类中访问变量“i”,需要声明为final,

由于 i 的值随着循环的进行而变化,我无法将其设置为最终值,

footnoteBtns[i].setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    footnote = myDbHelper.getFootnote(chapterNumber, translationList.get(i).get("transNo"));

                    Popup();
                }
            });

【问题讨论】:

  • 您是否将“setOnClickListener”放入循环中?
  • 是的,有问题吗?
  • 是的。你明白你在循环的每一步都重写了监听器吗?

标签: java android inner-classes anonymous-class


【解决方案1】:

您可以添加一个最终变量并设置为 i:

final int j = i;

然后在重写的 onClick 方法中使用那个。

您必须这样做的原因是 onClick 在另一个时间点被调用,而不是直接在 for 循环内部 -> 异步调用。因此,您需要确保在稍后调用的方法中应该使用哪个值是明确的。这就是为什么变量需要是最终的。

【讨论】:

    【解决方案2】:

    一般而言,将 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(); 
                    } 
                }); 
    }
    

    【讨论】:

      【解决方案3】:

      试试这个代替当前代码:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 2013-07-08
        • 2011-06-15
        • 1970-01-01
        相关资源
        最近更新 更多