2012-05-17 15 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のタイプをチェックすることができます。それがブール値で、オートナンバーボックスであれば、問題はありません。文字列の場合は、値「true」、「false」を比較(大文字と小文字を区別しない)してから、適切なブール表現を作成できます。 – horbags

答えて

9

の代わりにそれをキャストにキャスト、あなたは

Boolean.parseBoolean(string); 
のような何かを行うことができます
+0

それぞれのケースを処理する必要がある場合は、instanceof Booleanとinstanceof Stringもチェックできますが、ここではそのようには見えません –

+0

これはオブジェクトではなく文字列を取るだけです – rsavchenko

+0

そして、溶液。 – OmniOwl

4

javaのBooleanクラスのソースコードを次に示します。

// 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」の文字列を渡す必要があります。それ以外の場合はfalseです。あなたが投稿コード、およびあなたが見ている結果から

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; 
} 
関連する問題