6

我尝试了不同的方法来解决这个问题,但我无法解决它。我正在尝试获取在复选框的此方法中传递的对象的布尔值:

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

4

4 回答 4

9

而不是铸造它,你可以做类似的事情

 Boolean.parseBoolean(string);
于 2012-05-17T20:04:45.000 回答
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”的字符串,以使布尔值为真。否则是假的。

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;
于 2012-05-17T20:11:46.020 回答
3

从您发布的代码和您看到的结果来看,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
}

请注意,此解决方案并不理想,而且有些脆弱。在某些情况下这没问题,但最好重新评估方法的输入以使它们更清晰。如果你不能,那么上面的代码将起作用。这实际上只有您可以在解决方案的上下文中决定。

于 2012-05-17T20:15:48.630 回答
1

如果你知道你的Preferenceis a CheckBoxPreference,那么你可以调用isChecked()。它返回 a boolean,而不是 a Boolean,但这可能已经足够接近了。

以下是APIDemos 设备管理示例 (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;
}
于 2012-05-17T20:18:17.390 回答