当前位置:  开发笔记 > 编程语言 > 正文

为什么这有时不起作用?

如何解决《为什么这有时不起作用?》经验,为你挑选了2个好方法。

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

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

你的片段没有足够的背景来确定,但这里有一些可能性:

    代码中的某些内容导致分配不同的值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所暗示的相近,但他没有明确说明如何处理按钮颜色/图像的变化.)



1> Stephen C..:

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

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

你的片段没有足够的背景来确定,但这里有一些可能性:

    代码中的某些内容导致分配不同的值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所暗示的相近,但他没有明确说明如何处理按钮颜色/图像的变化.)



2> Let'sRefacto..:

你可以,我在比较代码中进行了一些小改动,使其适用于所有设备.

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函数.希望这对你有所帮助.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有