web-dev-qa-db-fra.com

Comment puis-je obtenir les références partagées d'une PreferenceActivity sous Android?

J'utilise PreferenceActivity pour afficher certains paramètres de mon application. Je gonfle les paramètres via un fichier XML pour que ma méthode onCreate (et ses méthodes de classe complètes) ressemble à ceci:

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

Le javadoc de PréférenceActivité PreferenceFragment indique que

Ces préférences seront automatiquement enregistrées dans les préférences partagées au fur et à mesure que l'utilisateur interagira 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 la référence partagée dans une autre activité? Je peux seulement appeler

getSharedPreferences(name, mode)

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

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

Mettre à jour

Selon Préférences partagées | Android Tutoriel du développeur (partie 13) par Sai Geetha M N,

De nombreuses applications peuvent fournir un moyen de capturer les préférences de l'utilisateur sur les paramètres d'une application ou d'une activité spécifique. Pour 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" pour diverses activités dans une application (notez qu’il ne peut pas être partagé entre plusieurs processus). Ou ce peut être quelque chose qui doit être stocké spécifique à 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 d'activité gérée: ces préférences ne peuvent être utilisées qu'au sein d'une 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 méthode getSharedPreferences de la classe Context. 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 vous obtenez 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_PRIVATE est le mode de fonctionnement des préférences. C'est le 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_READABLE et MODE_WORLD_WRITEABLE. Dans MODE_WORLD_READABLE, une autre application peut lire le fichier créé mais ne peut pas le modifier. Dans le cas de MODE_WORLD_WRITEABLE, d'autres applications disposent également d'autorisations en é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 les valeurs dans le fichier de préférences SharedPreference.Editor, l’objet doit être utilisé. Editor est une interface imbriquée dans la classe SharedPreference.

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

Editor 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 si vous souhaitez que vos préférences d'activité soient privées, vous pouvez le faire à l'aide de la méthode getPreferences() de l'activité. La méthode getPreference utilise la méthode getSharedPreferences() 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 que dans le 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 telles que le stockage de l'état d'activité dans la base de données. Remarque Android contient également un package appelé Android.preference. Le paquet définit les classes pour implémenter l'interface utilisateur des préférences de l'application.

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

706
Pentium10

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

Android crée ce nom (éventuellement en fonction du nom du package de votre projet?). Vous pouvez l'obtenir en mettant le code suivant dans un SettingsActivityonCreate() et en voyant ce que preferencesName est.

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

La chaîne devrait être quelque chose comme com.example.projectname_preferences. Codez-le quelque part dans votre projet et transmettez-le à getSharedPreferences() et vous devriez être prêt à partir.

29
Green Oak Software

Déclarez ces méthodes d'abord ..

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 ceci quand vous voulez mettre un pref:

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

appelez ceci lorsque vous souhaitez obtenir un préf:

getPref("myKey", getApplicationContext());

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

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);
21
kc ochibili

le fait de devoir passer d’un contexte à un autre me gêne vraiment. le code devient trop bavard et ingérable. Je le fais 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;

de plus, toutes les clés 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 ceci dans une ligne de code

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
3
hamish

si vous avez une case à cocher et que vous souhaitez récupérer sa valeur, c’est-à-dire true/false dans n’importe quel fichier Java -

Utilisation--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
2
UrviG

Mis à jour en 2019

Vous pouvez simplement utiliser la bibliothèque PowerPreference

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érence spécifique

PowerPreference.getFileByName(fileName)

Écrire des données:

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

Obtenir des données

PowerPreference.getDefaultFile().getString(key,value)
0
Ali Asadi