studio ejemplo activity android sharedpreferences preferenceactivity

ejemplo - shared preference android



PreferenceActivity: guarda el valor como entero (4)

A pesar de que se ha estacionado una Respuesta, me gustaría compartir una forma más corta de lograrlo:

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

Como ya ha establecido que solo se pueden ingresar números, esto no ocurrirá por ninguna excepción. aún para completar mi respuesta:

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

Usando un simple EditTextPreference 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 guarde como entero? Parece que ahora solo permite ingresar números, pero el valor aún se guarda como una 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 con éxito.

¿Cómo hacer PreferenceActivity para guardar el valor como entero de forma predeterminada?


Incluso si configuras android: numeric = "integer" será preferencia de texto, como sugiere su nombre. Puede convertir fácilmente el valor de cadena a int utilizando 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 podrías usarlo fácilmente desde tu código.


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 los métodos onSetInitialValue () y setText (), pero luego tendría que copiar algo de código de una clase base. La solución anterior es más simple, pero es bastante complicada: los métodos de "cadena" hacen algo con los ints. Intenta no extender más esta clase ;-)

Podrías usarlo desde XML por:

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


Yo tuve el mismo problema. (Quería que SharedPreference me diera un número de puerto que almacené en un archivo xml de preferencias como valor predeterminado).

Implementar todos los métodos de SharedPreferences sería un gran esfuerzo, por lo que que lo mejor sería escribir un método personalizado en la clase que instaló las SharedPreferences.

También puede usar el método estático de Integer en la línea donde lo necesite:

int number = Integer.valueOf(settings.getString("myNumberString", "0"));