Android 如何检查背景图像
我的应用程序中有几个按钮可以有不同的背景图像。 现在,在Android 如何检查背景图像,android,image,background,Android,Image,Background,我的应用程序中有几个按钮可以有不同的背景图像。 现在,在OnClick函数中,我需要检查背景图像是否是drawable中的图像名称“williboese” 我试着这样做: b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //b.setBackgroundColor(R.color.redwue)
OnClick
函数中,我需要检查背景图像是否是drawable中的图像名称“williboese”
我试着这样做:
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
有这个背景图像,但是没有显示祝酒词。我做错了什么?最简单的方法可能是使用如下标签:
btn.setTag(R.drawable.williboese);
然后与
view.getTag().equals(R.drawable.williboese);
因为R.drawable是一个原语,所以这段代码不能完全正常工作,但您知道
代码的错误在于,您正在将可绘制对象的资源ID与视图的“资源”对象进行比较。你可以试试:
arg0.getResources().getDrawable(R.drawable.williboese).equals(arg0.getBackground())
在这里,您试图将
资源
与int
进行比较,这将永远不会是真的
这个把戏可能会对你有帮助
设置后台资源id时,将该id设置为视图的标记
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
}
}
});
getResources不会返回您所想的,正如您在函数源代码中看到的那样
private final Resources mResources;
public View(Context context) {
mContext = context;
mResources = context != null ? context.getResources() : null;
...
}
public Resources getResources() {
return mResources;
}
它只返回与context.getResources()相同的内容,后者是访问应用程序中资源的对象
无法检索视图背景的id。你必须把它保存在别处。为此,您可以使用视图的setTag函数,在该函数中可以保存以后可以检索的任何内容
然后在侦听器中进行比较
Integer i = (Integer) view.getTag();
if(i!= null && i == R.drawable.williboese) {
}
设置资源时,请为按钮设置标记并检查标记,否则无法将getResources().getDrawable()与其他drawable进行比较,因为getDrawable为给定资源获取一个drawable对象,但它并不总是同一个对象。即使内容相同,实例也可能不同。Drawable直接从Object继承,并且它没有equals方法的自定义实现,因此比较是通过引用进行的,这不是预期的行为。Drawable没有实现equals是对的,但是,资源使用一种缓存方法来缓存可绘制文件,因此,如果清除缓存,则为比较返回的对象可能不同。我还没有测试。但是,资源缓存使用WeakReference,当button对象使用对原始可绘制文件的引用时,可绘制文件不应循环使用,并且该比较应在对象的生命周期内和所描述的简单情况下有效,但完整的代码范围不可用…注释中的i+1,因为它具有良好的信息。无论如何,我不会依赖于这一点,因为这不是我们可以完全确定的,而且我猜这也不是性能最好的方法。我当然更喜欢setTag aproach:)
Integer i = (Integer) view.getTag();
if(i!= null && i == R.drawable.williboese) {
}