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?
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.
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.
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.
, 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.
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é.