web-dev-qa-db-fra.com

PreferenceActivity: enregistrer la valeur sous forme d'entier

Utiliser une simple EditTextPreference dans mes activités de préférences:

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

Existe-t-il un moyen de sauvegarder cette valeur de configuration sous forme d’entier? Semble maintenant que cela permet simplement de saisir des nombres, mais la valeur est toujours 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 la valeur avec succès.

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

49
Laimoncijus

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 vous devrez alors copier du code à partir d'une classe de base. La solution ci-dessus est plus simple, mais elle est assez compliquée: les méthodes "string" font quelque chose avec ints. Essayez de ne pas prolonger cette classe plus loin ;-)

Vous pouvez l'utiliser à partir de XML en:

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

Même si vous définissez Android: numeric = "entier", ce sera la préférence du texte - comme son nom l'indique. Vous pouvez facilement convertir une valeur de chaîne en int en utilisant Integer.valueOf (). Vous pouvez également écraser PreferenceActivity pour effectuer la conversion automatiquement à la sortie.


Je pense que la meilleure solution consiste à écrire une méthode simple pour obtenir cette valeur à partir 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 très facilement l'utiliser à partir de votre code.

7
broot

Même si une réponse a été parquée acceptée, j'aimerais partager un autre moyen plus rapide pour y parvenir:

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

Etant donné que vous avez déjà défini que seuls des nombres peuvent être entrés, cela ne passera par aucune 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" />
4
Arnab Jain

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

L'implémentation de toutes les méthodes SharedPreferences représenterait un effort considérable. Il est donc préférable, à mon avis, d'écrire une méthode personnalisée dans la classe qui instancie les SharedPreferences, comme suggéré par broot .

Vous pouvez également simplement utiliser la méthode statique d'Integer dans la ligne où vous en avez besoin:

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

Je pense que c'est le plus court que j'ai pu trouver:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
0
Jadeye