【问题标题】:How to check background image如何检查背景图像
【发布时间】:2016-01-01 16:29:30
【问题描述】:

我的应用程序中有几个按钮可以有不同的背景图像。 现在,在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 有这个背景图片,但没有显示 Toast。我做错了什么?

【问题讨论】:

  • 设置资源时为按钮设置标签并检查标签

标签: android image background


【解决方案1】:

可能最简单的方法是使用这样的标签:

btn.setTag(R.drawable.williboese);

然后比较

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

因为 R.drawable 是一个原语,所以这段代码不能完全正常工作,但你明白了......

您的代码有什么问题是您将可绘制对象的资源 ID 与视图的“资源”对象进行比较。你可以试试:

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

【讨论】:

  • 您不能将 getResources().getDrawable() 与其他可绘制对象进行比较,因为 getDrawable 获取给定资源的可绘制对象,但它并不总是同一个对象。即使内容相同,实例也可能是不同的。 Drawable 直接继承自 Object,并且它没有自定义 equals 方法的实现,所以比较是通过引用进行的,这不会是预期的行为。
  • 你说得对,drawable 没有实现equals,但是Resources 使用了drawable 的缓存方法,所以如果缓存被清除,返回的比较对象可能不一样。我没有测试过。但是,资源缓存使用 Wea​​kReference,并且当按钮对象使用对原始可绘制对象的引用时,可绘制对象不应回收,并且比较应该在对象的生命周期和所描述的简单案例中有效,但代码的全部范围不可用...
  • i +1 在您的评论中,因为它有很好的信息。无论如何,我不会依赖这个,因为我们不能完全确定,而且我想也不是性能最好的方法。我肯定更喜欢 setTag 方法:)
【解决方案2】:

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 函数,您可以在其中保存以后可以检索的任何内容。 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) {
        }

【讨论】:

    【解决方案3】:

    您在这里尝试将Resourcesint 进行比较,后者永远不会是true...

    这个技巧可能会对你有所帮助..

    设置后台资源ID时,将该ID设置为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
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多