Question

Utilisation simple EditTextPreference dans mon activité préférences:

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

Est-il possible que cette valeur de configuration serait enregistrée en tant que nombre entier? Semble maintenant il permet simplement de saisir des chiffres, mais la valeur est encore enregistrée sous forme de chaîne:

Appel:

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

me jette java.lang.ClassCastException: java.lang.String, et:

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

récupère avec succès la valeur.

Comment faire PreferenceActivity pour enregistrer la valeur en entier par défaut?

Était-ce utile?

La solution

Vous pouvez étendre 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));
    }
}

Il serait préférable de remplacer les méthodes onSetInitialValue () et setText (), mais alors vous devez copier un code d'une classe de base. Au-dessus de la solution est plus simple, mais il est assez délicat - méthodes « string » faire quelque chose avec ints. Essayez de ne pas étendre cette autre classe; -)

Vous pouvez l'utiliser à partir de XML par:

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

Autres conseils

Même si vous définissez android: = numérique « entier » ce sera le texte préférence - comme son nom l'indique. Vous pouvez facilement convertir la valeur de chaîne à l'aide d'int Integer.valueOf (). Aussi, vous pouvez écraser PreferenceActivity faire automatiquement la conversion à la sortie.


Je pense que la meilleure solution est d'écrire méthode simple pour obtenir cette valeur des préférences. Quelque chose comme:

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

Ensuite, vous pouvez utiliser très facilement à partir de votre code.

Même si une réponse a été parquées accepté Je voudrais partager une façon plus courte pour atteindre cet objectif:

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

Puisque vous avez déjà établi que les chiffres peuvent être entrés ce ne sera pas par une exception. mais pour compléter ma réponse:

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

J'ai eu le même problème. (Je voulais SharedPreference me donner un numéro de port que je stocké dans un fichier xml préférences comme defaultValue).

La mise en œuvre de toutes les méthodes de SharedPreferences serait beaucoup d'efforts, l'écriture si une méthode personnalisée dans la classe instanciée les SharedPreferences, comme broot suggéré serait le mieux je pense.

Vous pouvez ainsi simplement utiliser la méthode statique entier dans la ligne où vous en avez besoin:

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

Je pense que c'est le plus que je pouvais venir avec:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top