Variable no final dentro de una clase interna

Intento crear dinámicamente un ImageView y quiero pasar esta imageView como parámetro a un método en el oyente.

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

Pero estoy tomando el siguiente error:
No se puede hacer referencia a una variable no final imageView1 dentro de una clase interna definida en un método diferente.

No quiero declarar la imagen como final. ¿Cómo puedo superar este problema?

Puede hacer una copia de imageView1 y luego usar la copia dentro del listener:

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

Después del comentario de Sam cambio mi código a:

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

Ya que es Android, arg0 será tu imagen cuando la toques. Utilizar:

 detectLocationAndShowPopUp((ImageView) arg0); 

Crear ImageView imageView1 como una variable de clase global.

Y lo inicializa dentro de la función como lo está haciendo, sin declararlo de nuevo.

Algo como

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

No defina ImageView en un método. Hacer una variable miembro declarada bajo la definición de su clase

Estás usando una clase anónima y no una clase interna (como dice el título). En las clases anónimas sólo puede referirse a las "variables" final .

Si no quieres agregar final a imageView y no quieres usar otra variable final, puedes usar una clase interna:

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

Idea uno : Utilice otra variable final.

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

Idea dos : Utilice una subclase anónima de ImageView, a continuación, utilice la referencia ImageView.this .

 ImageView imageView1 = new ImageView(LookActivity.this) {{ setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { detectLocationAndShowPopUp(ImageView.this); return true; } }}; 
  • Fuga de memoria de Android?
  • Necesita hacer doble clic en EditText para que el oyente de clics responda
  • No se puede convertir de android.support.v4.app.Fragment a android.app.Fragment
  • Java.util.ConcurrentModificationException en las pruebas de JUnit
  • Adición de la vista de desplazamiento al diseño lineal dinámicamente
  • ViewPager java.lang.OutOfMemoryError: el tamaño de mapa de bits supera el presupuesto de VM
  • Diferencia entre res / color y res / values ​​/ colors.xml en la carpeta de recursos de Android
  • Si un servicio vinculado o hilos personalizados cuando descarga algo?
  • LibGDX - La aplicación se bloquea cuando llama a TiledMapRenderer.render ()
  • Seleccionador de color de Android: actualizando la matriz de colores
  • Cómo configurar el gestor de Android SDK con calcetines?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.