为什么这有时不起作用?

TL;DR 我有很多按钮,我正在交换它们的图像。出于某种原因,我的代码仅适用于某些手机,而不适用于其他手机。

我的应用使用以下代码来比较图像按钮上的图像:

onCreate:

redsquare = getResources().getDrawable(R.drawable.redsquare);
bitred = ((BitmapDrawable) redsquare).getBitmap();

onClick (v是单击的按钮)

ClickGround = v.getBackground(); //Get the background of button clicked
//the bitmap background of the button clicked
BitClick = ((BitmapDrawable) ClickGround).getBitmap(); 

然后,稍后在onClick中,我通过执行以下操作检查用户是否单击了redSquare:

if (BitClick == bitred) { //Make sure it is the red square that user clicked
}

我已经在我的模拟器和华为手机上进行了测试,它工作正常。当我在另一部手机(lg g3)上测试它时,if语句没有通过。为什么结果不同?图像是否以某种方式在我的手机中搞砸了?


答案 1

首先,已弃用。它可能与您的问题无关,但您应该解决它。Resources.getDrawable(int)

如果使用 来比较位图,则用于比较对象标识。如果测试给你,这意味着你正在比较不同的对象。这是毫无疑问的。====false

您的代码段没有提供足够的上下文来确定,但以下是一些可能性:

  1. 代码中的某些内容导致将不同的值分配给 。bitred

  2. 两个代码段中的标识符不表示相同的 Java 变量。bitred

  3. 您认为用作红色背景的“红色”位图将始终是一对象的假设是无效的。

假设您已经消除了 1。和 2.以上,并专注于3。怎么会这样?好吧,我们看不到相关的代码(你随机交换按钮图像),但我可以想到几种可能性:

  • 您可能正在重复获取位图。Resources
  • 您调用的切换位图的方法可能是创建/设置副本。
  • 为获取单击的按钮的位图而调用的方法可能返回副本。

由于上述每个操作都可能依赖于可能行为不同的API实现(因为javadoc允许这样做),因此应用程序的行为可能取决于平台。


那么解决方案是什么呢?

假设,如果您可以找出导致使用不同位图对象的原因,则可以解决它。但是,虽然您的代码仍然依赖于未指定的行为,但它在其他手机上存在中断的风险...

更好的解决方案是更改您的应用程序,以便不依赖于 using 来比较对象。例如:==Bitmap

  • 将标记与每个按钮相关联。

     button1.setTag("one");
     button2.setTag("two");
    
  • 创建一个从按钮的标记映射到该按钮的当前颜色的。HashMap是应用程序“模型”状态的一部分。HashMap

    Map colors = new HashMap();
    ...
    colors.put("one", "red");
    colors.put("two", "blue");
    
  • 更改按钮的图像位图时,请对地图进行相应的更新。

    // After swap the images of button1 and button2 ...
    String c1 = colors.get("one");
    String c2 = colors.get("two");
    colors.put("one", c2);
    colors.put("two", c1);
    
  • 在 onClick 方法中,使用地图查找按钮的当前颜色,而不是尝试通过比较对象来找出它。Bitmap

    if (colors.get(v.getTag()).equals("red")) {
        // it is red!
    }
    

(请注意,这与Biju Parvathy的建议很接近,但他没有明确说明如何处理按钮颜色/图像的变化。


答案 2

您可以,我正在对您的比较代码进行一些小的更改,以使其适用于所有设备。

Bitmap BitRed = ((BitmapDrawable)getResources().getDrawable(R.drawable.redsquare)).getBitmap();

Bitmap BitClick = ((BitmapDrawable) v.getBackground()).getBitmap();

if (BitClick.sameAs(BitRed)) 
{ 
    //Your Button with Red Square Clicked
}

有关详细信息,请参阅 SameAs 函数。希望这对您有所帮助。


推荐