Comment puis-je obtenir les SharedPreferences d'une PreferenceActivity dans Android?

373

J'utilise une PreferenceActivity pour afficher certains paramètres de mon application. Je gonfle les paramètres via un fichier xml afin que mon onCreate (et les méthodes de classe complètes) ressemblent à ceci:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

Le javadoc de PreferenceActivity PreferenceFragment déclare que

Ces préférences seront automatiquement enregistrées dans SharedPreferences à mesure que l'utilisateur interagit avec elles. Pour récupérer une instance de SharedPreferences que la hiérarchie des préférences de cette activité utilisera, appelez getDefaultSharedPreferences (android.content.Context) avec un contexte dans le même package que cette activité.

Mais comment puis-je obtenir le nom de SharedPreference dans une autre activité? Je peux seulement appeler

getSharedPreferences(name, mode)

dans l'autre activité, mais j'ai besoin du nom de SharedPreference qui a été utilisé par PreferenceActivity. Quel est le nom ou comment puis-je le récupérer?

Dave
la source

Réponses:

721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Mise à jour

Selon les préférences partagées | Tutoriel pour les développeurs Android (partie 13) par Sai Geetha MN,

De nombreuses applications peuvent fournir un moyen de capturer les préférences des utilisateurs sur les paramètres d'une application ou d'une activité spécifique. Pour prendre en charge cela, Android fournit un ensemble simple d'API.

Les préférences sont généralement des paires nom / valeur. Ils peuvent être stockés en tant que «Préférences partagées» dans diverses activités d'une application (notez qu'il ne peut actuellement pas être partagé entre les processus). Ou cela peut être quelque chose qui doit être stocké spécifiquement pour une activité.

  1. Préférences partagées: Les préférences partagées peuvent être utilisées par tous les composants (activités, services, etc.) des applications.

  2. Préférences gérées par l'activité: ces préférences ne peuvent être utilisées que dans l'activité particulière et ne peuvent pas être utilisées par d'autres composants de l'application.

Préférences partagées:

Les préférences partagées sont gérées à l'aide de la getSharedPreferencesméthode de la Contextclasse. Les préférences sont stockées dans un fichier par défaut (1) ou vous pouvez spécifier un nom de fichier (2) à utiliser pour faire référence aux préférences.

(1) La méthode recommandée consiste à utiliser le mode par défaut, sans spécifier le nom du fichier

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Voici comment obtenir l'instance lorsque vous spécifiez le nom du fichier

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATEest le mode de fonctionnement des préférences. Il s'agit du mode par défaut et signifie que le fichier créé sera accessible uniquement par l'application appelante. Les deux autres modes pris en charge sont MODE_WORLD_READABLEet MODE_WORLD_WRITEABLE. Dans une MODE_WORLD_READABLEautre application, vous pouvez lire le fichier créé mais ne pouvez pas le modifier. Dans le cas d' MODE_WORLD_WRITEABLEautres applications, vous disposez également d'autorisations d'écriture pour le fichier créé.

Enfin, une fois que vous avez l'instance de préférences, voici comment vous pouvez récupérer les valeurs stockées à partir des préférences:

int storedPreference = preferences.getInt("storedInt", 0);

Pour stocker des valeurs dans le fichier de préférences, l' SharedPreference.Editorobjet doit être utilisé. Editorest une interface imbriquée dans la SharedPreferenceclasse.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

L'éditeur prend également en charge des méthodes telles que remove()et clear()pour supprimer les valeurs de préférence du fichier.

Préférences d'activité:

Les préférences partagées peuvent être utilisées par d'autres composants d'application. Mais si vous n'avez pas besoin de partager les préférences avec d'autres composants et que vous souhaitez avoir des préférences privées d'activité, vous pouvez le faire à l'aide de la getPreferences()méthode de l'activité. La getPreferenceméthode utilise la getSharedPreferences()méthode avec le nom de la classe d'activité pour le nom du fichier de préférences.

Voici le code pour obtenir les préférences

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

Le code pour stocker les valeurs est également le même qu'en cas de préférences partagées.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Vous pouvez également utiliser d'autres méthodes comme le stockage de l'état d'activité dans la base de données. Remarque Android contient également un package appelé android.preference. Le package définit des classes pour implémenter l'interface utilisateur des préférences d'application.

Pour voir d'autres exemples, consultez le post de stockage de données d'Android sur le site des développeurs.

Pentium10
la source
55
+1: vous avez sauvé ma journée .. aucun des tutoriels / exemples sur Internet n'en parle. tout ce qu'ils parlent des fonctionnalités et des personnalisations, mais pas comment les lire.
ankitjaininfo
1
Voir ma mise à jour de la réponse, et le nom de fichier ressemble à quelque chose package.prefsmais je ne suis pas sûr.
Pentium10
1
Merci pour le code. Il y a juste une petite chose qui me déroute: SharedPreference est une interface, alors où est le code réel implémenté qui gère les appels de méthode?
x1886x
1
J'aimerais avoir lu ceci une semaine avant de perdre mon temps à lire des réponses / commentaires de nerds stupides partout dans SE, qui pensent savoir quand ils ne le font pas vraiment. Merci @ Pentium10, possédez-vous un blog, merci encore, appréciez-le vraiment :)
Sanjeevcn
1
Au lieu d'utiliser editor.commit (), vous pouvez également utiliser editor.apply (). La différence est que commit () écrit vos modifications de manière synchrone et applique les écrit de manière asynchrone. Cela rend votre interface utilisateur plus rapide.
Hashim Akhtar
29

Si vous n'y avez pas accès getDefaultSharedPreferenes(), vous pouvez utiliser à la getSharedPreferences(name, mode)place, il vous suffit de saisir le bon nom.

Android crée ce nom (éventuellement basé sur le nom du package de votre projet?). Vous pouvez l'obtenir en mettant le code suivant dans un SettingsActivity onCreate(), et en voyant ce qui preferencesNameest.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

La chaîne doit ressembler à quelque chose com.example.projectname_preferences. Codez en dur quelque part dans votre projet, et passez-le getSharedPreferences()et vous devriez être prêt à partir.

Logiciel Green Oak
la source
1
La source de l'activité se lit comme suit: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize
22

Déclarez d'abord ces méthodes.

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Appelez ensuite cela lorsque vous souhaitez mettre un pref:

putPref("myKey", "mystring", getApplicationContext());

appelez cela quand vous voulez obtenir un pref:

getPref("myKey", getApplicationContext());

Ou vous pouvez utiliser cet objet https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo qui simplifie encore plus tout

Exemple:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);
kc ochibili
la source
Pourquoi ne pas utiliser editor.apply (); au lieu de valider pour le traitement en arrière
Avi Parshan
4

devoir passer le contexte partout me dérange vraiment. le code devient trop verbeux et ingérable. Je fais cela dans chaque projet à la place ...

public class global {
    public static Activity globalContext = null;

et le définir dans l'activité principale créer

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

toutes les touches de préférence doivent être indépendantes de la langue, je suis choqué que personne ne l’ait mentionné.

getText(R.string.yourPrefKeyName).toString()

maintenant appelez-le très simplement comme ça dans une ligne de code

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
hamish
la source
4
Quel est l'avantage de rendre le langage des clés indépendant? Ils ne sont jamais montrés à l'utilisateur, non?
Gerd
1
S'il vous plaît, pour l'amour de Dieu, n'utilisez jamais une activité comme contexte global. Si vous devez utiliser un contexte global, veuillez le faire en utilisant une classe d'application personnalisée.
Thorben
1
@Thorben a accepté. Ou tout simplementgetApplicationContext()
OneCricketeer
3

si vous avez une case à cocher et que vous souhaitez récupérer sa valeur, c'est-à-dire vrai / faux dans n'importe quel fichier java--

Utilisation--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
UrviG
la source
0

Mise à jour 2019

Vous pouvez simplement utiliser la PowerPreferencebibliothèque

https://github.com/AliEsaAssadi/Android-Power-Preference

Obtenir une instance de préférence partagée

Pour obtenir l'instance par défaut, il vous suffit d'appeler

PowerPreference.getDefaultFile()

Ou si vous voulez un fichier de préférences spécifique

PowerPreference.getFileByName(fileName)

Écriture des données:

PowerPreference.getDefaultFile().put(key,value)

Obtention de données

PowerPreference.getDefaultFile().getString(key,value)
Ali Asadi
la source
Comment PowerPreference gère-t-il la partie contextuelle? Un contexte est nécessaire pour lire les préférences partagées, non? Je suis nouveau sur Android et j'essaie de comprendre.
Yeti
0

Essayez de suivre le code source, cela a fonctionné pour moi

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Istiak
la source