studio programacion herramientas fundamentos con avanzado aplicaciones android preferences classcastexception

programacion - ¿Cómo se declara el tipo de una preferencia de Android?



manual de android en pdf (3)

Tengo un preferences.xml que se ve así:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:name="Sample" android:enabled="true" android:persistent="true" android:summary="Sample" android:defaultValue="3.0" android:title="Sample" android:key="sample" /> </PreferenceScreen>

Cuando hago sp.getString ("muestra", "3.0"), funciona bien y devuelve una cadena, pero no debería ser una cadena, debería ser una flotación. La ejecución de sp.getFloat ("muestra", 3.0f) lanza una excepción ClassCastException porque es una cadena.

¿Qué debo poner en el XML para que la preferencia se almacene como un flotante?


Como mbaird señaló, no puedes obligar a almacenar como Float.

Pero puede cambiar EditTextPreference a una vista de Preference simple e implementar el evento click para ella. De esta manera, podrá crear y mostrar su propio cuadro de diálogo, para editar el valor, y así podrá restringir el formato y guardar como flotante en el archivo de preferencias.


En su xml de preferencias puede agregar una opción android:numeric con el valor "integer" . De esta manera, el usuario solo debe poder ingresar un valor entero válido.

Cuando cargue la configuración, debe intentar analizarla usted mismo a un número (ya que todos los valores se almacenan como Strings (@mbaird a continuación)):

try { float val = Float.parseFloat(sp.getString("sample", "3.0f")); } catch (NumberFormatException e) { // "sample" was not an integer value // You should probably start settings again }


Si está utilizando la API de pantalla de preferencias incorporada en lugar de escribir sus propios Diálogos de preferencias o Actividades, entonces será un poco limitado en algunos aspectos. Por ejemplo, EditTextPreference siempre almacenará el valor como una cadena.

Desde la API Doc :

Esta preferencia almacenará una cadena en las SharedPreferences.

Observo que no parece haber ninguna manera de restringir al usuario para que simplemente escriba un número de punto flotante válido en su campo de texto. ¿Qué harías si escribieran "abc"?