2010-03-16 32 views
26

Tengo un preferences.xml que tiene este aspecto:¿Cómo se declara el tipo de una preferencia de Android?

<?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"), que funciona bien y devuelve una cadena, pero no debe ser una cuerda, debería ser un flotador. La ejecución de sp.getFloat ("muestra", 3.0f) arroja una ClassCastException porque es una cadena.

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

Respuesta

10

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

De the API Doc:

Esta preferencia se almacenar una cadena en los SharedPreferences.

Observo que no parece que haya ninguna forma de restringir al usuario a simplemente escribir un número de coma flotante válido en su campo de texto. ¿Qué harías si escribieran "abc"?

4

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

Pero se puede cambiar el EditTextPreference a un Preference la vista, y poner en marcha el evento click por ello. De esta forma, podrá crear y mostrar su propio cuadro de diálogo, para editar el valor, y así podrá restringir el formato y guardarlo como Float en el archivo de preferencias.

42

En sus preferencias xml puede agregar una opción android:numeric con el valor "integer". De esta forma, el usuario solo debería poder ingresar un valor entero válido.

Al cargar el ajuste que debe tratar de analizar a un número usted mismo (ya que todos los valores se almacenan como Strings (@mbaird abajo)):

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 
} 
+0

esto funciona. Gracias. – Gubatron

+3

Parece que funciona, a pesar de que Eclipse no ofrece Intellisense para la parte "android: numérica" ​​... por lo tanto, nunca hubiera pensado en eso, ¡gracias! – Select0r

+0

esto funciona bien. No estoy confiando en la entrada del usuario, sino en una lista que hace referencia a flotadores de cuerda. Muy fácil de hacer y fácil de manejar. – Nlinscott

Cuestiones relacionadas