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

Here's some of the source code for the Boolean class in 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"));
}

So as you can see, you need to pass a string with the value of "true" in order for the boolean value to be true. Otherwise it's 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;
于 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

が であることがわかっている場合Preferenceは、isChecked()CheckBoxPreferenceを呼び出すことができます。ではなく を返しますが、おそらく十分に近いでしょう。booleanBoolean

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 に答える