内部类中的非final变量

时间:2013-02-22 15:58:47

标签: java android

我尝试动态创建一个ImageView,并且我希望将此imageView作为参数传递给侦听器中的方法。

            ImageView imageView1 = new ImageView(LookActivity.this);

            imageView1.setOnTouchListener(new OnTouchListener() {

                    @Override
                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        detectLocationAndShowPopUp(imageView1);
                        return true;
                    }
                })

但我接受了以下错误:
                                                                                                                                     不能在不同方法中定义的内部类中引用非final变量imageView1。

我不想将imageView声明为final。我怎样才能克服这个问题?

6 个答案:

答案 0 :(得分:9)

您可以制作imageView1的副本,然后在侦听器中使用副本:

ImageView imageView1 = new ImageView(LookActivity.this);
final ImageView imageView2 = imageView1;

imageView1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        detectLocationAndShowPopUp(imageView2);
        return true;
    }
});

Sam发表评论后,我将我的代码更改为:

ImageView imageView1 = new ImageView(LookActivity.this);

imageView1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        detectLocationAndShowPopUp((ImageView) view);
        return true;
    }
});

答案 1 :(得分:4)

由于这是Android,因此当您触摸它时,arg0将成为您的图像。使用:

detectLocationAndShowPopUp((ImageView) arg0);

答案 2 :(得分:2)

创建ImageView imageView1作为全局类变量。

在你正在做的事情中将其初始化,而不再声明它。

这样的东西
MyClass extends ...
{
....
ImageView imageView1;
.
.
.
.
.
myFucntion()
{
imageView1 = new ImageView(LookActivity.this);
}

}

答案 3 :(得分:2)

不要在方法中定义ImageView。使其成为在类定义

下声明的成员变量

答案 4 :(得分:2)

您使用的是匿名类,而不是内部类(如标题所示)。在匿名类中,您只能引用final“变量”。

如果您不想将final添加到imageView并且不想使用其他最终变量,则可以使用内部类:

public class YourActivity extends ... {
  public void yourMethod() {
    ImageView imageView1 = new ImageView(LookActivity.this);
    imageView1.setOnTouchListener(new MyListener(imageView1));
  }

  private class MyListener extends OnTouchListener {
    private ImageView imageView;

    public MyListener(ImageView iv) {
      this.imageView = iv;
    }

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
     detectLocationAndShowPopUp(imageView);
     return true;
    }
  }
}

答案 5 :(得分:1)

创意:使用另一个最终变量。

ImageView imageView1 = new ImageView(LookActivity.this);
final ImageView finalImageView = imageView1;
imageView1.setOnTouchListener(new OnTouchListener() {
  @Override
  public boolean onTouch(View arg0, MotionEvent arg1) {
    detectLocationAndShowPopUp(finalImageView);
    return true;
  }
})

理念二:使用ImageView的匿名子类,然后使用ImageView.this引用。

ImageView imageView1 = new ImageView(LookActivity.this) {{
  setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
      detectLocationAndShowPopUp(ImageView.this);
      return true;
    }
}};