- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的应用使用以下代码来比较图像按钮上的图像:
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 没有提供足够的上下文来确定,但这里有一些可能性:
您的代码中的某些内容导致将不同的值分配给 bitred
。
两段代码中的 bitred
标识符不表示相同的 Java 变量。
您假设用作红色背景的“红色”位图将始终是相同对象是无效的。
假设您已经消除了上面的 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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!