4

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

            ImageView imageView1 = new ImageView(LookActivity.this);

            imageView1.setOnTouchListener(new OnTouchListener() {

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

但是我遇到了以下错误:
Cannot reference an non-final variable imageView1 inside an internal class defined in a different method。

我不想将 imageView 声明为最终的。我该如何克服这个问题?

4

6 回答 6

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;
    }
});
于 2013-02-22T16:01:15.687 回答
4

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

detectLocationAndShowPopUp((ImageView) arg0);
于 2013-02-22T16:02:08.503 回答
2

创建ImageView imageView1为全局类变量。

并在函数内部初始化它,而无需再次声明它。

就像是

MyClass extends ...
{
....
ImageView imageView1;
.
.
.
.
.
myFucntion()
{
imageView1 = new ImageView(LookActivity.this);
}

}
于 2013-02-22T16:01:09.020 回答
2

不要ImageView在方法中定义。使其成为在您的类定义下声明的成员变量

于 2013-02-22T16:01:29.407 回答
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;
    }
  }
}
于 2013-02-22T16:04:35.167 回答
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;
    }
}};
于 2013-02-22T16:04:56.383 回答