2010-12-12 46 views
5

Ceci est mon problème ...:drawable == drawable?

Dans mon activité, j'ai un ImageView et un Button. Je veux que le bouton effectue une action UNIQUEMENT lorsque le ImageView affiche un certain dessin. Et oui, cela signifie que le ImageView est l'animation entre différents drawables qui est codé de telle sorte qu'il n'interrompt pas avec ce que je veux faire.

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 
    } 

Cela n'a pas fonctionné. Et je l'ai réduit à la faute de la ligne "if (variabledrawable == acertaindrawable)". Bien qu'Eclipse ne signale pas de façon flagrante les erreurs que Android ne peut pas reconnaître si deux tirages sont identiques, j'ai testé les autres zones du code et tout semble fonctionner correctement.

Répondre

3

Comme expliqué par Itsik, même si les deux variables contiennent des références à des objets qui «semblent» identiques, ce sont 2 instances d'objets différents.

L'opérateur == compare les références. Il ne retourne true que si les deux variables se réfèrent à la même instance d'objet ie. le même espace de mémoire. Ni Drawable ni BitmapDrawable implémentent une méthode .equals() spécifique qui aurait pu être adaptée pour vérifier que 2 instances contiennent les mêmes données, donc l'indication Mathias Lin pour essayer .equals() ne fonctionnera pas. Ce que vous pourriez faire, en suivant les conseils d'Itsik sans avoir à étendre Drawable, c'est d'utiliser les méthodes View.setTag() et View.getTag(). Ces méthodes permettent d'attacher n'importe quel objet de votre choix à une vue et de l'extraire plus tard. En attachant un identifiant simple (que ce soit un identificateur d'entier technique ou une URL définissant la source du bitmap) à votre ImageView chaque fois que vous changez son contenu, vous serez capable de le reconnaître facilement.

+0

Juste la direction dont j'avais besoin, l'utilisation de Tags a certainement aidé dans ce que je veux réaliser. Merci! – sneak14

2

Essayez if (acertaindrawable.equals(variabledrawable)) ...

2

variabledrawable et acertaindrawable ne sont pas le même objet, même si elles affichent la même drawable. Si android ne vous donne pas un moyen intégré de comparer les drawables (je suppose que cela dépend de l'drawable concret que vous avez), mon conseil pour vous est d'étendre la classe Drawable que vous utilisez et ajouter un privé champ qui contient une sorte d'ID afin que vous puissiez comparer entre drawables.

1

vous pouvez aussi essayer:

getId() et setId(): =)

peut également être utilisé pour les balises sont si comparision déjà utilisé pour quelque chose d'autre :)

Ps .: mais attention si vous utilisez RelativeLayouts ...: P =

8

Je sais qu'il est assez tard pour publier ceci, mais ça sera utile pour quelqu'un qui googlerait.

J'ai utilisé. getConstantState() pour comparer mes deux drawables et cela a fonctionné comme un charme :)