Android: Comment charger les valeurs par défaut lorsque l'utilisateur n'a pas utilisé l'écran préférences?

j'utilise une Préférenceactivité pour laisser l'utilisateur définir quelques valeurs. Je lui donne le fichier xml avec les préférences définies.

j'ai mis tout le android:defaultValue="" pour eux.

quand je démarre mon application, j'ai besoin des préférences, ou si elles ne sont pas encore définies manuellement, je veux les valeurs par défaut:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Toutefois, lorsque android:defaultValue="true" je reçois toujours false . Ainsi, il semble que les valeurs defaultfixées dans le XML ne sont utilisés nulle part sauf lors de l'initialisation de l'écran preferences -.

Je ne veux pas hardcode les valeurs par défaut dans la méthode getBoolean() . Alors, y a-t-il un moyen d'obtenir les valeurs par défaut avec seulement les définir en un seul endroit?

105
demandé sur Peterdk 2010-04-22 18:40:13

5 réponses

cette question est similaire à la mienne:

initialize-préférences-du-xml-en-main-de l'activité

il suffit D'utiliser ce code dans onCreate méthode:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

il chargera vos préférences à partir de XML, et le dernier paramètre ( readAgain ) garantira que les préférences de l'utilisateur ne seront pas écrasées.

jetez un oeil à PreferenceManager.setDefaultValues dans l'API Android pour complément d'enquête.

157
répondu pixel 2017-05-23 12:26:14

soyez conscient que si vous utilisez

getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

pour récupérer les préférences vous devez utiliser

PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

pour définir les valeurs par défaut!

par exemple:

PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

j'espère que cela peut aider quelqu'un.

27
répondu Francesco Vadicamo 2012-07-26 15:56:16

dans la réponse acceptée de Pixel:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

il est indiqué que le false signifie que les valeurs par défaut ne seront pas écrasées. Ce n'est pas ce qu'il fait, c'est juste une efficacité drapeau d'arrêter le traitement si votre application a plus qu'un seul point d'entrée. Malheureusement, le test n'est pas fait par fichier de préférence, donc si vous avez plus d'un fichier de préférence, vous devez coder true sur tous sauf le premier.

si vous êtes inquiet efficacité, vous pouvez coder quelque chose comme ça.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

si vous ajoutez plus de préférences partagées, il vous suffit de définir SPL à un nombre de huit.

12
répondu Steve Waring 2014-09-01 08:57:08

, Par exemple en étendant DialogPreference je fais ceci:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault peut être:

  • mContext.getResources().getString (attrs.getAttributeResourceValue (androidns,"defaultValue", 100));
  • quelque chose que vous avez indexé dans R.
2
répondu Macarse 2010-04-22 14:59:44

assurez-vous également que vous n'avez jamais utilisé les références partagées avant. Pour s'assurer qu'ils ne sont pas changés (ce qui signifie setDefaultValues(ceci,xml,false) n'a aucun effet) désinstallez votre application et téléchargez-la à nouveau pour être sûr qu'aucune valeur n'est touchée. Cela m'a aidé.

0
répondu wirthra 2016-11-30 15:36:02