2012-05-17 141 views
5

我尝试了不同的方法来解决这个问题,但我无法修复它。我试图让一个复选框的这种方法里面传递了一个对象的布尔值:如何从对象获取布尔值

public boolean onPreferenceChange(Preference preference, Object newValue) 
{ 
    final String key = preference.getKey(); 
    referenceKey=key; 
    Boolean changedValue=!(((Boolean)newValue).booleanValue()); //ClassCastException occurs here 
} 

我得到:

java.lang.ClassCastException:java.lang.String中不能相反,它铸造的转换为java.lang.Boolean的

+1

首先假设newValue是Boolean类型的。你可以使用instanceof来检查newValue的类型。如果它是一个布尔类型,使用autounboxing,你没有问题。如果它是一个字符串,则可以比较(忽略大小写)值“true”,“false”,然后创建适当的布尔表示形式。 – horbags

回答

9

,你可以这样做

Boolean.parseBoolean(string); 
+0

你也可以检查instanceof Boolean和instanceof String,如果你需要处理每种情况......但看起来不像这里 –

+0

这只需要字符串而不是对象 – rsavchenko

+0

而他几乎只用字符串工作,因此我的解。 – OmniOwl

4

下面是java中布尔类的一些源代码。

// Boolean Constructor for String types. 
public Boolean(String s) { 
    this(toBoolean(s)); 
} 
// parser. 
public static boolean parseBoolean(String s) { 
    return toBoolean(s); 
} 
// ... 
// Here's the source for toBoolean. 
// ... 
private static boolean toBoolean(String name) { 
    return ((name != null) && name.equalsIgnoreCase("true")); 
} 

因此,您可以看到,您需要传递一个值为“true”的字符串,以便布尔值为true。否则它是错误的。

assert new Boolean("ok") == false; 
assert new Boolean("True") == true; 
assert new Boolean("false") == false; 

assert Boolean.parseBoolean("ok") == false; 
assert Boolean.parseBoolean("True") == true; 
assert Boolean.parseBoolean("false") == false; 
2

从您发布的代码和您看到的结果看,它看起来不像newValue是一个布尔值。所以你尝试转换为布尔值,但它不是一个,所以发生错误。

目前尚不清楚你想要做什么。理想情况下,你会使newValue成为一个布尔值。如果你不能做到这一点,这应该工作:

boolean newValue; 
if (newValue instanceof Boolean) { 
    changedValue = newValue; // autoboxing handles this for you 
} else if (newValue instanceof String) { 
    changedValue = Boolean.parseBoolean(newValue); 
} else { 
    // handle other object types here, in a similar fashion to above 
} 

请注意,此解决方案不甚理想,有点脆弱。在某些情况下,这是可以的,但重新评估您的方法的输入可能会更好一些,这样可能会更好。如果你不能,那么上面的代码将工作。只有您可以根据您的解决方案来决定它。

1

如果您知道您的PreferenceCheckBoxPreference,那么您可以致电isChecked()。它返回一个boolean,而不是Boolean,但这可能足够接近。

以下是APIDemos Device Administration示例(DeviceAdminSample.java)中的一些代码。

private CheckBoxPreference mDisableCameraCheckbox; 

public void onResume() { 
    ... 
    mDPM.setCameraDisabled(mDeviceAdminSample, mDisableCameraCheckbox.isChecked()); 
    ... 
} 

public boolean onPreferenceChange(Preference preference, Object newValue) { 
... 
    boolean value = (Boolean) newValue; 
... 
    else if (preference == mDisableCameraCheckbox) { 
     mDPM.setCameraDisabled(mDeviceAdminSample, value); 
     reloadSummaries(); 
    } 
    return true; 
}