Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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?

  • Preferencias de Android: Valores predeterminados incorrectos DESPITE "setDefaultValues"
  • Cómo establecer varios valores predeterminados en un MultiSelectListPreference?
  • Plugin ADT para Android no aparece en Eclipse
  • SpinnerPreference? (Cómo incrustar un Spinner en una pantalla de Preferencias)
  • ¿Cómo hacer que SharedPreferences de una PreferenceActivity esté configurada como predeterminada en Android?
  • Cómo establecer el valor predeterminado de un ListPreference
  • ¿Cómo puedo agregar por programación EditTextPreferences a mi PreferenceFragment?
  • ¿Es la lectura / escritura preferencias una operación costosa?
  • 4 Solutions collect form web for “PreferenciaActividad: guardar valor como entero”

    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")); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.