2012-05-17 101 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; 
}