我尝试动态创建一个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。我怎样才能克服这个问题?
答案 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;
}
}};