web-dev-qa-db-fra.com

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

J'utilise PreferenceActivity pour permettre à l'utilisateur de définir certaines valeurs . Je lui envoie le fichier XML avec les préférences définies.

J'ai mis tous les Android:defaultValue="" pour eux.

Lorsque je lance 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); 

Cependant, quand Android:defaultValue="true" je reçois toujours false. Il semble donc que les valeurs par défaut définies dans le fichier XML ne soient utilisées que lors de l’initialisation de l’écran des préférences.

Je ne veux pas coder en dur les valeurs par défaut dans la méthode getBoolean(). Alors, y a-t-il un moyen d'obtenir les valeurs par défaut en ne les définissant qu'à un seul endroit?

108
Peterdk

cette question est semblable à la mienne:

initialize-preferences-from-xml-in-main-activity

Utilisez simplement ce code dans la méthode onCreate:

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

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

Jetez un coup d’œil dans PreferenceManager.setDefaultValues ​​ dans l’API Android pour une enquête plus approfondie.

159
pixel

Sachez que si vous utilisez
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

pour récupérer les préférences que 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
Francesco Vadicamo

dans la réponse acceptée de Pixel:

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

il est indiqué que false signifie que les valeurs par défaut ne seront pas écrasées. Ce n'est pas ce qu'il fait, c'est juste un indicateur d'efficacité pour arrêter l'analyse si votre application a plus d'un point d'entrée. Malheureusement, le test n’est pas effectué par fichier de préférences. Par conséquent, si vous avez plusieurs fichiers de préférences, vous devez coder true sur tout le premier.

Si vous êtes préoccupé par l'efficacité, vous pouvez coder quelque chose comme ceci.

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 d'autres préférences partagées, définissez simplement SPL sur un nombre élevé.

12
Steve Waring

Par exemple, étendre 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 (Android, "valeur par défaut", 100));
  • quelque chose que vous avez répertorié dans R.
2
Macarse

Assurez-vous également que vous n'avez jamais utilisé les SharedPreferences auparavant. Pour vous assurer qu'ils ne sont pas modifiés (ce qui signifie que setDefaultValues ​​(this, xml, false) n'a aucun effet), désinstallez votre application et transférez-la à nouveau pour vous assurer qu'aucune valeur n'est touchée. Cela m'a aidé.

0
wirthra