2012-05-17 28 views
5

He intentado diferentes maneras de arreglar esto, pero no puedo solucionarlo. Estoy tratando de obtener el valor booleano de un objeto pasado dentro de este método de una casilla de verificación:Cómo obtener el valor booleano del objeto

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

me sale:

java.lang.ClassCastException: java.lang.String no puede ser echado a java.lang.Boolean

+1

Primero está asumiendo que newValue es de tipo Boolean. Puede usar instanceof para verificar el tipo de newValue. Si es un booleano, con autounboxing, no tiene ningún problema. Si es una cadena, puede comparar (ignorando mayúsculas y minúsculas) los valores "verdadero", "falso" y luego crear la representación booleana apropiada. – horbags

Respuesta

9

en lugar de moldear, puede hacer algo como

Boolean.parseBoolean(string); 
+0

también podría verificar por ejemplo de Boolean y instanceof String si necesita manejar cada caso ... pero no se ve así aquí –

+0

Esto solo requiere cadenas, no objetos – rsavchenko

+0

Y parece que solo está trabajando con cadenas, por lo que mi solución. – OmniOwl

4

Aquí hay parte del código fuente de la clase booleana en 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")); 
} 

Así como se puede ver, tiene que pasar una cadena con el valor de "verdad" para que el valor booleano para ser verdad. De lo contrario, es falso.

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

Desde el código que envió, y el resultado que está viendo, que no se ve como nuevoValor es un valor lógico. Entonces intenta lanzar a un booleano, pero no es uno, por lo que se produce el error.

No está claro lo que estás tratando de hacer. Lo ideal sería que newValue sea booleano. Si no puede hacer eso, esto debería funcionar:

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 
} 

Tenga en cuenta que esta solución no es realmente ideal, y es algo frágil. En algunos casos, eso está bien, pero probablemente sea mejor volver a evaluar las entradas de su método para que sean un poco más limpias. Si no puede, entonces el código anterior funcionará. Es realmente algo que solo usted puede decidir en el contexto de su solución.

1

Si sabe que su Preference es CheckBoxPreference, puede llamar al isChecked(). Devuelve un boolean, no un Boolean, pero probablemente sea lo suficientemente cerca.

Aquí hay algunos códigos del ejemplo 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; 
} 
Cuestiones relacionadas