gpt4 book ai didi

java - 为什么有时这不起作用?

转载 作者:太空狗 更新时间:2023-10-29 22:54:13 26 4
gpt4 key购买 nike

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

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

onCreate:

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

点击(v 是点击的按钮)

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

然后,稍后在 onClick 中,我通过执行以下操作检查用户是否点击了红色方 block :

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

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

最佳答案

首先,Resources.getDrawable(int)deprecated .它可能与您的问题无关,但您应该修复它。

如果您使用 == 比较位图,您就是在比较对象标识。如果 == 测试为您提供 false,则意味着您正在比较不同的对象。这是毫无疑问的。

您的 fragment 没有提供足够的上下文来确定,但这里有一些可能性:

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

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

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

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

  • 您可能会反复从 Resources 中获取位图。
  • 调用切换位图的方法可以是创建/设置副本。
  • 您为获取单击按钮的位图而调用的方法可能会返回一个副本。

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


那么解决方案是什么?

假设,如果您能找出导致使用不同位图对象的原因,您就有可能解决这个问题。但是,虽然您的代码仍然依赖于未指定 行为,但它有可能在其他手机上崩溃......

更好的解决方案是更改您的应用程序,以便不依赖于使用 == 来比较 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 方法中,使用 map 查找按钮的当前颜色,而不是尝试通过比较 Bitmap 对象来找出它。

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

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

关于java - 为什么有时这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com