PreferenciaActividad: guardar valor como entero

Uso de una EditTextPreference simple en mi actividad de preferencias:

 <EditTextPreference android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

¿Hay alguna manera de que este valor de configuración se guardaría como entero? Parece que ahora sólo permite introducir números, pero el valor aún se guarda como cadena:

Vocación:

 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); int value = preferences.getInt("SomeKey", -1); 

Me lanza java.lang.ClassCastException: java.lang.String y:

 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String value = preferences.getString("SomeKey", "-1"); 

Recupera el valor correctamente.

¿Cómo hacer que PreferenceActivity ahorre valor como entero por defecto?

Podría extender EditTextPreference:

 public class IntEditTextPreference extends EditTextPreference { public IntEditTextPreference(Context context) { super(context); } public IntEditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected String getPersistedString(String defaultReturnValue) { return String.valueOf(getPersistedInt(-1)); } @Override protected boolean persistString(String value) { return persistInt(Integer.valueOf(value)); } } 

Sería mejor sobrescribir métodos onSetInitialValue () y setText (), pero entonces tendrías que copiar algún código de una clase base. Por encima de la solución es más simple, pero es bastante difícil – los métodos de "cadena" hacer algo con ints. Trate de no extender esta clase más 😉

Usted podría utilizarlo de XML por:

 <package.name.IntEditTextPreference android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

Incluso si usted fija android: numeric = "entero" será la preferencia del texto – como su nombre sugiere. Podría convertir fácilmente valor de cadena a int usando Integer.valueOf (). También puede sobrescribir PreferenceActivity para hacer la conversión automáticamente al salir.


Creo que la mejor solución es escribir un método simple para obtener este valor de las preferencias. Algo como:

 public static int getSomePref(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String value = prefs.getString("SomeKey", null); return value == null ? -1 : Integer.valueOf(value); } 

Entonces usted podría muy fácilmente utilizarlo de su código.

A pesar de que una respuesta ha sido aceptada estacionada me gustaría compartir una manera más corta para lograr esto:

 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); int value = Integer.parseInt(preferences.getString("SomeKey", "-1")); 

Dado que ya ha establecido que sólo se pueden introducir números, esto no ocurrirá a través de ninguna excepción. Sin embargo, para completar mi respuesta:

 <EditTextPref android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 

Yo tuve el mismo problema. (Yo quería SharedPreference para darme un número de puerto que i almacenado en un archivo xml de preferencias como defaultValue).

La implementación de todos los métodos SharedPreferences sería mucho esfuerzo, por lo que escribir un método personalizado en la clase que instanció el SharedPreferences, como sugería broot sería mejor creo.

También puede utilizar el método estático de entero en la línea donde lo necesita:

 int number = Integer.valueOf(settings.getString("myNumberString", "0")); 
  • Android registerOnSharedPreferenceChangeListener () causa bloqueo en una vista personalizada
  • Android: ¿cómo obtener la lista de todas las preferencias xml para mi aplicación y leerlas?
  • ¿Cómo obtener preferencias de tono en tiempo de ejecución?
  • ¿cómo puedo establecer el valor marcado en ListPreference
  • Actualizar el elemento de preferencia existente en una PreferenciaActividad al regresar de una (sub) PreferenciaScreen
  • Disposición de la pantalla de preferencias de Android
  • ¿Cuál es la diferencia entre las entradas y los valores de entrada en android listPreferences xml?
  • Uso de preferencias no predeterminadas en PreferenceActivity
  • Método RingtonePreference getEntry
  • Pantalla de Preferencias de Android sin XML
  • ¿Dónde debe llamar a PreferenceManager.setDefaultValues?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.