Drawable == Drawable? - PullRequest
       14

Drawable == Drawable?

5 голосов
/ 12 декабря 2010

Это моя проблема ...:

В моей деятельности у меня есть ImageView и Button. Я хочу, чтобы кнопка выполняла действие ТОЛЬКО, когда ImageView отображает определенный рисунок. И да, это означает, что ImageView анимирует между различными рисованными объектами, которые закодированы так, что он не прерывает то, что я хочу сделать.

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
    }

Это не сработало. И я сузил его до ошибки строки "if (variabledrawable == acertaindrawable)". Хотя Eclipse явно не сообщает об ошибках, которые Android не может распознать, если две прорисовки одинаковы, я протестировал другие области кода и, похоже, все работает нормально.

Ответы [ 5 ]

8 голосов
/ 03 июня 2012

Я знаю, что уже довольно поздно, чтобы публиковать это, но это будет полезно для любого гуглящего.

Я использовал. getConstantState(), чтобы сравнить мои два drawables, и это работало как обаяние:)

3 голосов
/ 12 декабря 2010

Как пояснил Ицик, даже если обе переменные содержат ссылки на объекты, которые «выглядят» одинаково, они являются двумя разными экземплярами объектов.

Оператор == сравнивает ссылки. Он возвращает истину, только если обе переменные ссылаются на один и тот же экземпляр объекта, т.е. то же пространство памяти.

Ни Drawable, ни BitmapDrawable не реализуют конкретный метод .equals (), который можно было бы адаптировать для проверки того, что 2 экземпляра содержат одинаковые данные, поэтому подсказка Матиаса Линя попробовать .equals () не будет работать.

Что вы могли бы сделать, следуя совету Исика без необходимости расширять Drawable, это использовать методы View.setTag () и View.getTag (). Эти методы позволяют прикрепить любой объект по вашему выбору к представлению и получить его позже. Прикрепляя простой идентификатор (будь то технический целочисленный идентификатор или URL-адрес, определяющий источник растрового изображения) к вашему ImageView при каждом изменении его содержимого, вы сможете легко его распознать.

2 голосов
/ 12 декабря 2010

variabledrawable и acertaindrawable - это не один и тот же объект, даже если они могут отображать один и тот же объект рисования.

Если Android не предоставляет встроенный способ сравнения объектов рисования (я думаю, это зависитя могу советовать вам расширить класс Drawable, который вы используете, и добавить закрытое поле, содержащее некоторый идентификатор, чтобы вы могли сравнивать между ними.

2 голосов
/ 12 декабря 2010

Попробуйте if (acertaindrawable.equals(variabledrawable)) ...

1 голос
/ 11 августа 2011

вы также можете попробовать:

getId () и setId (): =)

также можно использовать для сравнения, если теги уже используются для чего-то другого:)

Ps .: но остерегайтесь , если вы используете RelativeLayouts ...: = P

...