我正在尝试使用ColorDrawable(int color)
。该类只有int
构造函数。
通常,您可以这样做:
ColorDrawable(0xFF8E8F8A)
但是因为我的颜色是字符串(6个十六进制数字,没有alpha),所以我必须这样做:
Long color = Long.parseLong("FF"+hexColorString, 16); // hexColorString like "8E8F8A"
ColorDrawable drawable = new ColorDrawable(color.intValue());
为什么Integer.parseInt("FF"+hexColorString, 16)
只返回一个否定(有效无符号)的int,而不是抛出NumberFormatException
?
为什么Long.parseLong("FF"+hexColorString, 16).intValue()
和Integer.parseInt("FF"+hexColorString, 16)
没有返回相同的值?前者有效,但后者给我一个例外。
编辑:无论如何我没有得到正确的颜色,所以我切换到以下方法:
ColorDrawable drawable = new ColorDrawable(Color.parseColor("#FF"+hexColorString));
答案 0 :(得分:3)
0xFF8E8F8A
的值为> Integer.MAX_VALUE
。
由于设计没有溢出或下溢引发Exception
,因此它会将您的值解释为Integer.MIN_VALUE
,因为Integer.MAX_VALUE + 1
会转移到Integer.MIN_VALUE
。
因此,Long.intValue
将将值转换为int
,其中Integer.MAX_VALUE + x
的值x > 0
将从Integer.MIN_VALUE
转移Integer.MIN_VALUE + x
,即Integer
。
但是,来自0xFF8E8F8A
javadoc:
如果有任何类型,则抛出NumberFormatException类型的异常 发生以下情况:
第一个参数为null或者是长度为零的字符串。 [...] 字符串表示的值不是int类型的值。
int
的值不属于NumberFormatException
,因此ColorDrawable
。
作为旁注,我非常确定int
构造函数需要R.color
,因为它需要一个id而不是颜色的数字表示,但说实话,文档不是&很清楚这一点。
请参阅new ColorDrawable(Color.parseColor(yourHexString))
文档here。
最后的注释 - 此信用额转入OP。
您可以使用{{1}}来获得更方便的方法。
答案 1 :(得分:1)
因为0xFF8E8F8A
超出整数范围。即0xFF8E8F8A
== 4287532938
,并且大于Integer.MAX_VALUE
。
假设0xFF8E8F8A
等于-7434358
(通过Long解析时获得的值)不正确,因为您可以解析负十六进制值:
Integer.parseInt("-717076", 16);
所以-0x717076
等于-7434358
,无符号表示为0xFF8E8F8A
。