2012-05-17 10 views
5

Próbowałem różnych sposobów, aby to naprawić, ale nie jestem w stanie tego naprawić. Próbuję uzyskać wartość logiczną danego Object przekazywane wewnątrz tej metody pole wyboru:Jak uzyskać wartość typu Boolean z obiektu

public boolean onPreferenceChange(Preference preference, Object newValue) 
{ 
    final String key = preference.getKey(); 
    referenceKey=key; 
    Boolean changedValue=!(((Boolean)newValue).booleanValue()); //ClassCastException occurs here 
} 

uzyskać:

java.lang.ClassCastException: java.lang.String mogą nie być oddanych do java.lang.Boolean

+1

Najpierw przyjmuje się, że nowa wartość jest typu Boolean. Możesz użyć instanceof, aby sprawdzić typ newValue. Jeśli jest to boolean, z autounboxingiem, nie masz problemu. Jeśli jest to ciąg znaków, możesz porównać (ignorując wielkość liter) wartości "true", "false", a następnie utworzyć odpowiednią reprezentację boolowską. – horbags

Odpowiedz

9

Zamiast rzucania go, można zrobić coś takiego

Boolean.parseBoolean(string); 
+0

można również sprawdzić instanceof Boolean i instanceof String, jeśli potrzebowałeś obsłużyć każdy przypadek ... ale tak nie wygląda tutaj –

+0

To bierze tylko ciągi nie obiekty – rsavchenko

+0

I on jest w zasadzie działa tylko z ciągami, jak mogłoby się wydawać, dlatego mój rozwiązanie. – OmniOwl

4

Oto niektóre z kodu źródłowego dla klasy Boolean w 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")); 
} 

Jak widać, należy przekazać ciąg o wartości "true", aby wartość boolowska była prawdziwa. W przeciwnym razie jest to fałsz.

2

Z opublikowanego kodu i wynik, który widzisz, nie wygląda na nową wartość boolean. Więc próbujesz rzutować na wartość logiczną, ale to nie jest jedna, więc błąd występuje.

Nie jest jasne, co próbujesz zrobić. Najlepiej byłoby, gdyby parametr newValue był wartością logiczną. Jeśli nie możesz tego zrobić, powinno to zadziałać:

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 
} 

Pamiętaj, że to rozwiązanie nie jest idealne i jest dość delikatne. W niektórych przypadkach jest to w porządku, ale prawdopodobnie lepiej jest ponownie ocenić dane wejściowe do swojej metody, aby były one trochę czystsze. Jeśli nie możesz, powyższy kod zadziała. To naprawdę coś, co tylko Ty możesz zdecydować w kontekście twojego rozwiązania.

1

Jeśli wiesz, że Twój Preference jest CheckBoxPreference, następnie możesz zadzwonić isChecked(). Zwraca ona boolean, a nie Boolean, ale prawdopodobnie jest wystarczająco blisko. To jest kod z próbki 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; 
} 
Powiązane problemy