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.
- Manipulación de bytecode de Android y java
- Android stackoverflow utilizando while loop
- Pasar una referencia en Java
- Cómo iniciar la pantalla de inicio mediante programación en Android
- Android PhoneGap Plugin, UI tabbar, redimensionar WebView
No quiero declarar la imagen como final. ¿Cómo puedo superar este problema?
- ¿Cuál es el propósito claro de SparseBooleanArray ??
- Java convertir la marca de tiempo UTC a DateTime local
- Android sherlock setDisplayHomeAsUpEnabled no funciona y cómo establecer destino personalizado?
- Chromium WebView no existe
- ArrayList a Array de cadenas en java
- Cómo cambiar dinámicamente el tamaño del texto en Android
- Cajón de navegación - El diseño del cajón no se puede instanciar
- No se puede encontrar la clase de símbolo onClickListener
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; } }};
- Barra de acción de estilo personalizado no funciona en android 4
- ¿Qué utilizar en lugar de getSupportActionBar () en la Biblioteca 22?