2012-05-17 9 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 के प्रकार की जांच करने के लिए उदाहरण का उपयोग कर सकते हैं। यदि यह ऑटोऑनबॉक्सिंग के साथ एक बुलियन है, तो आपको कोई समस्या नहीं है। यदि यह एक स्ट्रिंग है, तो आप "सत्य", "झूठी" मानों के लिए (केस को अनदेखा कर सकते हैं) की तुलना कर सकते हैं, फिर उपयुक्त बूलियन प्रतिनिधित्व बना सकते हैं। – horbags

उत्तर

9

लिए डाली, तो आप

Boolean.parseBoolean(string); 
तरह कुछ कर सकते हैं
+0

आप भी बूलियन और instanceof स्ट्रिंग instanceof के लिए जांच कर सकता है अगर आप प्रत्येक मामले को संभालने के लिए की जरूरत है ... लेकिन है कि यहाँ की तरह लगती –

+0

यह केवल तार वस्तुओं – rsavchenko

+0

नहीं लेता है और वह है काफी केवल तार यह प्रतीत होता है के साथ काम है, इसलिए मेरी उपाय। – OmniOwl

4

जावा में बूलियन कक्षा के लिए यहां कुछ स्रोत कोड है।

// 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")); 
} 

तो जैसा कि आप देख सकते हैं, आप बूलियन मान के क्रम में "सही" के मूल्य के साथ एक स्ट्रिंग पारित करने के लिए सच हो की जरूरत है। अन्यथा यह झूठा है।

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 की तरह नहीं दिखता से एक बूलियन है। तो आप एक बूलियन में डालने की कोशिश करते हैं, लेकिन यह एक नहीं है, इसलिए त्रुटि होती है।

यह स्पष्ट नहीं है तुम क्या करने की कोशिश कर रहे हैं। आदर्श रूप से आप एक नया बूलियन बना देंगे। यदि आप ऐसा नहीं कर सकते हैं, तो यह काम करना चाहिए:

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; 
} 
संबंधित मुद्दे