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?
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.
Sachez que si vous utilisezgetSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)
pour récupérer les préférences que vous devez utiliserPreferenceManager.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.
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é.
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:
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é.