2011-05-21 54 views
28

que tienen un ImageView para el que quería poner en práctica el OnClickListener. Pero cuando hago clic en la imagen, no pasa nada. Evento, el Logcat no muestra ningún error.de ImageView Android no funciona

que sigue es mi declaración de importación:

import android.view.View.OnClickListener; 

siguiente es mi código de diseño para la imagen:

<ImageView android:id="@+id/favorite_icon" 
    android:src="@drawable/small_star" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="top|right" android:paddingTop="63sp" 
    android:paddingRight="2sp" /> 

siguiente es el código en mi actividad que define el controlador de eventos para OnClickListener:

ImageView imgFavorite = (ImageView) findViewById(R.id.favorite_icon); 
imgFavorite.setClickable(true); 
imgFavorite.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i(SystemSettings.APP_TAG + " : " + HomeActivity.class.getName(), "Entered onClick method"); 
       Toast.makeText(v.getContext(), 
         "The favorite list would appear on clicking this icon", 
         Toast.LENGTH_LONG).show(); 
      } 
     }); 

Me falta algo. Cualquier ayuda sería apreciada.

Gracias de antemano.

+2

@mahendraliya: No use 'getApplicationContext()' aquí. Use 'WhateverYourActivityIs.this', sustituyendo en el nombre de su actividad por' WhateverYourActivityIs'. Además, a menudo es útil registrar algo en LogCat (por ejemplo, 'Log.w()') en lugar de confiar en un 'Toast' para este tipo de diagnóstico. – CommonsWare

+0

@CommonsWare: Como puede ver en la actualización, cambié "getApplicationContext()" a "HomeActivity.this" ... y agregué una declaración de registro. Todavía no funciona ... ¿Me falta algo específico de onClickListener? para trabajar con ImageView? –

+0

@mahendraliya: "¿Me falta algo específico para que onClickListener funcione con ImageView?" - No, debería funcionar bien. – CommonsWare

Respuesta

18

Ok,

Me las arreglé para resolver este complicado problema. La cosa era como si estuviera usando FrameLayout. No sé por qué, pero me vino a la mente que es posible que el icono se oculte detrás de otra vista.

He intentado poner el icono al final de mi diseño y ahora puedo ver el Toast y el Log.

Gracias a todos por tomarse el tiempo para resolver el problema .. seguramente era complicado ..

+2

Lo mismo aquí pero con RelativeLayout. Mover ImageView hasta el final, después de que la Vista que muestra el contenido principal de RelativeView resolvió el problema. Y establecer el ImageView como clicable no resultó ser necesario. – spaaarky21

+0

o puede usar suImageView.bringToFront() antes de configurar el onClickListener. – Houcine

+0

Esto funciona muy bien .. 'muchas gracias .. – Neela

3

Try pasando el contexto en lugar del contexto de aplicación (También puede agregar una declaración de registro para comprobar si el método onClick está vez se ha quedado):

imgFavorite.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("== My activity ===","OnClick is called"); 
      Toast.makeText(v.getContext(), // <- Line changed 
        "The favorite list would appear on clicking this icon", 
        Toast.LENGTH_LONG).show(); 
     } 
    }); 
+1

Intenté usar v.getContext() y agregar una declaración de registro. Pero ninguno muestra el registro ni la tostada. No entiendo dónde está el problema. –

34

puede probar esto y dime lo que pasa? ? :

ImageView imgFavorite = (ImageView) findViewById(R.id.favorite_icon); 
imgFavorite.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Toast.makeText(YourActivityName.this, 
       "The favorite list would appear on clicking this icon", 
       Toast.LENGTH_LONG).show(); 
    } 
}); 

o se debe añadir lo siguiente:

imgFavorite.setClickable(true); 
+0

Intenté este cambio, pero no parece funcionar ... –

+0

ver mi Editar @mahendraliya – Houcine

+1

Intenté usar imgFavorite.setClickable (true); pero esto también no resuelve el problema –

0

Para las clases internas para pasar la referencia de la actividad, por lo general crear una referencia de actividad en onCreate() y hacerlo como un miembro. Como las clases internas tienen acceso a los miembros de la clase principal, puede obtener su actividad y, por lo tanto, su contexto:

class MyClass extends Activity{ 
    private Activity thisActivity; 
    @Override 
protected void onCreate(Bundle savedInstanceState) { 
      thisActivity = this; 
    } 
} 

Espero que ayude.

+2

Las clases internas regulares ya tienen acceso a 'this'; no es necesario agregar un miembro de datos. – CommonsWare

+0

pero ¿no 'esto' en la clase interna señalaría el objeto de la clase interna inscribed el objeto de la clase exterior que lo encierra? ¿O estás diciendo que hay una manera a través de la cual puedes acceder a la instancia de outerclass usando esto en la clase interna? – anargund

+2

'MyClass.this' se refiere al' this' de una clase externa envolvente particular. – CommonsWare

1

tenía el mismo problema, gracias por la punta FrameLayout! que estaba usando dos imágenes superpuestas en una FrameLayout (el uno en la parte superior era una máscara alfa, para dar el efecto de las fronteras suaves)

puse en el xml android:clickable="true" para la imagen que quería lanzar el OnClickListener, y android:clickable="false" a la máscara alfa

0

Definí un OnClickListener para ImageView como un OnClickListener para un botón y parece estar funcionando bien. Esto es lo que tuve. Por favor, intente y avísenos si no funciona.

final ImageView imageview1 = (ImageView) findViewById(R.id.imageView1); 

imageview1.setOnClickListener(new Button.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
      Log.i("MyTag","Image button is pressed, visible in LogCat");; 
     } catch (Exception e) { 
      Log.e(TAG, e.toString()); 
     } 
    } 
}); 
2

Añadir androide: onclick = "ClickEvent" a la vista de la imagen.

<ImageView android:id="@+id/favorite_icon" 
    android:src="@drawable/small_star" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="top|right" android:paddingTop="63sp" 
    android:paddingRight="2sp" 
    android:onClick="clickEvent" /> 

En su actividad puede crear un método con el mismo nombre (ClickEvent (Ver v)), y eso es todo! Puede ver el registro y el texto de la tostada también.

public void clickEvent(View v) 
    { 
    Log.i(SystemSettings.APP_TAG + " : " + HomeActivity.class.getName(), "Entered onClick method"); 
    Toast.makeText(v.getContext(), 
      "The favorite list would appear on clicking this icon", 
      Toast.LENGTH_LONG).show(); 
    } 
2

Bueno mi solución era otra, o, digamos, el error fue:

simplemente tenía otra imageview con el mismo id en otro diseño xml de dos veces al encapsuled <included />, que fue encontrado antes de la una que quería reaccionar en el clic. Solución: Dar a uno de ellos Identificación del otro ...

0

Compruebe si otro punto de vista tiene la propiedad match_parent o fill_parent, esas propiedades puede cubrir su ImageView que ha mostrado en su RelativeLayout .Por cierto, la respuesta aceptada no funciona en mi caso.

1

En realidad acabo de utilizar imgView.bringToFront(); y me ayudó.

+0

No sé por qué, pero a mí me funciona! ¡Gracias! –

0

Lo mismo está sucediendo para mí.

La razón es: He usado una vista de lista con margen Superior para que los datos comiencen desde la parte inferior de la imagen, pero la vista de lista real se superpone en la imagen que no está visible. Entonces, incluso si hacemos clic en la imagen, la acción no se realiza. Para arreglar esto, he hecho que la vista de lista comience desde debajo de la imagen para que no se superponga en la imagen misma.