2014-01-22 18 views
1

У меня есть несколько кнопок в приложении, которые могут иметь разные фоновые изображения. Теперь, в функции OnClick, мне нужно проверить, является ли фоновое изображение именем изображения «williboese» в drawable.Как проверить фоновое изображение

Я пытался так:

b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      //b.setBackgroundColor(R.color.redwue); 
      count++; 
      if(arg0.getResources().equals(R.drawable.williboese)){ 
       Toast.makeText(MainActivity.this, "heeeee", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

Я знаю, что в этот момент b имеет это фоновое изображение, но Toast не правда показано на рисунке. Что я делаю неправильно?

+1

При установке ресурса установить метку для кнопки и проверьте тег вместо – Triode

ответ

0

Вероятно, самый простой способ сделать это состоит в использовании тегов, как этот:

btn.setTag(R.drawable.williboese); 

затем сравнить с

view.getTag().equals(R.drawable.williboese); 

потому R.drawable примитивный, этот код не будет работать точно но вы получите идею ...

Что не так с вашим кодом, так это то, что вы сравниваете идентификатор ресурса с возможностью рисования с объектом «ресурсы» представления. Вы можете попробовать:

arg0.getResources().getDrawable(R.drawable.williboese).equals(arg0.getBackground()) 
+0

вы не можете сравнить GetResources(). GetDrawable() с другой вытяжкой , так как getDrawable получает объект с возможностью рисования для данного ресурса, но это не всегда один и тот же объект. Даже если контент один и тот же, возможно, экземпляр будет другим. Drawable наследует непосредственно от Object, и у него нет специальной реализации метода equals, поэтому сравнения выполняются ссылкой, и это не будет ожидаемым поведением. –

+2

вы правы, что drawable не реализует equals, однако ресурсы используют метод кэширования для drawables, поэтому возвращаемый объект для сравнения может быть не таким же, если кеш был очищен. Я не тестировал. Однако кэширование ресурсов использует WeakReference, и в то время как объект кнопки использует ссылку на исходный чертеж, выталкиваемый не должен перерабатываться, а сравнение должно быть действительным для срока службы объекта и описанного простого случая, но полная степень кода не доступен ... – Jim

+0

i +1 в вашем комментарии, так как у него есть хорошая информация. В любом случае, я бы не полагался на это, потому что мы не можем быть абсолютно уверены в этом, и я думаю, что это также не тот подход к лучшей производительности. Я бы предпочел бы, чтобы setTag aproach :) –

1

Здесь вы пытаетесь сравнить Resources с int, который никогда не будет true ...

и этот трюк может помочь вам ..

При установке идентификатор ресурса фон , установите этот идентификатор как тег для View.

b.setBackgroundResource(R.drawable.williboese); 
b.setTag(R.drawable.williboese); 

и OnClickListener вы можете проверить что текущий фон рисует ...

b.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View view) { 
     int resId = (Integer) view.getTag(); 
     if(resId == R.drawable.williboese) { 
      // background is R.drawable.williboese image 
     } 
    } 
}); 
1

GetResources оленьей кожи вернуть то, что вы думаете, как вы можете видеть в источнике функции

private final Resources mResources; 

public View(Context context) { 
    mContext = context; 
    mResources = context != null ? context.getResources() : null; 
    ... 
} 

public Resources getResources() { 
    return mResources; 
} 

он просто возвращает то же самое, что и context.getResources(), который является неприемлемым для доступа к ресурсам в приложении.

Вы не можете получить идентификатор фона представления. Вам придется сохранить его в другом месте. Для этого вы можете использовать функцию setTag для представления, где вы можете сохранить все, что вы можете получить позже. http://developer.android.com/reference/android/view/View.html#setTag(java.lang.Object)

b.setBackgroundResource(R.drawable.williboese); 
b.setTag(R.drawable.williboese); 

, а затем в слушателе сравнить

 Integer i = (Integer) view.getTag(); 

     if(i!= null && i == R.drawable.williboese) { 
     } 
Смежные вопросы