2010-12-12 13 views
5

Este es mi problema ...:dibujable == dibujable?

En mi actividad que tienen una ImageView y una Button. Quiero que el botón realice una acción ÚNICAMENTE cuando el ImageView muestra un cierto drawable. Y sí, esto significa que el ImageView está animando entre varios objetos descartables que está codificado de manera que no interrumpe con lo que quiero hacer.

ImageView imgview = (ImageView)findViewById(R.id.imgviewsid); 
Resources res = getResources(); 
Drawable acertaindrawable = res.getDrawable(R.drawable.thecertaindrawable); 
Drawable variabledrawable = imgview.getDrawable(); 

    if (variabledrawable == acertaindrawable) 
    { 
      //does something 
    } 

No funcionó. Y lo he reducido al fallo de la línea "if (variabledrawable == acertaindrawable)". Si bien Eclipse no informa descaradamente errores que Android no puede reconocer si dos documentos descartables son los mismos, he probado las otras áreas del código y todo parece funcionar bien.

Respuesta

3

Según lo explicado por Itsik, incluso si ambas variables contienen referencias a objetos que 'parecen' iguales, son 2 instancias de objetos diferentes.

El operador == compara las referencias. Devuelve verdadero solo si ambas variables se refieren a la misma instancia de objeto, es decir. el mismo espacio de memoria

Ni Drawable ni BitmapDrawable implementan un método .equals() específico que podría haberse adaptado para comprobar que 2 instancias contienen los mismos datos, por lo que Mathias Lin sugiere que intentar con .equals() no funcionará.

Lo que podría hacer, siguiendo los consejos de Itsik sin tener que extender Drawable, es usar los métodos View.setTag() y View.getTag(). Estos métodos permiten adjuntar cualquier Objeto de su elección a una Vista y recuperarlo más tarde. Al asociar un identificador simple (ya sea un identificador de entero técnico o una URL que define la fuente del mapa de bits) a su ImageView cada vez que cambie su contenido, podrá reconocerlo fácilmente.

+0

Solo la dirección que necesitaba, el uso de Tags definitivamente ha ayudado en lo que quiero lograr. ¡Gracias! – sneak14

2

Trate if (acertaindrawable.equals(variabledrawable)) ...

2

variabledrawable y acertaindrawable no son el mismo objeto, aunque se pueda mostrar la misma estirable.

Si android no le da una forma integrada de comparar los drawables (supongo que depende del drawable de concreto que tenga), mi consejo es que extienda la clase Drawable que está utilizando y agregue un privado campo que contiene algún tipo de ID para que pueda comparar entre dibujables.

1

también puede probar:

getId() y setId(): =)

también puede ser utilizado para comparación, si las etiquetas se utilizan ya para otra cosa :)

Sal .: pero cuidado si está usando RelativeLayouts ...: P =

8

Sé que es bastante tarde para publicar esto, pero será útil para cualquier persona que quiera buscar en Google.

Yo solía. getConstantState() para comparar mis dos diseños y funcionaba como un encanto :)