Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检查背景图像_Android_Image_Background - Fatal编程技术网

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) {
        }